一、简介

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. Linux无法解析gitlib的地址--修改dns

    搞的一个js鉴权认证,先跳转到 gitlib,登录后跳转到我们公司测试接口的页面: 公司gitlib地址:gitlab.cmread.com [INFO][2018-12-17 15:29:00,18 ...

  2. IntelliJ IDEA 2017版 spring-boot2.0.4+mybatis 自动部署的细节问题

    一.加载pom依赖包 <!--spring-boot开发热部署--> <dependency> <groupId>org.springframework.boot& ...

  3. Day1-python基础-变量常量

    不积跬步无以至千里 补充上一节字符串的内容: 字符串格式化输出: name = input("name>>") print("My name is %s&qu ...

  4. 【1】jQuery异步(Ajax)操作之JSONP [转]

     前言: 说到AJAX就会不可避免的面临两个问题,第一个是AJAX以何种格式来交换数据?第二个是跨域的需求如何解决?这两个问题目前都有不同的解决方案,比如数据可以用自定义字符串或者用XML来描述,跨域 ...

  5. js基础学习笔记(二)

    2.1  输出内容(document.write) document.write() 可用于直接向 HTML 输出流写内容.简单的说就是直接在网页中输出内容. 第一种:输出内容用“”括起,直接输出&q ...

  6. python基于matplotlib绘图

    import math import numpy as np import matplotlib.pyplot as plt from matplotlib.font_manager import F ...

  7. uwsgi_read_timeout超时处理

    最近发现一服务器一个奇怪的现象: Django的视图函数在浏览器一个请求的情况下,竟然做了两个请求的函数处理.不可思议,找了几天也不知道为什么, 只发现只要用uwsgi_read_timeout之后, ...

  8. POJ2139--Six Degrees of Cowvin Bacon(最简单Floyd)

    The cows have been making movies lately, so they are ready to play a variant of the famous game &quo ...

  9. javascript 模块化编程

    The module pattern is a common JavaScript coding pattern. It’s generally well understood, but there ...

  10. iOS处理视图上同时添加单击与双击手势的冲突问题

    _bgView.userInteractionEnabled = YES; //在cell上添加 bgView,给bgView添加两个手势检测方法 UITapGestureRecognizer *do ...