【Redis 系列】redis 学习 17,redis 存储结构原理 1

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 我正在参与掘金创作者训练营第4期,点击了解活动详情,一起学习吧!

【Redis 系列】redis 学习 17,redis 存储结构原理 1

我正在参与掘金创作者训练营第4期,点击了解活动详情,一起学习吧!

关于 redis 相信大家都不陌生了,之前有从 0 -1 分享过 redis 的基本使用方式,用起来倒是都没有啥问题了,不过还是那句话,会应用之后,我们必须要究其原理,知其然知其所以然

今天我们来分享一下关于 redis 的存储结构的原理

redis 的存储结构的原理

我们都知道 redis 是一个 K-V 内存数据库,类似于 memcache ,那么一般存储这种 K-V 键值对的数据结构是什么呢?

红黑树 , 那么我们对于红黑树的增删改查的时间复杂度是 O(logN),对于红黑树而言,只要内存足够,那么这个 N 是可以无限大的

这对于 redis 来说是没有办法满足 redis 的需求,那么我们是否可以将复杂度降低到 O(1) 呢,感兴趣的,我们可以来探索一下?


hash 表

能满足 O(1) 时间复杂度的数据结构有啥呢?我们是不是可以想到 hash 表

具体 hash 表是怎样的一种结构,前面有文章已经分享过一些,redis 基础性的数据结构可以查看历史文章:【Redis 系列】redis 学习四,set 集合,hash 哈希,zset 有序集合初步

redis 的 key 支持哪些类型?

redis 支持的 key 有:

  • long
  • double
  • int
  • string  - 可见的字符串和二进制字符串,key 都是 string 类型

实际上最终到 redis 处理的时候,上述类型,都是对应按照 sring 类型进行存储的

这个 key 是有规律的 key,并且是强随机性的

redis 的 value 支持哪些类型?

  • string
  • list
  • set
  • zset
  • hash
  • Geospatial 地理位置
  • Hyperloglog 基数统计
  • Bitmap 位图场景

我们知道 O(1) 的索引时间复杂度数组就是一个很好的例子,我们访问数组元素的时候,直接通过下标访问即可

那么对应 hash 表,其实就是 数组 + hash 函数 来进行处理的,数组的下标索引就是 hash 函数 对 key(字符串) 进行 hash 算法计算出来的一个整数

例如这样

image.png

通过 hash 函数计算出来的整数是一个 64 位 的整型

hash 冲突

使用上述 hash 表的话,肯定会出现 hash 冲突,hash 冲突是什么样的效果呢?

就向上面的对 key (是一个各种组合的字符串),进行 hash 计算之后,得到一个整型的值,这个值是 64 位的整型

这也就意味着, key 的字符串组合是无限的,但是 64 整型的大小是固定的,总有有机会字符串计算出来的整数是会重复的,这个时候就出现了 hash 冲突

咱们可以举一个类型的形象例子:

假如说有 3 个盒子,4 个苹果,苹果要装在盒子里面,那么至少有一个抽屉是会放 2 个苹果,图下图所示,那么放 2 个苹果的这个抽屉就出现了 hash 冲突,就需要解决

image.png

例如放到我们的 hash 表中,数组大小我们设定了长度为 3,那么所有的整数我们都要对 3 取余,然后就结果对号入座

解决 hash 冲突

根据上述情况,出现了 hash 冲突,我们需要如何处理呢,如何才能解决 hash 冲突?

解决冲突的方式:

  • 使用链表,也就是链地址法 , 数组 + 链表的 方式

image.png

将出现冲突的元素,插入到以原有冲突元素作为链表头的链表中,使用头插法

一般是使用头插法这是遵循缓存淘汰算法的逻辑原理 LRU

数据库也是使用的头插法,表示新插入的数据,是最近就要使用的

  • 再使用一个 hash 函数来进行计算,得出另一个值,这是 再 hash 法
  • 再加一个数组来存放冲突的数据(这种方式不太好)

image.png

原有数组的每一个坑占一个放一个萝卜,如果有冲突出现,那么就把出现冲突的元素放到冲突数组中,并记下他所在冲突数组的索引位置,这个比较麻烦,不可持续

扩容和缩容

那么当咱们数据量比较大的时候,发生 hash 冲突的情况就会比较多,若大部分时间都是去解决冲突了,那么非常低效的,因此需要扩容

