redis散列若干记录

  1. 字典

    redis本身使用字典结构管理数据

    1. redis使用hash表实现字典结构

      1. 使用了什么hash算法
        1. 使用SipHash算法,该算法能有效防止Hash表碰撞,并有不错的性能
      2. hash冲突怎么解决
        1. 使用链表法解决hash冲突
      3. hash表如何扩容
        1. 渐进式扩容,不会引起线程长期阻塞,redis字典扩容在每次操作数据的时候都执行一次单步扩容操作,将ht0.tablerehashidx的数据迁移到ht1,再将ht0指向ht1
          1. 扩容条件
            1. hash表存储的键值对数量大于等于hash表数组的长度
            2. 开启了dict_can_resize或者负载因子大于dict_force_resize_ratio
    2. hash扩容

      ht0 ---> ht1

      1. 先找到ht0第一个非空索引位
      2. 遍历该索引位链表的所有元素
        1. 计算每个元素在ht1的hash表数组中的索引,将元素移动到ht1
      3. 当ht0的used属性归于0时,则移动全部完成
      4. 释放ht0.table,将ht0指针指向ht1
    3. hash缩容

      1. 执行删除操作后redis会检查字典是否满足缩容(长度大于4&负载因子小于0.1)
    4. 编码

      1. 散列有两种编码类型:OBJ_ENCODING_HTOBJ_ENCODING_ZIPLIST ,使用dict和ziplist结构存储数据,优先使用ziplist存储数据,一个节点存储键,其后驱节点存储值,查找的时候遍历ziplist即可。
        1. 要使用ziplist存储元素需满足以下几个条件:
          1. 散列中所有的键和值的长度小于或等于server.hash_max_ziplist_value(通过hash-max-ziplist-value项配置)
          2. 散列中键值对的数量小于server.hash_max_ziplist_entries

4、集合

  1. 无序集合

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

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

    redis不会降级intset编码!

相关推荐
苦瓜汤补钙9 分钟前
Oracle JDK8 环境配置-Win11
开发语言·数据库·笔记·oracle
一缕清烟在人间22 分钟前
鸿蒙应用开发实战【27】— DatabaseService 数据库初始化
javascript·数据库·harmonyos·鸿蒙系统
ApacheSeaTunnel1 小时前
一套替代四套!同程旅行用 Apache SeaTunnel 搭建多模态统一数据通道
大数据·数据库·ai·开源·数据集成·seatunnel·技术分享·数据同步
段一凡-华北理工大学1 小时前
向量数据库实战:选型、调优与落地~系列文章02:Embedding 嵌入模型选型指南:OpenAI、BGE、Jina、Cohere 横评
大数据·数据库·人工智能·embedding·高炉炼铁·jina·工业智能体
️学习的小王1 小时前
MySQL 数据库基础操作全解:从建库到增删改查
数据库·mysql·oracle
Spider Cat 蜘蛛猫1 小时前
OIDC 联邦 SSO(复旦 OP / 清华 RP)完整全链路(纯标准OIDC、无User Storage SPI、含用户浏览器操作)
数据库·iam
oradh1 小时前
Oracle 11g单库升级至19c单库(dbua图形方式)
数据库·oracle·11g升级19c·dbua升级方式
王九思2 小时前
对称加密与非对称加密详解
java·网络·数据库
周杰伦的稻香2 小时前
(1071, ‘Specified key was too long; max key length is 767 bytes‘)
数据库·mysql
Leo.yuan2 小时前
数据目录和数据字典有什么区别?一文讲清
大数据·数据库·人工智能