前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C# 通过ServiceStack 操作Redis——List类型的使用及示例

C# 通过ServiceStack 操作Redis——List类型的使用及示例

作者头像
明志德道
发布于 2023-10-21 10:40:32
发布于 2023-10-21 10:40:32
38400
代码可运行
举报
运行总次数:0
代码可运行

Redis list的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/// <summary>
    ///  Redis list的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,
    ///  Redis内部的很多实现,包括发送缓冲队列等也都是用的这个数据结构。  
    /// </summary>
    public class RedisListService : RedisBase
    {
        #region 赋值
        /// <summary>
        /// 从左侧向list中添加值
        /// </summary>
        public void LPush(string key, string value)
        {
            base.iClient.PushItemToList(key, value);
        }
        /// <summary>
        /// 从左侧向list中添加值,并设置过期时间
        /// </summary>
        public void LPush(string key, string value, DateTime dt)
        {

            base.iClient.PushItemToList(key, value);
            base.iClient.ExpireEntryAt(key, dt);
        }
        /// <summary>
        /// 从左侧向list中添加值,设置过期时间
        /// </summary>
        public void LPush(string key, string value, TimeSpan sp)
        {
            base.iClient.PushItemToList(key, value);
            base.iClient.ExpireEntryIn(key, sp);
        }
        /// <summary>
        /// 从右侧向list中添加值
        /// </summary>
        public void RPush(string key, string value)
        {
            base.iClient.PrependItemToList(key, value);
        }
        /// <summary>
        /// 从右侧向list中添加值,并设置过期时间
        /// </summary>    
        public void RPush(string key, string value, DateTime dt)
        {
            base.iClient.PrependItemToList(key, value);
            base.iClient.ExpireEntryAt(key, dt);
        }
        /// <summary>
        /// 从右侧向list中添加值,并设置过期时间
        /// </summary>        
        public void RPush(string key, string value, TimeSpan sp)
        {
            base.iClient.PrependItemToList(key, value);
            base.iClient.ExpireEntryIn(key, sp);
        }
        /// <summary>
        /// 添加key/value
        /// </summary>     
        public void Add(string key, string value)
        {
            base.iClient.AddItemToList(key, value);
        }
        /// <summary>
        /// 添加key/value ,并设置过期时间
        /// </summary>  
        public void Add(string key, string value, DateTime dt)
        {
            base.iClient.AddItemToList(key, value);
            base.iClient.ExpireEntryAt(key, dt);
        }
        /// <summary>
        /// 添加key/value。并添加过期时间
        /// </summary>  
        public void Add(string key, string value, TimeSpan sp)
        {
            base.iClient.AddItemToList(key, value);
            base.iClient.ExpireEntryIn(key, sp);
        }
        /// <summary>
        /// 为key添加多个值
        /// </summary>  
        public void Add(string key, List<string> values)
        {
            base.iClient.AddRangeToList(key, values);
        }
        /// <summary>
        /// 为key添加多个值,并设置过期时间
        /// </summary>  
        public void Add(string key, List<string> values, DateTime dt)
        {
            base.iClient.AddRangeToList(key, values);
            base.iClient.ExpireEntryAt(key, dt);
        }
        /// <summary>
        /// 为key添加多个值,并设置过期时间
        /// </summary>  
        public void Add(string key, List<string> values, TimeSpan sp)
        {
            base.iClient.AddRangeToList(key, values);
            base.iClient.ExpireEntryIn(key, sp);
        }
        #endregion

        #region 获取值
        /// <summary>
        /// 获取list中key包含的数据数量
        /// </summary>  
        public long Count(string key)
        {
            return base.iClient.GetListCount(key);
        }
        /// <summary>
        /// 获取key包含的所有数据集合
        /// </summary>  
        public List<string> Get(string key)
        {
            return base.iClient.GetAllItemsFromList(key);
        }
        /// <summary>
        /// 获取key中下标为star到end的值集合 
        /// </summary>  
        public List<string> Get(string key, int star, int end)
        {
            return base.iClient.GetRangeFromList(key, star, end);
        }
        #endregion

        #region 阻塞命令
        /// <summary>
        ///  阻塞命令:从list为key的尾部移除一个值,并返回移除的值,阻塞时间为sp
        /// </summary>  
        public string BlockingPopItemFromList(string key, TimeSpan? sp)
        {
            return base.iClient.BlockingPopItemFromList(key, sp);
        }
        /// <summary>
        ///  阻塞命令:从多个list中尾部移除一个值,并返回移除的值&key,阻塞时间为sp
        /// </summary>  
        public ItemRef BlockingPopItemFromLists(string[] keys, TimeSpan? sp)
        {
            return base.iClient.BlockingPopItemFromLists(keys, sp);
        }


        /// <summary>
        ///  阻塞命令:从list中keys的尾部移除一个值,并返回移除的值,阻塞时间为sp
        /// </summary>  
        public string BlockingDequeueItemFromList(string key, TimeSpan? sp)
        {
            return base.iClient.BlockingDequeueItemFromList(key, sp);
        }

        /// <summary>
        /// 阻塞命令:从多个list中尾部移除一个值,并返回移除的值&key,阻塞时间为sp
        /// </summary>  
        public ItemRef BlockingDequeueItemFromLists(string[] keys, TimeSpan? sp)
        {
            return base.iClient.BlockingDequeueItemFromLists(keys, sp);
        }

        /// <summary>
        /// 阻塞命令:从list中一个fromkey的尾部移除一个值,添加到另外一个tokey的头部,并返回移除的值,阻塞时间为sp
        /// </summary>  
        public string BlockingPopAndPushItemBetweenLists(string fromkey, string tokey, TimeSpan? sp)
        {
            return base.iClient.BlockingPopAndPushItemBetweenLists(fromkey, tokey, sp);
        }
        #endregion

        #region 删除
        /// <summary>
        /// 从尾部移除数据,返回移除的数据
        /// </summary>  
        public string PopItemFromList(string key)
        {
            var sa = base.iClient.CreateSubscription();
            return base.iClient.PopItemFromList(key);
        }
        /// <summary>
        /// 从尾部移除数据,返回移除的数据
        /// </summary>  
        public string DequeueItemFromList(string key)
        {
            return base.iClient.DequeueItemFromList(key);
        }

        /// <summary>
        /// 移除list中,key/value,与参数相同的值,并返回移除的数量
        /// </summary>  
        public long RemoveItemFromList(string key, string value)
        {
            return base.iClient.RemoveItemFromList(key, value);
        }
        /// <summary>
        /// 从list的尾部移除一个数据,返回移除的数据
        /// </summary>  
        public string RemoveEndFromList(string key)
        {
            return base.iClient.RemoveEndFromList(key);
        }
        /// <summary>
        /// 从list的头部移除一个数据,返回移除的值
        /// </summary>  
        public string RemoveStartFromList(string key)
        {
            return base.iClient.RemoveStartFromList(key);
        }
        #endregion

        #region 其它
        /// <summary>
        /// 从一个list的尾部移除一个数据,添加到另外一个list的头部,并返回移动的值
        /// </summary>  
        public string PopAndPushItemBetweenLists(string fromKey, string toKey)
        {
            return base.iClient.PopAndPushItemBetweenLists(fromKey, toKey);
        }


        public void TrimList(string key, int start, int end)
        {
            base.iClient.TrimList(key, start, end);
        }
        #endregion

        #region 发布订阅
        public void Publish(string channel, string message)
        {
            base.iClient.PublishMessage(channel, message);
        }

        public void Subscribe(string channel, Action<string, string, IRedisSubscription> actionOnMessage)
        {
            var subscription = base.iClient.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.iClient.CreateSubscription();
            subscription.UnSubscribeFromChannels(channel);
        }
        #endregion
    }

