Redis学习系列三List列表
一、简介
Redis中的列表相当于C#中的LinkedList,也就是链表,如果你研究过链表这个数据结构,肯定知道.它的插入和删除是非常快的,但是定位却很慢,因为必须遍历所有的元素,才能找到对应的值,所以当你需要对列表进行统计的时候,建立跑后台服务去做,而不是使用Redis去遍历,因为开销很大.
Redis中的列表.常用来做异步队列,将需要延后处理的任务对象序列化成字符串,追加到Redis中的列表中,另外开启一个线程,或者后台服务,去消费这个列表进行数据处理.
注:链表其实和我前面的随笔中的链式编程很像,但是Redis中的是双向链表.
注:本文所有的代码在前面的随笔基础上进行扩展
二、列表的用途
列表的先进先出的数据结构,虽然它也可以先进后出,但是不推荐使用.
C#控制台代码如下:
扩展RedisClient.cs的代码,添加几个扩展方法,如下:
/// <summary>
/// 异步在指定索引处,添加一个值
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <param name="index">目标索引</param>
/// <returns></returns>
public static async Task ListSetByIndexAsync(RedisKey key, RedisValue value,long index)
{
var db = GetDatabase();
await db.ListSetByIndexAsync(key, index, value);
} /// <summary>
/// 异步向列表的右边追加多个值
/// </summary>
/// <param name="key"></param>
/// <param name=""></param>
/// <param name="index"></param>
/// <returns></returns>
public static async Task<long> ListRightPushAsync(RedisKey key, RedisValue[] value)
{
var db = GetDatabase();
return await db.ListRightPushAsync(key, value);
} /// <summary>
/// 异步获取列表最左边的值
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <returns></returns>
public static async Task<RedisValue> ListLeftPopAsync(RedisKey key)
{
var db = GetDatabase();
return await db.ListLeftPopAsync(key);
} /// <summary>
/// 异步获取链表的长度
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public static async Task<long> ListLengthAsync(RedisKey key)
{
var db = GetDatabase();
return await db.ListLengthAsync(key);
}
Program.cs 代码如下:
class Program
{
static Program()
{
//链式配置Redis
AppConfiguration.Current.ConfigureRedis<RedisConfig>();
} static void Main(string[] args)
{
StringSetGetAsync();
Console.ReadKey();
} static async void StringSetGetAsync()
{
try
{
var key = "列表键值";
var count=await RedisClient.ListRightPushAsync(key, new RedisValue[] {"C#",".Net","TPL",".Net Core2.0" });
Console.WriteLine("向键为'列表键值'的列表成功添加了{0}条记录", count); //模拟消费者,每次取左边一个消费
var listLength =await RedisClient.ListLengthAsync(key); //不存在线程安全问题,注意这里如果使用Parallel去消费list会存在排序问题,我这边已经重现了这个问题
for (var i = ; i < listLength; i++)
{
var item = await RedisClient.ListLeftPopAsync(key);
Console.WriteLine(item);
}
}
catch (Exception)
{
//记录日志
Console.WriteLine("Redis,使用异常");
} }
}

