Redis核心数据结构【list】【从入门到入坟】

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…以此类推,中间数据并不频繁访问

ziplist详细

quicklist详细

实际应用

  • 分布式常用数据结构

    • Stack(栈) = LPUSH + LPOP
      Queue(队列)= LPUSH + RPOP
      Blocking MQ(阻塞队列)= LPUSH + BRPOP
  • 微博/微信公号消息流

    • 推:公号推流,用户队列访问压力小,维护成本高,在大量关注公号情况下推送量大

      • 张三关注了李四,王五等大V
        1. 李四发微博,消息ID为10086LPUSH msg:{张三-ID} 10086

        2. 王五发微博,消息ID为10010 LPUSH msg:{王五-ID} 10010

        3. 查看最新微博消息LRANGE msg:{王五-ID} 0 4

    • 拉:拉取公号队列,单点访问压力高存在上限,维护成本低,在大量关注公号情况下,同时访问人过多容易导致redis宕机

总结

  • 该结构更像一个数据队列,能够方便实现分布式的数据结构
  • 在小数据量的队列等操作时可以用该结构来解决,避免资源浪费
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嘿嘿嘿1212

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值