我在这里将注解添加上去,有不正确之处,欢迎指正、

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
                //尾部追加数据
                client.PushItemToList(listId, value);
                //设置过期时间
                client.ExpireEntryAt(key, expireAt);
                //设置滑动过期时间
                client.ExpireEntryIn(key, expireIn);
                client.PrependItemToList(listId, value);
                client.AddItemToList(listId, value);
                client.AddRangeToList(listId, values);

                //获取listId包含的数据数量
                client.GetListCount(listId);
                //获取listId包含的所有数据集合
                client.GetAllItemsFromList(listId);
                //获取listId中下标为startingFrom到endingAt的值集合 
                client.GetRangeFromList(listId, startingFrom, endingAt);


                //  阻塞命令:从listId的头部移除一个值,并返回移除的值,阻塞时间为sp
                client.BlockingPopItemFromList(listId, timeOut);
                //  阻塞命令:从多个listId的尾部移除一个值,并返回移除的值,阻塞时间为sp
                client.BlockingPopItemFromLists(listIds, timeOut);
                // 阻塞命令:从listId的尾部移除一个值,并返回移除的值,阻塞时间为sp
                client.BlockingDequeueItemFromList(listId, timeOut);
                // 阻塞命令:从多个listId的尾部移除一个值,并返回移除的值,阻塞时间为sp
                client.BlockingDequeueItemFromLists(listIds, timeOut);
                //阻塞命令:从一个fromListId的头部移除一个值,添加到另外一个toListId的头部,并返回移除的值,阻塞时间为sp
                client.BlockingPopAndPushItemBetweenLists(fromListId, toListId, timeOut);

                //从尾部移除数据,返回移除的数据
                client.PopItemFromList(listId);
                // 从尾部移除数据,返回移除的数据
                client.DequeueItemFromList(listId);
                //移除listId中,与value相同的值的数据,并返回移除的数量
                client.RemoveItemFromList(listId, value);
                // 从list的尾部移除一个数据,返回移除的数据
                client.RemoveEndFromList(listId);
                //从list的头部移除一个数据,返回移除的数据
                client.RemoveStartFromList(listId);
                //从一个list的尾部移除一个数据,添加到另外一个list的头部,并返回移动的值
                client.PopAndPushItemBetweenLists(fromListId, toListId);

