redis list
1. 列表(list)
列表是简单的字符串列表,列表中的每个字符串称为元素 (element),每个元素是有序可重复的。在 redis 中,可以对列表两端插入(push)和弹出(pop),还可以获取指定范围的元素列表、获取指定索引下标的元素等。列表是一种比较灵活的数据结构,它可以充当栈和队列的角色。
2. 内部实现
在Redis3.2版本以前列表类型的内部编码有两种。
- ziplist(压缩列表):当列表的元素个数小于list-max-ziplist-entries配置(默认512个),同时列表中每个元素的值都小于list-max-ziplist-value配置时(默认64字节),Redis会选用ziplist来作为列表的内部实现来减少内存的使用。
- linkedlist(链表):当列表类型无法满足ziplist的条件时,Redis会使用linkedlist作为列表的内部实现。
而在Redis3.2版本开始对列表数据结构进行了改造,使用 quicklist 代替了 ziplist 和 linkedlist.
2. 常用命令
命令 | 描述 |
---|---|
blpop key1 [key2 ] timeout | 移出,并获取第一个元素,会阻塞列表,直到有元素为止。 |
brpop key1 [key2 ] timeout | 移出,并获取最后一个元素,会阻塞列表,直到有元素为止。 |
brpoplpush source destination timeout | 弹出一个值,将插入另外一个列表中并返回它,会阻塞列表,直到有元素为止 |
lindex key index | 通过索引获取列表中的元素 |
linsert key [before, after] pivot value | 在列表的元素前或者后插入元素 |
llen key | 获取列表长度 |
lpop key | 移出,并获取第一个元素 |
lpush key value [value2] | 将一个或者多个插入列表头部 |
lpushx key value | 将一个值插入到已存在的列表头部 |
lrange key start stop | 获取指定范围内的元素 |
lrem key count value | 移除列表元素 |
lset key index value | 通过索引设置列表元素的值 |
ltrim key start stop | 修剪到指定范围内的清单 |
rpop key | 从队列右边移除一个元素,并返回 |
rpoplpush source destination | 移除列表的最后一个元素,并将该元素添加到另一个列表并返回 |
rpush key value1 [value2] | 从列表右边添加一个或多个元素 |
rpushx key value | 从列表右边添加一个或多个元素,仅队列存在时有效 |
3. 使用场景
-
消息队列 (lpush + brpop)
列表类型可以使用 rpush 实现先进先出的功能,同时又可以使用 lpop 轻松的弹出(查询并删除)第一个元素,所以列表类型可以用来实现消息队列
-
排行榜(lrange + rpush)
lrange命令可以分页查看队列中的数据。可将每隔一段时间计算一次的排行榜存储在list类型中。如销量,成绩,打榜排行
但是,并不是所有的排行榜都能用list类型实现,只有定时计算的排行榜才适合使用list类型,有序集合支持实时计算的排行榜
-
最新列表(lrange + lpush)
lpush 和 lrange 能实现最新列表的功能,每次通过lpush命令往列表里插入新的元素,然后通过lrange命令读取最新的元素列表,如朋友圈的点赞列表、评论列表。
不需要按时范围查询,并且不需要分页,或者更新频率低
-
栈(lpush + lpop)
-
队列(lpush + rpop)
-
控制一个有固定数量的列表(lpush + ltrim)