• 【Redis】集合对象和有序集合对象


    无序集合

    • 集合对象的编码可以是intset 或者 hashtable

    • intset 编码的集合对象使用整数集合作为底层实现,集合对象包含的所有元素都被保存在整数集合里面
      在这里插入图片描述

    • hashtable编码的集合对象使用字典作为底层实现,字典的每个键都是一个字符串对象,每个字符串对象包含了一个集合元素,而字典的只则全部被设置为NULL
      在这里插入图片描述

    • 编码转换的规则

      • 当集合对象可以同时满足以下两个条件时,对象使用intset 编码
        • 集合对象保存的元素都是整数值
        • 集合对象保存的元素不能超过512个
      • 反之,则使用hashtable 实现
      • 强调一下,如上规则可以修改参数 set-max-intset-entries
      • 当使用intset编码所需的以上两个条件的任意一个不能被满足时,对象的编码转换操作就会被执行 ,编码也会从intset 变成 hashtable

    有序集合

    • 有序集合的编码可以是ziplist或者skiplist

      • ziplist编码的有序集合对象使用压缩列表作为底层实现,每个集合元素使用两个紧挨在一起的压缩列表节点来保存,第一个节点保存元素的成员(member),而第二个元素则保存元素的分值
      • 压缩列表内的集合元素按分值从小到大进行排序,分值较小的元素被放置在靠近表头的位置,而分值较大的元素则被放置在靠近表尾的位置
        在这里插入图片描述
      • skiplist编码的有序集合对象中的集合元素按照分值从小到大进行排序每个跳跃表节点都保存一个集合元素和分值
      • 每个元素的分值都是一个double类型的浮点数
      • 需要说明的是,虽然同时使用跳跃表和字典保存有序集合元素,但是两种数据结构都会通过指针共享相同的元素和分值,避免浪费额外的内存
        在这里插入图片描述
        在这里插入图片描述
    • 编码转换的规则

      • 当集合对象可以同时满足以下两个条件时,对象使用ziplist 编码
        • 有序集合对象保存的元素小于128个
        • 有序集合保存的所有元素成员的长度都小于64字节
      • 反之,则使用skiplist 实现
      • 强调一下,如上规则可以修改参数 zset-max-ziplist-entries 和 zset-max-ziplist-value
      • 当使用ziplist编码所需的以上两个条件的任意一个不能被满足时,对象的编码转换操作就会被执行 ,编码也会从ziplist 变成 skiplist
    • 为什么有序集合需要同时使用跳跃表和字典来实现呢?

      • 主要是从性能上来讲,跳跃表适合范围查找,字典则使用元素直接获取数据,字典是无序的,所以需要额外开辟新的内存空间进行排序。
  • 相关阅读:
    uniapp同步将本地图片转换为base64,支持微信、H5、APP
    【每日一题】74. 搜索二维矩阵
    SpringMVC实训内容
    vue 封装菜单组件 来回跳转使菜单高亮
    代码随想录训练营二刷第四十一天 | 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯
    数据预处理
    根据先序遍历和中序遍历生成后序遍历
    SpringBoot学习小结之分库分表、读写分离利器Shardingsphere
    深度学习实战60-基于深度学习模型搭建人脸识别系统,用最简单的方式实现人脸识别。
    客户端发现pod并与之通信
  • 原文地址:https://blog.csdn.net/weixin_40172337/article/details/127131537