Redis(三)存储原理与数据模型(hash冲突、渐进式rehash)

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: Redis(三)存储原理与数据模型(hash冲突、渐进式rehash)



一、redis 存储结构

Redis是key-value的结构,其中value包含:字典,双向链表,压缩列表,跳表,整数数组,动态字符串。

存储转换

其中redis中各value的数据结构根据不同的情况有不同的自动存储转换。

键值存储实现

redis 中 K-V 组织是通过字典来实现的,也就是hash表。key字符串经过 hash 函数运算得到 64 位整数;

hash冲突

redis采用hash表存储key-value就会遇到hash冲突的情况。常见的hash冲突解决方式有:

  • 开链法:将hash冲突的value值用链表连接,每个hash结果的key值下面都连接一个链表。如果链表过长还可以将链表转化为红黑树来优化。
  • rehash:即增加hash桶的大小。redis有两个hash表,当hash表1冲突了,就会采用hash表2,而hash表2的hash桶大小通常是hash表1的2倍。

但是rehash时,将hash表1的数据复制到hash表2是一个庞大的工程,可能会造成redis线程阻塞,影响redis性能。因此redis有渐进式rehash的机制来解决这个问题。

渐进式rehash

渐进式rehash和rehash一样,同样需要将hash表1的数据复制到hash表2,但是这个复制过程不是一次性的,而是一步一步分块转移。

redis的渐进式有两种规则:

  1. 分治的思想,将 rehash 分到之后的每步增删改查的操作当中,即每次处理redis时,复制一个key;
  2. 在定时器中,最大执行一毫秒 rehash ;每次复制100 个数组key槽位;

rehash 过程中如果入到增删查改时会怎么做?

  • 查:查找数据时,会先在hash表1中查找数据,如果没找到就会在hash表2中去找。
  • 增:新增数据时,只会增加到hash表2中,不会在hash表1做任何操作。
  • 删&改:在两个表上都会操作。

redis除了扩容会有渐进式rehash,其实缩容时也会采用rehash。

但是在rehash阶段,不会再发生扩容和缩容。必须等rehash结束。

大KEY

在 redis 实例中假如形成了很大的对象,比如一个很大的 hash 或很大的 zset,这样的对象在扩容的时候,会一次性申请更大的一块内存,这会导致卡顿;如果这个大 key 被删除,内存会一次性回收,卡顿现象会再次产生;如果观察到 redis 的内存大起大落,极有可能因为大 key 导致的;

解决方法:

  • 拆分value
  • 压缩value
  • 删除非热点大key(可使用redis异步机制删除)

跳表

Redis 中的有序集合(Sorted Set)是用跳表(Skip list)来实现的。跳表就是解决链表在有序节点场景下的查询时间复杂度高问题。时间复杂度能达到O(logn)。

详细内容参考Redis跳表

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
19天前
|
存储 缓存 NoSQL
深入解析Redis:一种快速、高效的键值存储系统
**Redis** 是一款高性能的键值存储系统,以其内存数据、高效数据结构、持久化机制和丰富的功能在现代应用中占有一席之地。支持字符串、哈希、列表、集合和有序集合等多种数据结构,适用于缓存、计数、分布式锁和消息队列等场景。安装Redis涉及下载、编译和配置`redis.conf`。基本操作包括键值对的设置与获取,以及哈希、列表、集合和有序集合的操作。高级特性涵盖发布/订阅、事务处理和Lua脚本。优化策略包括选择合适数据结构、配置缓存和使用Pipeline。注意安全、监控和备份策略,以确保系统稳定和数据安全。
252 1
|
29天前
|
存储 NoSQL 算法
【Redis技术进阶之路】「底层源码解析」揭秘高效存储模型与数据结构底层实现(字典)(二)
【Redis技术进阶之路】「底层源码解析」揭秘高效存储模型与数据结构底层实现(字典)
47 0
|
2天前
|
存储 NoSQL 算法
Redis入门到通关之Redis数据结构-Hash篇
Redis入门到通关之Redis数据结构-Hash篇
10 1
|
2天前
|
NoSQL Redis
Redis入门到通关之Redis主从数据同步原理
Redis入门到通关之Redis主从数据同步原理
|
2天前
|
存储 缓存 NoSQL
Redis入门到通关之Hash命令
Redis入门到通关之Hash命令
|
17天前
|
运维 NoSQL 算法
Java开发-深入理解Redis Cluster的工作原理
综上所述,Redis Cluster通过数据分片、节点发现、主从复制、数据迁移、故障检测和客户端路由等机制,实现了一个分布式的、高可用的Redis解决方案。它允许数据分布在多个节点上,提供了自动故障转移和读写分离的功能,适用于需要大规模、高性能、高可用性的应用场景。
16 0
|
29天前
|
存储 NoSQL Redis
作者推荐 |【Redis技术进阶之路】「原理系列开篇」揭秘高效存储模型与数据结构底层实现(SDS)(三)
作者推荐 |【Redis技术进阶之路】「原理系列开篇」揭秘高效存储模型与数据结构底层实现(SDS)
33 0
|
1月前
|
NoSQL 关系型数据库 MySQL
LAMP+Redis详解(一)——基本原理
LAMP+Redis详解(一)——基本原理
16 1
|
1月前
|
NoSQL Redis
[Redis]——主从同步原理(全量同步、增量同步)
[Redis]——主从同步原理(全量同步、增量同步)
|
存储 NoSQL Redis
Redis命令——哈希(Hash)
Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。 Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)。
1462 0

热门文章

最新文章