应无所住,而生其心
排名
1
文章
872
粉丝
112
评论
163
net core webapi post传递参数
庸人 : 确实坑哈,我也是下班好了好几次,发现后台传递对象是可以的,但...
百度编辑器自定义模板
庸人 : 我建议换个编辑器,因为现在百度富文本已经停止维护了,用tinymec...
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

ServiceStack.Redis库删除list数据的bug。ServiceStack.Redis库自带bug

7767人阅读 2019/4/11 13:44 总访问:5416121 评论:4 收藏:0 手机
分类: Redis

做项目的时候使用的ServiceStack.Redis库操作redis。项目有个小问题,时不时的出现

很是奇怪,还以为是集群的问题,一直没有好好去看一下,结果认真一看......发现居然是ServiceStack.Redis库本身的问题

删除list的RemoveAllFromList方法会有一个bug


下面来做一个简单的测试:

  1.   static void Main(string[] args)
  2.         {
  3.             using (RedisClient redis = new RedisClient())
  4.             {
  5.                 redis.AddItemToList("mytestlist""testdata");
  6.                 redis.AddItemToList("mytestlist""testdata2");
  7.                 //获取删除前的条数
  8.                 var bef = redis.GetAllItemsFromList("mytestlist");
  9.                 Console.WriteLine("删除前:"+ redis.GetAllItemsFromList("mytestlist").Count()+ "条");
  10.                 redis.RemoveAllFromList("mytestlist");
  11.                 Console.WriteLine("");
  12.                 //获取删除后的条数
  13.                 var  beh = redis.GetAllItemsFromList("mytestlist");
  14.                 Console.WriteLine("删除后:" + redis.GetAllItemsFromList("mytestlist").Count() + "条");
  15.                 Console.ReadLine();
  16.             }
  17.         }

方法很简单就是添加几条数据,然后调用RemoveAllFromList方法去删除List中的元素

删除后和删除前各获取一次数据。


看看结果是正确的,数据被正确的删除了


但是不要高兴得太早了如果list中的数据只有一条会删除不掉.....


下面我们来做一个很简单的测试

只添加一条数据然后在删除

哦豁.....果然出问题了

为什么呢.......有个大胆的想法就是去看看ServiceStack.Redis库的源码


首先找到RedisClient类

然后找到RemoveAllFromList方法

一看就知道是调用Redis的Ltrim 命令,参数就是listid然后范围是-1,0。看到这个参数我们分析一下

就知道为什么只有一条的时候无法删除了

首先这个范围的意思是:只保留指定区间内的元素,不在指定区间之内的元素都将被删除


他这个-1,0想法很好,正常情况下可以删除所有的元素。画个简单的图

but这是正常情况下可以被删除.......

但是如果只有一个元素就会出现一个特殊情况

只有一个元素的情况下,它的下标既是0又是-1,所以就没有被删除掉了.....


以为是版本的问题,然后用最新版去尝试了一下,还是有这个问题



发现了问题后,如果我们想要根据一个key清空某个list怎么办呢?

dear多加一句RemoveStartFromList方法吧




欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)

评价

饰心

2019/4/11 16:25:45

大。。。大佬。。。大佬鼠。。。。

饰心

2019/4/11 16:49:20

不对啊,我怎么删掉了。。。

剑轩:@饰心不会吧....用的什么版本.....是不是这个库哦

2019/4/11 16:57:39 回复

饰心:@剑轩又测了下,删不掉。果然是我太天真了,哈哈

2019/4/12 9:26:08 回复

C ServiceStack.Redis操作Redis_list

redis的内部实现是使用的链表实现的ServiceStack.Redis操作Redis List的增删改查staticvoidMain(string[]args) { //链接r...

c winform listview显示数据

这样一个小小的问题坑了我好久啊....................好多年没有用winfrom了,居然因为一个listview显示数据问题坑了那么那...

c使用泛型实现一个自己的list

实现一个自己list,实现微软自带list的常用功能,就是可以直接把list对象名换成自己的使用例如:这里把MyList换成List效果一...

表达式树+反射扩展EF实现动态排序。list动态排序

我们在显示表格的时候经常会在点击表头的时候实现排序,当然很多前端的框架都实现了当前页的页面排序,直接配置一下就行了...

Redis使用list存储热点数据库

今天,又学啦一点新知识,redis(缓存),看到这个单词的时候想必大家都会有一种似曾相识的感觉吧准备好,我要开始讲解啦首先我...

android 漂亮的listview

效果如下:首先在drawable下定义选择器shape_bg_listview.xml 实现圆角:<?xmlversion="1.0"encoding="...

c list的线程安全性

看看msdn上关于list线程安全的解释:此类型的公共静态(SharedVisual Basic)成员是线程安全的。但不保证所有实例成员都是...

C中IlistT与listT的区别感想

"韦编三绝”中的韦”指的是:在我国,卫星发射的最佳时间是 :今天遇到,有所疑惑,于是在网上搜索一下,很受启发,于...

python获取list长度

Python List len()方法 用法 len(list) 具体用法 list1, list2 = [123, 'xyz', 'zara'], [456, 'a...

解决redis的list表里只能添加6000数据的问题。

///取消限制redis添加量 ///</summary> publicstaticvoidcancelimit() { varlicenseKey=newLicenseKey() { Ref...

uni-app中list插件图标问题

如图:他使用uni-icons实现的如果只有text就不会有图标有时候贴的文档不是太完善,还是要下一个完整的插件来对比一下

list扩展方法ForEach原理(where,FirstOrDefault同理!)

//ForEach的原理就是使用循环 //委托使用循环 publicstaticvoidMyForEach<T>(thisList<T>item,Action<T...

.NET实现ORM-EF的Lambda查询一对多转一对一,即实现listT.SelectMany()方法,并对其进行为空处理

我们借助微软官方方法参数进行修改实现命名方法为MySelectMAny: public static IEnumerable<TResult> MySelectMA...

spring boot +swagger+mssql +lombok+mybatis的listDto 参数

一、参数为list实体model时(注意list参数一定要用对应的类型接收传回的参数,不然会报错)接口效果注意list参数默认是必填,...

listener 监听器的介绍 1

监听对象的监听器1、2、3、监听域对象属性变化的监听器4、5、6、监听会话相关的感知型监听器感知型就是实现后不需要配置的...