添加

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
                //1. 添加
                //1.1 
                client.PushItemToList("group1", "你好1");
                client.PushItemToList("group1", "你好2");
                client.PushItemToList("group1", "你好3");
                client.PushItemToList("group1", "你好4");
                client.PushItemToList("group1", "你好5");
                //1.2
                client.PrependItemToList("group2", "早上1");
                client.PrependItemToList("group2", "早上2");
                client.PrependItemToList("group2", "早上3");
                client.PrependItemToList("group2", "早上4");
                client.PrependItemToList("group2", "早上5");
                //1.3
                client.AddItemToList("group3", "中午1");
                client.AddItemToList("group3", "中午2");
                client.AddItemToList("group3", "中午3");
                client.AddItemToList("group3", "中午4");
                client.AddItemToList("group3", "中午5");
                //1.4
                List<string> values1 = new List<string>() { "晚上1", "晚上2", "晚上3", "晚上4", "晚上5" };
                client.AddRangeToList("group4",values1);

 插入

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
                //2.插入
                //2.1尾部插入
                client.PushItemToList("group3", "a1");
                client.PushItemToList("group3", "a2");
                client.PushItemToList("group3", "a3");
                //2.2头部插入
                client.PrependItemToList("group3", "b1");
                client.PrependItemToList("group3", "b2");
                client.PrependItemToList("group3", "b3");

 从效果图看,Push方式是往链表的尾部逐步插入数据,Prepend是往链表的头部逐步插入数据

移除

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
                //3.删除
                client.PopItemFromList("group1");
                client.PopItemFromList("group1");
                client.PopItemFromList("group1");
                client.DequeueItemFromList("group3");
                client.DequeueItemFromList("group3");

                client.RemoveEndFromList("group4");
                client.RemoveStartFromList("group4");
                client.RemoveStartFromList("group4");

对比前后的数据变化,可以得出Pop、Dequeue方法效果都是一样,删除链表尾部数据。RemoveEnd 删除链表尾部数据、RemoveStart删除链表头部数据

 订阅发布

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
                //4.发布订阅
                //4.1(服务器)发布消息
                client.PublishMessage(toChanner, message);
                //4.2 (客户端)订阅
               var subscription= client.CreateSubscription();
                //4.2.1(客户端)订阅频道
                subscription.SubscribeToChannels(channels);
                //4.2.2 (客户端)取消频道
                subscription.UnSubscribeFromChannels(channels);

