redis 对象 列表(list)



1. 列表(list)

列表是简单的字符串列表,列表中的每个字符串称为元素 (element),每个元素是有序可重复的。在 redis 中,可以对列表两端插入(push)和弹出(pop),还可以获取指定范围的元素列表、获取指定索引下标的元素等。列表是一种比较灵活的数据结构,它可以充当栈和队列的角色。

redis 对象 列表(list)


2. 内部实现

在Redis3.2版本以前列表类型的内部编码有两种。

  1. ziplist(压缩列表):当列表的元素个数小于list-max-ziplist-entries配置(默认512个),同时列表中每个元素的值都小于list-max-ziplist-value配置时(默认64字节),Redis会选用ziplist来作为列表的内部实现来减少内存的使用。
  2. 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. 使用场景

  1. 消息队列 (lpush + brpop)

    列表类型可以使用 rpush 实现先进先出的功能,同时又可以使用 lpop 轻松的弹出(查询并删除)第一个元素,所以列表类型可以用来实现消息队列
    redis 对象 列表(list)

  2. 排行榜(lrange + rpush)

    lrange命令可以分页查看队列中的数据。可将每隔一段时间计算一次的排行榜存储在list类型中。如销量,成绩,打榜排行

    但是,并不是所有的排行榜都能用list类型实现,只有定时计算的排行榜才适合使用list类型,有序集合支持实时计算的排行榜

  3. 最新列表(lrange + lpush)

    lpush 和 lrange 能实现最新列表的功能,每次通过lpush命令往列表里插入新的元素,然后通过lrange命令读取最新的元素列表,如朋友圈的点赞列表、评论列表。

    不需要按时范围查询,并且不需要分页,或者更新频率低

上一篇:Redis 设计与实现 5:压缩列表


下一篇:Redis内部数据结构详解(4)——ziplist