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


    LIST

    该数据类似于数据结构中的队列,但是该结构能够在两端j添加与获取
    在这里插入图片描述

    常用命令

    • 将一个或多个值value插入到key列表的表头(最左边)

      LPUSH  key  value [value ...] 
      
      • 1
    • 将一个或多个值value插入到key列表的表尾(最右边)

      RPUSH  key  value [value ...]	
      
      • 1
    • 移除并返回key列表的头元素

      LPOP  key
      
      • 1
    • 移除并返回key列表的尾元素

      RPOP  key	
      
      • 1
    • 返回列表key中指定区间内的元素,区间以偏移量start和stop指定

      LRANGE  key  start  stop
      
      • 1
    • 从key列表表头弹出一个元素,若列表中没有元素,阻塞等待 timeout秒,如果timeout=0,一直阻塞等待

      BLPOP  key  [key ...]  timeout	
      
      • 1
    • 从key列表表尾弹出一个元素,若列表中没有元素,阻塞等待 timeout秒,如果timeout=0,一直阻塞等待

      BRPOP  key  [key ...]  timeout 
      
      • 1
    • 不常用

      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 
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8

    底层结构

    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宕机

    总结

    • 该结构更像一个数据队列,能够方便实现分布式的数据结构
    • 在小数据量的队列等操作时可以用该结构来解决,避免资源浪费
  • 相关阅读:
    代码随想录训练营二刷第四十四天 | 01背包问题 416. 分割等和子集
    嵌入式开发:当用微控制器构建嵌入式GUI时,有哪些注意事项
    C程序设计(第五版) 第一章节 程序设计和C语言
    vue 路由报错
    如何使用jenkins、ant、selenium、testng搭建自动化测试框架
    Node 版本切换
    学习Android的第二十六天
    数据结构(12)Dijkstra算法JAVA版:图的最短路径问题
    【华为机试题 HJ108】求最小公倍数
    Git详解
  • 原文地址:https://blog.csdn.net/at10090/article/details/126784324