Redis数据结构-List类型

List 类型是一个链表结构的集合,其主要功能有push、pop、获取元素等。更详细的说,List类型是一个双端链表 的结构,我们可以通过相关操作进行集合的头部或者尾部添加删除 元素,list的设计非常简单精巧,即可以做为栈,又可以作为队列。满足绝大数需求。

列表类型的两个特点:

1.列表中的元素是有序的,这就意味着可以通过索引的下标获取某个元素或者某个范围内的元素列表

2. 列表中的元素 是可以重复的

List类型的命令:

操作类型操作
添加rpush lpush linsert
查询rlrange lindex  llen
删除lpop rpop lrem ltrim
修改lset
阻塞操作blpop brpop

1) 添加操作

(1) 从右边插入元素

 rpush key value [value ......]

lrange names 0 -1可以从左到右获取列表的所有元素

(2)从左边插入

lpush key value [value ......]

使用方法和 rpush相同,只不过从左侧插入。

2) 查找

(1) 获取指定范围内 的元素列表

lrange key start end

lrange 操作会获取列表指定索引范围所有元素。索引下标有两个特点:

  • 索引下标从左到右 分贝是0到N-1,但是从右到左分别是 -1到-N
  • lrange 中的end 选项包含了自身,这个和很多编程语言不包含end不太相同,例如想获取列表的第2个到第4个元素

lrange listkey 1 3


(2) 获取列表指定索引下标的元素

lindex key index

(3) 获取列表元素

llen key

3) 删除

(1) 从列表左侧弹出元素

lpop key


(2) 从列表右侧弹出

rpop key

(3) 删除指定元素

lrem key count  value

lrem 命令会从列表中找到等于value的元素进行删除,根据count分为3种情况:

  • count > 0 ,从左到右,删除最多count个元素
  • count < 0 ,从右到 左,删除最多count绝对值个元素
  • count = 0, 删除所有

4)修改

修改指定索引下标的元素:

lset key index newValue


5)阻塞操作

阻塞式弹出如下:

blpop key [key ...] timeout

brpop key [key ...] timeout

使用场景:

1.消息队列

Redis使用lpush + brpop 命令组合即可 实现 阻塞队列,生产者客户端使用rpush从列表左侧插入 元素 ,多个消费者客户端 使用brpop命令阻塞式的"抢" 列表尾部的元素,多个客户端保证了消费的负载均衡和高可用性。

2.文章列表

 每隔用户有属于自己的文章列表,现需要 分页展示文章列表。此时可以考虑使用列表,因为列表不但有序的,同时支持按照索引获取元素。

1) 每篇文章使用哈希结构存储,例如 每篇文章有3个属性title、timestamp、content:

hmset atticle:1 title XXX timestamp 123333333 content XXXXXX

....

hmset article:n title yy timestamp 344444444 content  XXXX

......

2) 向用户文章列表添加文档,user:{id}:articles 作为用户文章列表的键值

lpush  user:1:articles  article:1 article:2 article:3

......

lpush user:k:articles article:5

......

3) 分页获取用户文章列表,例如下面伪代码获取用户 id = 1 的前10篇文章:

articles = lrange user:1:articles 0 9

for article in {articles}

   hgetall {article}

使用列表保存和获取文章 会存在 两个问题:

  • 如果每次分页获取的文章个数较多,需要执行多次hmgetall操作,此时可以考虑使用Pipeline批量获取,或者考虑将文章数据序列化为字符串类型,使用mget 获取
  • 分页获取文章列表时,lrange命令在列表两端性能较好,但是如果列表较大,获取列表中间范围的元素 性能会变差

列表的使用场景很多,在选择时可以参考一下观点:

  • lpush + lpop = Stack(栈)
  • lpush + rpop = Queue(队列)
  • lpush + bropop = Message Queue(消息队列)



已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页