tnblog
首页

ServiceStack.Redis库删除list数据的bug

305人阅读 2019/4/11 13:44 评论:4 手机浏览 收藏
分类: Redis

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

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

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


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

  static void Main(string[] args)
        {
            using (RedisClient redis = new RedisClient())
            {

                redis.AddItemToList("mytestlist", "testdata");
                redis.AddItemToList("mytestlist", "testdata2");

                //获取删除前的条数
                var bef = redis.GetAllItemsFromList("mytestlist");
                Console.WriteLine("删除前:"+ redis.GetAllItemsFromList("mytestlist").Count()+ "条");

                redis.RemoveAllFromList("mytestlist");
                Console.WriteLine("");

                //获取删除后的条数
                var  beh = redis.GetAllItemsFromList("mytestlist");
                Console.WriteLine("删除后:" + redis.GetAllItemsFromList("mytestlist").Count() + "条");

                Console.ReadLine();
            }

        }

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

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


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


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


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

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

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

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


首先找到RedisClient类

然后找到RemoveAllFromList方法

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

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

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


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

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

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

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


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



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

dear多加一句RemoveStartFromList方法吧




评价
自己阳光积极向上,就会吸引阳光积极向上的人和事
文章
6
评论
8
分类
16
关注
16
{{item.ArticleTitle}}
{{item.BlogName}} : {{item.Content}}