一、简介

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列表的更多相关文章

  1. C# Redis学习系列三:Redis配置主从

    Redis配置主从 主IP :端口      192.168.0.103 6666 从IP:端口       192.168.0.108 3333 配置从库 (1)安装服务: redis-server ...

  2. 分布式缓存技术redis学习系列(四)——redis高级应用(集群搭建、集群分区原理、集群操作)

    本文是redis学习系列的第四篇,前面我们学习了redis的数据结构和一些高级特性,点击下面链接可回看 <详细讲解redis数据结构(内存模型)以及常用命令> <redis高级应用( ...

  3. Python操作redis学习系列之(集合)set,redis set详解 (六)

    # -*- coding: utf-8 -*- import redis r = redis.Redis(host=") 1. Sadd 命令将一个或多个成员元素加入到集合中,已经存在于集合 ...

  4. 分布式缓存技术redis学习系列(五)——redis实战(redis与spring整合,分布式锁实现)

    本文是redis学习系列的第五篇,点击下面链接可回看系列文章 <redis简介以及linux上的安装> <详细讲解redis数据结构(内存模型)以及常用命令> <redi ...

  5. Android学习系列(15)--App列表之游标ListView(索引ListView)

    游标ListView,提供索引标签,使用户能够快速定位列表项.      也可以叫索引ListView,有的人称也为Tweaked ListView,可能更形象些吧.      一看图啥都懂了: 1. ...

  6. 分布式缓存技术redis学习系列

    分布式缓存技术redis学习系列(一)--redis简介以及linux上的安装以及操作redis问题整理 分布式缓存技术redis学习系列(二)--详细讲解redis数据结构(内存模型)以及常用命令 ...

  7. scrapy爬虫学习系列三:scrapy部署到scrapyhub上

    系列文章列表: scrapy爬虫学习系列一:scrapy爬虫环境的准备:      http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_python_00 ...

  8. Android学习系列(11)--App列表之拖拽ListView(下)

    接着上篇Android学习系列(10)--App列表之拖拽ListView(上)我们继续实现ListView的拖拽效果. 7.重写onTouchEvent()方法.     在这个方法中我们主要是处理 ...

  9. redis学习教程三《发送订阅、事务、连接》

    redis学习教程三<发送订阅.事务.连接>  一:发送订阅      Redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息.Redi ...

随机推荐

  1. 安卓TP驱动开发

    转自 blog.csdn.net/dddxxxx/article/details/54312415

  2. Typecho 二次开发文档链接

    快速入门模板入门 模板制作快速入门推荐目录结构 Typecho模板的推荐页面构成模板文件说明 Typecho主题制作文件结构 页面制作制作functions文件: Typecho的functions. ...

  3. 主机网络ping: unknown host baidu.com问题解决

    本机环境: 系统:Centos 网络:NAT 虚拟机之前一直都可以连外网,但最近不能连了,现状如下: [root@vhost03 ~]# ping baidu.comping: unknown hos ...

  4. 1.2.1继承Thread类

    实现多线程的方法有2种:方法一是继承Thread,方法二是实现Runnerable接口 使用继承Thread类的方法创建多线程的时候,最大的局限性就是不支持多继承,因为java语言的特点就是单继承,因 ...

  5. Ng第十二课:支持向量机(Support Vector Machines)(三)

    11 SMO优化算法(Sequential minimal optimization) SMO算法由Microsoft Research的John C. Platt在1998年提出,并成为最快的二次规 ...

  6. 如何对CentOS FTP服务配置

    根据很多人对CentOS FTP服务的不解,我觉得应该对CentOS FTP服务做出一定的解释. 1.安装 一般在CentOS上都自动安装了vsftd,若没有安装则可以使用以下步骤进行安装yum -y ...

  7. kepware http接口 javascript开发

    读取某变量的值(jquery var settings = { "async": true, "crossDomain": true, "url&qu ...

  8. 马士兵hibernate(原始笔记)

    马士兵hibernate(原始笔记) 课程内容 1        HelloWorld a)   Xml b)   annotation 2        Hibernate原理模拟 - 什么是O/R ...

  9. EBADF, read

    nodejs读取文件出的一个错误,解决不了,自己技术还达不到,解决不了这么高深的问题. 描述:需要记录访问的人数,每个人随机到的酒.打算用json文件来存储:read count write coun ...

  10. bzoj网络流

    近期看了一些bzoj的网络流,深感智商不够.不过对于网络流又有了进一步的理解. 还是mark一下吧. 献上几篇论文:1)<最小割模型在信息学竞赛中的应用> 2)<浅析一类最小割问题& ...