铁匠 铁匠
首页
收藏
java
架构之路
常用算法
  • Java
  • nginx
  • 系统运维
  • 系统安全
  • mysql
  • redis
参考文档
关于
链接
  • 分类
  • 标签
  • 归档

专注、不予评判地关注当下
首页
收藏
java
架构之路
常用算法
  • Java
  • nginx
  • 系统运维
  • 系统安全
  • mysql
  • redis
参考文档
关于
链接
  • 分类
  • 标签
  • 归档
  • mysql

  • redis

    • redis key-value 存储结构及扩容
      • 全局key-value存储结构
      • redis 如何解决哈希冲突问题
      • 参考
    • redis 数据类型对应的数据结构
    • redis 数据持久化
  • 数据库
  • redis
fengjx
2022-12-04
目录

redis key-value 存储结构及扩容

# 全局key-value存储结构

redis 是一个key-value数据库(当然value本身也支持很多数据类型),和 java 的 HashMap 一样,内部是使用数组+链表实现的 hash 存储结构。

# redis 如何解决哈希冲突问题

随着元素数量增加,哈希冲突的元素会比较多,查询复杂度会从O(1)退化成O(N)。这时候就需要考虑如何扩容数组数量来减少哈希冲突。

redis 对全局哈希表做扩容,称为rehash。内部会有两个哈希表,一个用于数据存储(ht[0]),另一个用来扩容(ht[1])。

扩容步骤:

  1. 为ht[1]分配一个更大的空间
  2. 将ht[0]数据拷贝到ht[1]
  3. 释放ht[0],作为下次rehash的扩容哈希表

在第二部迁移数据时,redis 会阻塞用户请求,如果数据量比较大,会影响性能,所以 redis 采用了渐进式迁移方案。

  1. 次接收用户请求时,就会从ht[0]的数组下标0的位置开始迁移 entry 数据,每次只迁移一部分,避免长时间阻塞用户请求
  2. 后台线程周期性迁移数据

在rehash过程中,查找、删除、更新操作会在两个哈希表进行(双写),新增操作只在ht[1]进行。

源码:https://github.com/redis/redis/blob/unstable/src/dict.c#L1063 (opens new window)

# 参考

  • https://tech.meituan.com/2018/07/27/redis-rehash-practice-optimization.html (opens new window)
  • https://github.com/doocs/advanced-java/blob/main/docs/high-concurrency/redis-rehash.md (opens new window)
#redis
mycli-强大的MySQL命令行客户端
redis 数据类型对应的数据结构

← mycli-强大的MySQL命令行客户端 redis 数据类型对应的数据结构→

最近更新
01
策略模式
01-09
02
模板方法
01-06
03
观察者模式
01-06
更多文章>
Theme by Vdoing | Copyright © 2016-2023 铁匠 | 粤ICP备15021633号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式