redis中list类型数据,查看所有元素,命令
lrange list_name start stop
假设现有一个list={a,b,c,d},非常明显,元素的索引位置分别是0,1,2,3。但是当出现start/stop出现负数的时候,就会出现很多有意思的现象。下面就从“正常”情况到“不正常”情况,咱们一探究竟。
1、start/stop都是正数
1、start/stop 都在0~3中
127.0.0.1:6379> lrange list 0 3
1) "d"
2) "c"
3) "b"
4) "a"
127.0.0.1:6379> lrange list 0 1
1) "d"
2) "c"
2、start在0~3中,stop>3的正整数
127.0.0.1:6379> lrange list 0 100
1) "d"
2) "c"
3) "b"
4) "a"
效果等同于lrange list start 3
3、start在0~3中,stop<0
有意思的来了!
# 为了便于对比,stop从0开始,依次递减
127.0.0.1:6379> lrange list 0 0
1) "d"
127.0.0.1:6379> lrange list 0 -1
1) "d"
2) "c"
3) "b"
4) "a"
127.0.0.1:6379> lrange list 0 -2
1) "d"
2) "c"
3) "b"
127.0.0.1:6379> lrange list 0 -3
1) "d"
2) "c"
127.0.0.1:6379> lrange list 0 -4
1) "d"
127.0.0.1:6379> lrange list 0 -5
(empty list or set)
对于刚接触redis的新手来说,出现这样的结果,感觉非常有意思!
从上述表现来看,似乎可以总结出以下结论:
# stop在不同的值时,对应的元素,如下所示
-∞ -4 -3 -2 -1
d c b a
0 1 2 3 +∞
这个索引值对应元素的效果,对于start也是一样的,所以当start出现负数时,其出现的结果也就理解了
127.0.0.1:6379> lrange list -3 -1
1) "c"
2) "b"
3) "a"
4、更进一步
那么问题来了,当start/stop值超过范围时(本例为0~3),为什么不是直接报超出范围异常,而是出现这样效果,这样设计的目的是什么呢?
我猜测,redis的优点在处理并发能力和处理速度,其处理异常的能力并不突出。更主要的,lrange是一个查询操作,有就给数据,没有就返回空,查询操作尽量不要报异常。
不知道有没有大神知道,给个官方的解释,谢谢。