注:这里我只使用了少量元素,进行测试,如果要测试并发问题,可以将元素继续增加,然后观察结果,这里我就不演示了.
三、注意点
个人觉得列表,上面这种用法掌握就ok了,其它涉及到索引计算,或者获取所有的列表元素等操作,都不建议使用.因为复杂度过高一般为O(n),内存等问题的影响.如果真要做,建议使用后台服务去做,在访问低谷期去做.
Redis学习系列三List列表的更多相关文章
- C# Redis学习系列三:Redis配置主从
Redis配置主从 主IP :端口 192.168.0.103 6666 从IP:端口 192.168.0.108 3333 配置从库 (1)安装服务: redis-server ...
- 分布式缓存技术redis学习系列(四)——redis高级应用(集群搭建、集群分区原理、集群操作)
本文是redis学习系列的第四篇,前面我们学习了redis的数据结构和一些高级特性,点击下面链接可回看 <详细讲解redis数据结构(内存模型)以及常用命令> <redis高级应用( ...
- Python操作redis学习系列之(集合)set,redis set详解 (六)
# -*- coding: utf-8 -*- import redis r = redis.Redis(host=") 1. Sadd 命令将一个或多个成员元素加入到集合中,已经存在于集合 ...
- 分布式缓存技术redis学习系列(五)——redis实战(redis与spring整合,分布式锁实现)
本文是redis学习系列的第五篇,点击下面链接可回看系列文章 <redis简介以及linux上的安装> <详细讲解redis数据结构(内存模型)以及常用命令> <redi ...
- Android学习系列(15)--App列表之游标ListView(索引ListView)
游标ListView,提供索引标签,使用户能够快速定位列表项. 也可以叫索引ListView,有的人称也为Tweaked ListView,可能更形象些吧. 一看图啥都懂了: 1. ...
- 分布式缓存技术redis学习系列
分布式缓存技术redis学习系列(一)--redis简介以及linux上的安装以及操作redis问题整理 分布式缓存技术redis学习系列(二)--详细讲解redis数据结构(内存模型)以及常用命令 ...
- scrapy爬虫学习系列三:scrapy部署到scrapyhub上
系列文章列表: scrapy爬虫学习系列一:scrapy爬虫环境的准备: http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_python_00 ...
- Android学习系列(11)--App列表之拖拽ListView(下)
接着上篇Android学习系列(10)--App列表之拖拽ListView(上)我们继续实现ListView的拖拽效果. 7.重写onTouchEvent()方法. 在这个方法中我们主要是处理 ...
- redis学习教程三《发送订阅、事务、连接》
redis学习教程三<发送订阅.事务.连接> 一:发送订阅 Redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息.Redi ...
随机推荐
- mybatis xml中的大于、小于等符号写法
xml特殊符号转义写法 < < > > <> <> & & ' ...
- vue中$route 和$router的区别
在vue中会出现一种情况 const url=this.$route.query.returnURL; this.$router.push(url); $router和$route的区别傻傻的分 ...
- 调试问题集之——Max10中配置完成后程序不能运行
CONF_DONE信号是一个双向信号并且是Open-Drain.在配置过程中和配置之前作为输出,且为低电平.配置完成之后CONF_DONE作为输入脚,因为Open-Drain,所以必须由外部拉高,但二 ...
- 07-css的继承性和层叠性
css有两大特性:继承性和层叠性 继承性 面向对象语言都会存在继承的概念,在面向对象语言中,继承的特点:继承了父类的属性和方法.那么我们现在主要研究css,css就是在设置属性的.不会牵扯到方法的层面 ...
- C/C++ %s %d %u 基本概念与用法
%d 十进制有符号整数 %u 十进制无符号整数 %f 浮点数 %s 字符串 %c 单个字符 %p 指针的值 %e 指数形式的浮点数 %x, %X 无符号以十六进制表示的整数 %0 无符号以八进制表示的 ...
- JQuery EasyUI 1.5.1 美化主题大包
https://my.oschina.net/magicweng/blog/833266
- python advanced programming ( I )
函数式编程 函数是Python内建支持的一种封装,通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计的基 ...
- 2018-03-13 HTTP Socket TCP学习
协议学习: https://www.jianshu.com/p/a5410f895d6b https://www.jianshu.com/p/42260a2575f8 实际例子: nano实际例子,和 ...
- _编程语言_C++_宏定义#define 和 常量const 的区别
C++中有两种定义常量的方式:#define预处理和const关键字 #define 预处理指令 #include <iostream> using namespace std; #def ...
- Linux 禁ping和开启ping操作
方法一: # echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all 如果要恢复,只要: # echo 0 > /proc/sys/net ...