其它的一些api方法,就不做数据效果展示了~

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-03-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
告别被拒,如何提升iOS审核通过率(下篇)——应用内容检查大法与提审资源检查大法
作者互娱iOS预审团队,隶属于互娱研发部品质管理中心,致力于互娱产品的iOS审核前的验收工作。
WeTest质量开放平台团队
2018/10/29
1.3K0
告别被拒,提升iOS审核通过率(一)
作者:互娱iOS预审团队,隶属于互娱研发部品质管理中心,致力于互娱产品的iOS审核前的验收工作。 iOS审核一直是每款移动产品上架苹果商店时面对的一座大山,每次提审都像是一次漫长而又悲壮的旅行,经常被苹果拒之门外,无比煎熬。那么问题来了,我们有没有什么办法准确把握苹果审核准则,从而提升审核的通过率呢?答案是肯定的,腾讯预审团队从以下两方面做了探索,经过近一年的推行和数据监控, iOS审核月通过率从过往的35%提升到85%+: 1.分析过往提审被拒的案例,并结合《苹果应用商店审核指南》的条款,整理成可执行的审
腾讯大讲堂
2018/02/12
1.2K0
提审资源检查大法
作者:互娱iOS预审团队,隶属于互娱研发部品质管理中心,致力于互娱产品的iOS审核前的验收工作。 本篇主要是提审资源相关检查项的分享,在过往提审数据统计中,因提审资源被拒的比例高达12%,此类问题主要集中在应用截图、预览视频、提审帐号、安装包和第三方许可证书。关于此类资源审核要点的介绍,包含如下几方面: 1、 应用截图检查 2、 预览视频检查 3、提审帐号检查 4、安装包检查 5、第三方许可证书检查 应用截图检查 对于图片的审核,我们重点覆盖图片的内容、文字和规格属性,确保图片满足苹果要求,详情如下: 检查
腾讯大讲堂
2018/02/12
9840
提审资源检查大法
告别被拒,如何提升iOS审核通过率(上篇)
作者互娱iOS预审团队,隶属于腾讯互娱研发部品质管理中心,致力于互娱产品的iOS审核前的验收工作。
WeTest质量开放平台团队
2018/10/29
1.2K0
iOS审核这些坑,腾讯游戏也踩过
作者Jamie,专项技术测试工程师,在iOS预审和ASO优化领域从事专项测试相关工作,为腾讯游戏近100个产品提供专项服务。
WeTest质量开放平台团队
2018/10/29
1.6K0
三步走起 提升 iOS 审核通过率 下篇
接上篇->三步走起 提升 iOS 审核通过率 上篇 根据2015年的数据统计情况,并结合《苹果应用商店审核指南》,互娱 iOS 预审团队通过细分将预审工作划为3大模块:客户端资源检查、应用内容检查和提审资源检查。 在上一篇文章中,重点为大家介绍了客户端资源检查的内容,今天我们要为大家介绍的是关于应用内容检查和提审资源检查的部分。 第二步:应用内容篇 对应用的内容进行审查,是确认无涉及色情、庸俗、暴力、枪支等内容;并对公告文字等筛查,无苹果禁止的字眼等;应用内不包含 CDKey 兑换,好友邀请及炫耀等苹果最新
腾讯Bugly
2018/03/23
1.9K0
三步走起 提升 iOS 审核通过率 下篇
告别被拒,提升IOS审查通过率(四)
主要是提审资源相关检查项的分享,在过往提审数据统计中,因提审资源被拒的比例高达12%,此类问题主要集中在应用截图、预览视频、提审帐号、安装包和第三方许可证书。关于此类资源审核要点的介绍,包含如下几方面:
WeTest质量开放平台团队
2018/10/29
7350
iOS 预审总被拒 ? 腾讯教你提升 iOS 审核通过率 !
WeTest质量开放平台团队
2016/10/14
3K0
iOS 预审总被拒 ? 腾讯教你提升  iOS 审核通过率 !
教你如何处理被苹果App Store审核多次被拒和被警告的情况下通过审核
内部审核渠道人员教你如何处理被苹果App Store审核多次被拒和被警告的情况下通过审核
jiang chen
2019/02/15
8.9K0
教你如何处理被苹果App Store审核多次被拒和被警告的情况下通过审核
【年底干货大放送】做好这三步,让你的游戏轻松通过苹果审核系列(一)
“IOS审核如此多娇,引无数英雄尽折腰”,无数手游项目在IOS审核过程中都经历过被拒的烦恼,知己知彼才能百战不殆,为了提升IOS审核的通过率,我们应该更了解IOS审核,才能提升通过率。
WeTest质量开放平台团队
2018/10/29
8020
【客户端检查篇】告别被拒,提升iOS审核通过率(二)
作者:互娱iOS预审团队,隶属于互娱研发部品质管理中心,致力于互娱产品的iOS审核前的验收工作。 通过细分将iOS预审工作划为3大块:客户端资源检查、应用内容检查和提审资源检查,接下来我们先从客户端检查开始介绍。 客户端检查的主要目的是通过客户端配置检查来保证客户端符合苹果的开发者规范以及其他更新的要求,包括存储系统、配置文件、网络连接(VPN)、icon检查、私有API检查,提审前的审核会覆盖这几个部分的各个测试点。 1存储系统检查 苹果官方对用户数据存储有严格的规范,以往有很多被拒案例都是关于存储的。因
腾讯大讲堂
2018/02/12
2.7K0
【客户端检查篇】告别被拒,提升iOS审核通过率(二)
揭秘苹果应用审核团队(史上最全版)
最近,Epic Games vs Apple 的诉讼大战非常的精彩,在上一篇文章《论证:iOS安全性,为什么需要审核?》我们为大家留下了一个悬念,就是《揭秘苹果应用审核团队》!
37手游iOS技术运营团队
2021/06/08
3.9K0
揭秘苹果应用审核团队(史上最全版)
ios app上架流程是什么,怎样避免提交审核被拒?
2、应用内包含检查更新功能iOS 应用的版本更新必须通过 App Store 进行,自身 App 内不能包含提示更新功能。
iOS Magician
2023/03/22
6260
App Store上架审核过程中常见问题整理
苹果的开发者账号主要分为个人(Individual)、公司(Company)、企业(Enterprise)、高校(University)四种类型,每年资费分别为$99、$99、$299、免费)。一般开发者申请的都是个人或者公司的,企业的开发者账号开发应用不能发布到App Store,只能企业内部使用。这个申请过程一般可能需要一个星期左右。公司和企业的需要邓白氏码,如果邓白氏码未申请,请先申请邓白氏码,这个过程需要一到两个星期。
jiang chen
2018/12/04
3.3K0
【2018年06月30日整理】马甲包最新过审技巧
最近苹果审核组委会开始了针对App Store应用商店上的CP,传奇,菠菜,棋牌等类型马甲包重复应用的严厉打击并下架一批应用,所谓重复应用,俗称“马甲包”早期也叫套壳,意思是相同的游戏产品,通过使用不同的开发者账户,更换游戏名字、icon以及美术宣传图等方式,让多个包同时在商店中上架,以便能获取更多的新增用户。
jiang chen
2018/06/30
4.1K2
【2018年06月30日整理】马甲包最新过审技巧
【客户端检查篇】告别被拒,提升iOS审核通过率(二)
作者:互娱iOS预审团队,隶属于互娱研发部品质管理中心,致力于互娱产品的iOS审核前的验收工作。 通过细分将iOS预审工作划为3大块:客户端资源检查、应用内容检查和提审资源检查,接下来我们先从客户端检查开始介绍。 客户端检查的主要目的是通过客户端配置检查来保证客户端符合苹果的开发者规范以及其他更新的要求,包括存储系统、配置文件、网络连接(VPN)、icon检查、私有API检查,提审前的审核会覆盖这几个部分的各个测试点。 1 存储系统检查 苹果官方对用户数据存储有严格的规范,以往有很多被拒案例都是关于存储的。
WeTest质量开放平台团队
2023/05/04
1.5K0
【客户端检查篇】告别被拒,提升iOS审核通过率(二)
ios上架各类被拒app技术经验总结
当你阅读过大量Apple官方发来的邮件或是说明文档、说明网页时,你会由衷地感觉通篇所说的基本都是些完全正确但又毫无意义的东西,根据业内一位资深朋友所述,一切Apple官方文档和邮件的开头内容你都可以理解为:亲爱的开发者您好,我是你爸。为什么这么说呢,其实很简单,Apple是一家十分严谨并且严格的公司,一切解释权归他们所有,不得有任何疑义。
jiang chen
2019/02/22
3.9K0
ios上架各类被拒app技术经验总结
史上最全麦坑版用例之IOS和Android版APP版本更新、IOS版规避审核?
1、设置IOS APP为审核状态——上传至苹果审核——审核通过——设置APP为非审核状态——发布appstore——设置版本更新升级
王大力测试进阶之路
2019/10/25
1.1K0
史上最全麦坑版用例之IOS和Android版APP版本更新、IOS版规避审核?
收起装13的苹果审核指南,就告诉你到底怎么能过!
本文为作者在遍览诸多苹果商店审核指南文后愤然写下,以最容易被拒的地方房卡麻将闲游(无版权号)移动端手游APP为例。
jiang chen
2018/08/10
2.5K0
收起装13的苹果审核指南,就告诉你到底怎么能过!
苹果审核一直卡“审核中”怎么办?最新苹果App Store卡审解决教程
在苹果一次次机审升级的背景下,iOS过审似乎变得越来越难,今天这篇文章总结了ios开发子这些年对于iOS过审的一些心得,基本上涵盖了大部分的难点,让大家在iOS过审的道路上少走弯路。
jiang chen
2018/11/06
17.3K0
苹果审核一直卡“审核中”怎么办?最新苹果App Store卡审解决教程
推荐阅读
相关推荐
告别被拒,如何提升iOS审核通过率(下篇)——应用内容检查大法与提审资源检查大法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验