扩容的原则又是如何扩容的呢?

扩容的时候是,当持久化的数据量大于数组长度的时候,就会进行翻倍的扩容,例如上述 数组长度为 3 ,当我们有 4 个 或者 5 个数据的时候,数组的长度会扩到 6,12, 24 ...  这样的来进行翻倍扩容

那么 缩容的时候,是不是也是要进行翻倍缩容的?

我们可以来看看效果,如果是翻倍缩容的话

image.png

如果是翻倍缩容的话,就会出现这么一个情况,原有数组长度为 4,如果数据变成 5 个,就会翻倍扩容数组长度为 8,如果数据又变回 4 个,那么数组长度又会翻倍缩容到长度为 4

就会出现上述的这类情况,可能会存在一会扩容,一会缩容,这是非常消耗资源和性能和,因此定了一个数据是 当数据量小于数组长度的 10% 的时候,会进行缩容

本次暂且分享这么多,下一部分分享具体的 hash 表在 redis 中的数据结构,和具体的实现方式

今天就到这里,学习所得,若有偏差,还请斧正

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

image.png

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~


相关实践学习
基于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
相关文章
|
16天前
|
缓存 NoSQL Apache
【Redis】布隆过滤器原理与应用
【Redis】布隆过滤器原理与应用
20 1
|
1月前
|
存储 NoSQL 算法
09- Redis分片集群中数据是怎么存储和读取的 ?
Redis分片集群使用哈希槽分区算法,包含16384个槽(0-16383)。数据存储时,通过CRC16算法对key计算并模16383,确定槽位,进而分配至对应节点。读取时,根据槽位找到相应节点直接操作。
66 12
|
1月前
|
存储 缓存 NoSQL
深入解析Redis:一种快速、高效的键值存储系统
**Redis** 是一款高性能的键值存储系统,以其内存数据、高效数据结构、持久化机制和丰富的功能在现代应用中占有一席之地。支持字符串、哈希、列表、集合和有序集合等多种数据结构,适用于缓存、计数、分布式锁和消息队列等场景。安装Redis涉及下载、编译和配置`redis.conf`。基本操作包括键值对的设置与获取,以及哈希、列表、集合和有序集合的操作。高级特性涵盖发布/订阅、事务处理和Lua脚本。优化策略包括选择合适数据结构、配置缓存和使用Pipeline。注意安全、监控和备份策略,以确保系统稳定和数据安全。
309 1
|
2月前
|
存储 NoSQL 算法
【Redis技术进阶之路】「底层源码解析」揭秘高效存储模型与数据结构底层实现(字典)(二)
【Redis技术进阶之路】「底层源码解析」揭秘高效存储模型与数据结构底层实现(字典)
54 0
|
2天前
|
负载均衡 NoSQL 关系型数据库
深入浅出Redis(六):Redis的主从架构与主从复制原理
深入浅出Redis(六):Redis的主从架构与主从复制原理
|
2天前
|
存储 NoSQL 算法
深入浅出Redis(三):Redis数据的存储、删除以及淘汰
深入浅出Redis(三):Redis数据的存储、删除以及淘汰
|
11天前
|
监控 NoSQL 算法
深入剖析Redis哨兵模式的原理和应用
Redis的哨兵模式是实现高可用性和自动故障转移的机制,当主服务器故障时,哨兵能自动检测并进行故障转移,确保服务连续和稳定性。哨兵模式通过监控主从服务器状态、自动故障转移、防止数据不一致,提高容错能力和负载均衡,降低运维成本,实现高可用性。哨兵通过检测主观下线和客观下线状态,以及选举Leader Sentinel来协调故障转移。Raft算法在其中用于领导者选举和状态一致性。哨兵模式通过综合考虑多种因素选举新主服务器并执行故障转移,保障集群稳定运行。
47 0
深入剖析Redis哨兵模式的原理和应用
|
16天前
|
NoSQL Redis
Redis入门到通关之Redis主从数据同步原理
Redis入门到通关之Redis主从数据同步原理
25 0
|
16天前
|
存储 NoSQL Redis
Redis入门到通关之Redission原理
Redis入门到通关之Redission原理
20 0
|
16天前
|
缓存 NoSQL 算法
【redis】布隆过滤器(Bloom Filter)原理解析与应用
【redis】布隆过滤器(Bloom Filter)原理解析与应用
22 1