LIST
该数据类似于数据结构中的队列,但是该结构能够在两端j添加与获取
常用命令
-
将一个或多个值value插入到key列表的表头(最左边)
LPUSH key value [value ...]
-
将一个或多个值value插入到key列表的表尾(最右边)
RPUSH key value [value ...]
-
移除并返回key列表的头元素
LPOP key
-
移除并返回key列表的尾元素
RPOP key
-
返回列表key中指定区间内的元素,区间以偏移量start和stop指定
LRANGE key start stop
-
从key列表表头弹出一个元素,若列表中没有元素,阻塞等待 timeout秒,如果timeout=0,一直阻塞等待
BLPOP key [key ...] timeout
-
从key列表表尾弹出一个元素,若列表中没有元素,阻塞等待 timeout秒,如果timeout=0,一直阻塞等待
BRPOP key [key ...] timeout
-
不常用
BRPOPLPUSH source destination timeout RPOPLPUSH source destination LINDEX key index LLEN key LINSERT key BEFORE|AFTER pivot element LREM key count element LSET key index element LTRIM key start stop
底层结构
list是一个有序(加入顺序)的数据结构,Redis采用quicklist(双端链表)和ziplist作为list底层实现
不采用普通链表原因:数据读取慢,内存碎片多,指针占用过多内存(胖内存)
可以通过设置每个ziplist的最大容量,quicklist的数据压缩范围,提升数据存取效率
- list-max-ziplist-size -2 //单个ziplist节点最大能存储8 kb ,超过则进行分裂,将数据存储在新的ziplist节点中,redis.conf中存在说明
- list-compress-depth 1 //0表示所有节点,都不进行压缩,1表示从头节点走一个,尾节点往前走一个不用压缩,其他的全部压缩,2,3,4…以此类推,中间数据并不频繁访问
实际应用
-
分布式常用数据结构
- Stack(栈) = LPUSH + LPOP
Queue(队列)= LPUSH + RPOP
Blocking MQ(阻塞队列)= LPUSH + BRPOP
- Stack(栈) = LPUSH + LPOP
-
微博/微信公号消息流
-
推:公号推流,用户队列访问压力小,维护成本高,在大量关注公号情况下推送量大
- 张三关注了李四,王五等大V
-
李四发微博,消息ID为10086
LPUSH msg:{张三-ID} 10086
-
王五发微博,消息ID为10010
LPUSH msg:{王五-ID} 10010
-
查看最新微博消息
LRANGE msg:{王五-ID} 0 4
-
- 张三关注了李四,王五等大V
-
拉:拉取公号队列,单点访问压力高存在上限,维护成本低,在大量关注公号情况下,同时访问人过多容易导致redis宕机
-
总结
- 该结构更像一个数据队列,能够方便实现分布式的数据结构
- 在小数据量的队列等操作时可以用该结构来解决,避免资源浪费