redis集合若干记录

  1. 无序集合

    redis通常使用字典结构保存集合数据,字典健存储集合元素,字典值为空。如果一个集合全为整数,使用字典就有点浪费了,redis使用intset保存。

    1. 插入元素到intset中
      1. 获取插入元素编码,如果插入元素编码级别高于intset编码,intset的编码则需要升级
      2. 通过二分查找插入元素是否为重复插入,是,则插入失败,否,则赋值
      3. 为intset重新分配内存空间(分配插入元素所需空间),若插入位置存在后驱节点,后驱节点全部后移
      4. 更新intset的len值
    2. intset升级编码
      1. 设置新的编码,然后分配新的内存空间
      2. 将intset的元素移动到新位置
      3. 然后插入新的元素

    redis不会降级intset编码!

  2. 有序集合

    当数据都是有序的时候,则使用数组和链表进行存储。redis中的skiplist既能通过二分查找元素,又能快速插入数据

    1. skiplist

      skiplist是一个多层级链表结构。

      1. skiplist查找元素

        1. 当查找元素的时候需要从最高层进行查找。
        2. 如果存在后驱节点并且后驱节点小于目标值,则沿forward继续寻找。
        3. 如果节点等于目标值则返回,否则降一级查找。

        在这里插入图片描述 2. skiplist插入元素

        1. 查找每层插入位置的前驱节点
        2. 随机生成新节点的层数
        3. 新节点的层数比其他节点大的时候,skiplist需要添加新的层数
          1. 因为头层数需要大于等于其他节点的层数,所以要在头节点添加新的层,头节点新增的层为skiplist的长度。
          2. 因为skiplist的头节点预先就分配好了最大层内存,所以不用再分配内存
        4. 创建节点,遍历各层,插入新节点并更新前后节点的属性。
        5. 如果存在一个节点的层数比新节点的层数大,则其前驱节点的要加1
        6. 设置新节点的backward值,更新skiplist.length属性

    有序集合通过ziplist和skiplist存储元素,所以它有两种编码OBJ_ENCODING_ZIPLIST和OBJ_ENCODING_SKIPLIST。

    只有 有序集合元素数量小于或等于配置中的server.zset_max_ziplist_entries和有序集合元素长度小于或等于配置中的server.zset_max_ziplist_value时才使用ziplist存储有序集合。

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值