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是一个查询操作,有就给数据,没有就返回空,查询操作尽量不要报异常。
不知道有没有大神知道,给个官方的解释,谢谢。