您现在的位置是:网站首页> 编程资料编程资料
详解Redis中的List类型_Redis_
2023-05-27
595人已围观
简介 详解Redis中的List类型_Redis_
本系列将和大家分享Redis分布式缓存,本章主要简单介绍下Redis中的List类型,以及如何使用Redis解决博客数据分页、生产者消费者模型和发布订阅等问题。
Redis List的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,Redis内部的很多实现,包括发送缓冲队列等也都是用这个数据结构。
List类型主要用于队列和栈,先进先出,后进先出等。
存储形式:key--LinkList
首先先给大家Show一波Redis中与List类型相关的API:
using System; using System.Collections.Generic; using ServiceStack.Redis; namespace TianYa.Redis.Service { ////// Redis List的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销, /// Redis内部的很多实现,包括发送缓冲队列等也都是用这个数据结构。 /// public class RedisListService : RedisBase { #region Queue队列(先进先出) ////// 入队 /// /// 集合Id /// 入队的值 public void EnqueueItemOnList(string listId, string value) { base._redisClient.EnqueueItemOnList(listId, value); } ////// 出队 /// /// 集合Id ///出队的值 public string DequeueItemFromList(string listId) { return base._redisClient.DequeueItemFromList(listId); } ////// 出队(阻塞) /// /// 集合Id /// 阻塞时间(超时时间) ///出队的值 public string BlockingDequeueItemFromList(string listId, TimeSpan? timeOut) { return base._redisClient.BlockingDequeueItemFromList(listId, timeOut); } ////// 从多个list中出队(阻塞) /// /// 集合Id /// 阻塞时间(超时时间) ///返回出队的 listId & Item public ItemRef BlockingDequeueItemFromLists(string[] listIds, TimeSpan? timeOut) { return base._redisClient.BlockingDequeueItemFromLists(listIds, timeOut); } #endregion Queue队列(先进先出) #region Stack栈(后进先出) ////// 入栈 /// /// 集合Id /// 入栈的值 public void PushItemToList(string listId, string value) { base._redisClient.PushItemToList(listId, value); } ////// 入栈,并设置过期时间 /// /// 集合Id /// 入栈的值 /// 过期时间 public void PushItemToList(string listId, string value, DateTime expireAt) { base._redisClient.PushItemToList(listId, value); base._redisClient.ExpireEntryAt(listId, expireAt); } ////// 入栈,并设置过期时间 /// /// 集合Id /// 入栈的值 /// 过期时间 public void PushItemToList(string listId, string value, TimeSpan expireIn) { base._redisClient.PushItemToList(listId, value); base._redisClient.ExpireEntryIn(listId, expireIn); } ////// 出栈 /// /// 集合Id ///出栈的值 public string PopItemFromList(string listId) { return base._redisClient.PopItemFromList(listId); } ////// 出栈(阻塞) /// /// 集合Id /// 阻塞时间(超时时间) ///出栈的值 public string BlockingPopItemFromList(string listId, TimeSpan? timeOut) { return base._redisClient.BlockingPopItemFromList(listId, timeOut); } ////// 从多个list中出栈一个值(阻塞) /// /// 集合Id /// 阻塞时间(超时时间) ///返回出栈的 listId & Item public ItemRef BlockingPopItemFromLists(string[] listIds, TimeSpan? timeOut) { return base._redisClient.BlockingPopItemFromLists(listIds, timeOut); } ////// 从fromListId集合出栈并入栈到toListId集合 /// /// 出栈集合Id /// 入栈集合Id ///返回移动的值 public string PopAndPushItemBetweenLists(string fromListId, string toListId) { return base._redisClient.PopAndPushItemBetweenLists(fromListId, toListId); } ////// 从fromListId集合出栈并入栈到toListId集合(阻塞) /// /// 出栈集合Id /// 入栈集合Id /// 阻塞时间(超时时间) ///返回移动的值 public string BlockingPopAndPushItemBetweenLists(string fromListId, string toListId, TimeSpan? timeOut) { return base._redisClient.BlockingPopAndPushItemBetweenLists(fromListId, toListId, timeOut); } #endregion Stack栈(后进先出) #region 赋值 ////// 向list头部添加value值 /// public void PrependItemToList(string listId, string value) { base._redisClient.PrependItemToList(listId, value); } ////// 向list头部添加value值,并设置过期时间 /// public void PrependItemToList(string listId, string value, DateTime expireAt) { base._redisClient.PrependItemToList(listId, value); base._redisClient.ExpireEntryAt(listId, expireAt); } ////// 向list头部添加value值,并设置过期时间 /// public void PrependItemToList(string listId, string value, TimeSpan expireIn) { base._redisClient.PrependItemToList(listId, value); base._redisClient.ExpireEntryIn(listId, expireIn); } ////// 向list中添加value值 /// public void AddItemToList(string listId, string value) { base._redisClient.AddItemToList(listId, value); } ////// 向list中添加value值,并设置过期时间 /// public void AddItemToList(string listId, string value, DateTime expireAt) { base._redisClient.AddItemToList(listId, value); base._redisClient.ExpireEntryAt(listId, expireAt); } ////// 向list中添加value值,并设置过期时间 /// public void AddItemToList(string listId, string value, TimeSpan expireIn) { base._redisClient.AddItemToList(listId, value); base._redisClient.ExpireEntryIn(listId, expireIn); } ////// 向list中添加多个value值 /// public void AddRangeToList(string listId, Listvalues) { base._redisClient.AddRangeToList(listId, values); } /// /// 向list中添加多个value值,并设置过期时间 /// public void AddRangeToList(string listId, Listvalues, DateTime expireAt) { base._redisClient.AddRangeToList(listId, values); base._redisClient.ExpireEntryAt(listId, expireAt); } /// /// 向list中添加多个value值,并设置过期时间 /// public void AddRangeToList(string listId, Listvalues, TimeSpan expireIn) { base._redisClient.AddRangeToList(listId, values); base._redisClient.ExpireEntryIn(listId, expireIn); } #endregion 赋值 #region 获取值 /// /// 获取指定list中包含的数据数量 /// public long GetListCount(string listId) { return base._redisClient.GetListCount(listId); } ////// 获取指定list中包含的所有数据集合 /// public ListGetAllItemsFromList(string listId) { return base._redisClient.GetAllItemsFromList(listId); } /// /// 获取指定list中下标从startingFrom到endingAt的值集合 /// public ListGetRangeFromList(string listId, int startingFrom, int endingAt) { return base._redisClient.GetRangeFromList(listId, startingFrom, endingAt); } #endregion 获取值 #region 删除 /// /// 移除指定list中,listId/value,与参数相同的值,并返回移除的数量 /// public long RemoveItemFromList(string listId, string value) { return base._redisClient.RemoveItemFromList(listId, value); } ////// 从指定list的尾部移除一个数据,并返回移除的数据 /// public string RemoveEndFromList(string listId) { return base._redisClient.RemoveEndFromList(listId); } ////// 从指定list的头部移除一个数据,并返回移除的数据 /// public string RemoveStartFromList(string listId) { return base._redisClient.RemoveStartFromList(listId); } #endregion 删除 #region 其它 ////// 清理数据,保持list长度 /// /// 集合Id /// 保留起点 /// 保留终点 public void TrimList(string listId, int keepStartingFrom, int keepEndingAt) { base._redisClient.TrimList(listId, keepStartingFrom, keepEndingAt); } #endregion 其它 #region 发布订阅 ////// 发布 /// /// 频道 /// 消息 public void Publish(string channel, string message) { base._redisClient.PublishMessage(channel, message); } ////// 订阅 /// /// 频道 /// public void Subscribe(string channel, ActionactionOnMessage) { var subscription = base._redisClient.CreateSubscription(); subscription.OnSubscribe = c => { Console.WriteLine($"订阅频道{c}"); Console.WriteLine(); }; //取消订阅 subscription.OnUnSubscribe = c => { Console.WriteLine($"取消订阅 {c}"); Console.WriteLine(); }; subscription.OnMessage += (c, s) => { actionOnMessage(c, s, subscription); }; Console.WriteLine($"开始启动监听 {channel}"); subscription.SubscribeToChannels(channel); //blocking } /// /// 取消订阅 /// /// 频道 public void UnSubscribeFromChannels(string channel) { var subscription = base._redisClient.CreateSubscription(); subscription.UnSubscribeFromChannels(channel); } #endregion 发布订阅 } }
使用如下:
////// Redis List的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销, /// Redis内部的很多实现,包括发送缓冲队列等也都是用这个数据结构。 /// 队列/栈/生产者消费者模型/发布订阅 /// public static void ShowList() { using (RedisListService service = new RedisListService()) { service.FlushAll(); service.AddItemToList("article", "张三"); service.AddItemToList("article", "李四"); service.AddItemToList("article", "王五"); service.PrependItemToList("article", "赵六"); service.PrependItemToList("article", "钱七"); var result1 = service.GetAllItemsFromList("article"); //一次性获取所有的数据 var result2 = service.GetRangeFromList("article", 0, 3); //可以按照添加顺序自动排序,而且可以分页获取 Console.WriteLine($"result1={JsonConvert.SerializeObject(result1)}"); Console.WriteLine($"result2={JsonConvert.SerializeObject(result2)}"); Console.WriteLine("====================================================="); //栈:后进先出 service.FlushAll(); service.PushItemToList("article", "张三"); //入栈 service.PushItemToList("article", "李四"); service.PushItemToList("article", "王五"); service
相关内容
- Redis使用bloom-filter过滤器实现推荐去重_Redis_
- Redis分布式锁python-redis-lock使用方法_Redis_
- window环境redis通过AOF恢复数据的方法_Redis_
- 基于Redis位图实现系统用户登录统计_Redis_
- Redis密码设置与访问限制实现方法_Redis_
- Redis分布式锁的使用和实现原理详解_Redis_
- redission分布式锁防止重复初始化问题_Redis_
- 全网最完整的Redis新手入门指导教程_Redis_
- Windows安装Redis并添加本地自启动服务的实例详解_Redis_
- Redis客户端及服务端的安装教程详解_Redis_
点击排行
本栏推荐
