redis散列若干记录

  1. 字典

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

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

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

      ht[0] ---> ht[1]

      1. 先找到ht[0]第一个非空索引位
      2. 遍历该索引位链表的所有元素
        1. 计算每个元素在ht[1]的hash表数组中的索引,将元素移动到ht[1]中
      3. 当ht[0]的used属性归于0时,则移动全部完成
      4. 释放ht[0].table,将ht[0]指针指向ht[1]
    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编码!

相关推荐
datalover9 分钟前
spring security自定义表结构处理
数据库·python·spring
hhzz14 分钟前
【回顾MySQL的SQL基础开发与应用】SQL分类与数据类型、视图、触发器以及存储过程与事件
数据库·sql·mysql
百锦再14 分钟前
HashMap、Hashtable、TreeMap异同深度详解
jvm·spring boot·struts·spring cloud·缓存·kafka·tomcat
Howie Zphile16 分钟前
FRAPPE v16 +postgresql +insight+wiki安装
数据库·postgresql·frappe·全面预算
专注VB编程开发20年22 分钟前
C#,VB.NET多台电脑读取REDIS服务器,如何保证数据不会冲突
前端·redis·bootstrap·html
枷锁—sha32 分钟前
【SRC】SSRF (服务端请求伪造) 专项挖掘与实战笔记
数据库·笔记·安全·网络安全
知识分享小能手39 分钟前
SQL Server 2019入门学习教程,从入门到精通,SQL Server 2019 触发器 — 语法知识点及使用方法详解(17)
数据库·学习·sqlserver
tod11343 分钟前
Redis Sentinel 高可用架构:从原理到 Docker 部署全解析
数据库·redis·docker·架构·sentinel
014-code1 小时前
Redis 是如何实现与数据库的一致性呢?
数据库·redis·缓存
清水白石0081 小时前
缓存的艺术:Python 高性能编程中的策略选择与全景实战
开发语言·数据库·python