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 ...
随机推荐
- Linux无法解析gitlib的地址--修改dns
搞的一个js鉴权认证,先跳转到 gitlib,登录后跳转到我们公司测试接口的页面: 公司gitlib地址:gitlab.cmread.com [INFO][2018-12-17 15:29:00,18 ...
- IntelliJ IDEA 2017版 spring-boot2.0.4+mybatis 自动部署的细节问题
一.加载pom依赖包 <!--spring-boot开发热部署--> <dependency> <groupId>org.springframework.boot& ...
- Day1-python基础-变量常量
不积跬步无以至千里 补充上一节字符串的内容: 字符串格式化输出: name = input("name>>") print("My name is %s&qu ...
- 【1】jQuery异步(Ajax)操作之JSONP [转]
前言: 说到AJAX就会不可避免的面临两个问题,第一个是AJAX以何种格式来交换数据?第二个是跨域的需求如何解决?这两个问题目前都有不同的解决方案,比如数据可以用自定义字符串或者用XML来描述,跨域 ...
- js基础学习笔记(二)
2.1 输出内容(document.write) document.write() 可用于直接向 HTML 输出流写内容.简单的说就是直接在网页中输出内容. 第一种:输出内容用“”括起,直接输出&q ...
- python基于matplotlib绘图
import math import numpy as np import matplotlib.pyplot as plt from matplotlib.font_manager import F ...
- uwsgi_read_timeout超时处理
最近发现一服务器一个奇怪的现象: Django的视图函数在浏览器一个请求的情况下,竟然做了两个请求的函数处理.不可思议,找了几天也不知道为什么, 只发现只要用uwsgi_read_timeout之后, ...
- 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 ...
- javascript 模块化编程
The module pattern is a common JavaScript coding pattern. It’s generally well understood, but there ...
- iOS处理视图上同时添加单击与双击手势的冲突问题
_bgView.userInteractionEnabled = YES; //在cell上添加 bgView,给bgView添加两个手势检测方法 UITapGestureRecognizer *do ...