ServiceStack.Redis库删除list数据的bug。ServiceStack.Redis库自带bug
做项目的时候使用的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方法吧
欢迎加群讨论技术,群:677373950(满了,可以加,但通过不了),2群:656732739