Redis之常用数据结构哈希表

 更新时间:2023年04月11日 11:41:48   作者:奔赴在自己的热爱中  
这篇文章主要介绍了Redis常用的数据结构哈希表,哈希表是一种保存键值对的数据结构,具有一定的参考价值,需要的朋友可以参考阅读

哈希表是一种保存键值对(key-value)的数据结构

哈希表优点在于,它能以 O(1) 的复杂度快速查询数据。

怎么做到的呢?

将 key 通过 Hash 函数的计算,就能定位数据在表中的位置,因为哈希表实际上是数组,所以可以通过索引值快速查询到数据。

在哈希表大小固定的情况下,随着数据不断增多,那么哈希冲突的可能性也会越高。

Redis 采用了**「链式哈希」**来解决哈希冲突,在不扩容哈希表的前提下,将具有相同哈希值的数据串起来,形成链接起,以便这些数据在表中仍然可以被查询到

1.哈希冲突

哈希表实际上是一个数组,数组里的每一个元素就是一个哈希桶

当一个键值对的键经过 Hash 函数计算后得到哈希值,再将(哈希值 % 哈希表大小)取模计算,得到的结果值就是该 key-value 对应的数组元素位置,也就是第几个哈希桶

当有两个以上数量的 kay 被分配到了哈希表中同一个哈希桶上时,此时称这些 key 发生了冲突

2.链式哈希

链式哈希是怎么实现的?

实现的方式就是每个哈希表节点都有一个 next 指针,用于指向下一个哈希表节点,因此多个哈希表节点可以用 next指针构成一个单项链表,被分配到同一个哈希桶上的多个节点可以用这个单项链表连接起来,这样就解决了哈希冲突。

随着链表长度的增加,在查询这一位置上的数据的耗时就会增加,因为链表的查询的时间复杂度是 O(n)。

3.rehash

Redis 定义一个 dict 结构体,这个结构体里定义了两个哈希表(ht[2])

之所以定义了 2 个哈希表,是因为进行 rehash 的时候,需要用上 2 个哈希表
在正常服务请求阶段,插入的数据,都会写入到「哈希表 1」,此时的「哈希表 2 」 并没有被分配空间。

随着数据逐步增多,触发了 rehash 操作,这个过程分为三步:

1.给「哈希表 2」 分配空间,一般会比「哈希表 1」 大 2 倍;
2.将「哈希表 1 」的数据迁移到「哈希表 2」 中;
3.迁移完成后,「哈希表 1 」的空间会被释放,并把「哈希表 2」 设置为「哈希表 1」,然后在「哈希表 2」 新创建一个空白的哈希表,为下次 rehash 做准备。

第二步很有问题,如果「哈希表 1 」的数据量非常大,那么在迁移至「哈希表 2 」的时候,因为会涉及大量的数据拷贝,此时可能会对 Redis 造成阻塞,无法服务其他请求

4.渐进式 rehash

为了避免 rehash 在数据迁移过程中,因拷贝数据的耗时,影响 Redis 性能的情况

渐进式 rehash 步骤如下:

1.给「哈希表 2」 分配空间;
2.在 rehash 进行期间,每次哈希表元素进行新增、删除、查找或者更新操作时,Redis 除了会执行对应的操作之外,还会顺序将「哈希表 1 」中索引位置上的所有 key-value 迁移到「哈希表 2」 上;
3.随着处理客户端发起的哈希表操作请求数量越多,最终在某个时间点会把「哈希表 1 」的所有 key-value 迁移到「哈希表 2」,从而完成 rehash 操作。

把一次性大量数据迁移工作的开销,分摊到了多次处理请求的过程中,避免了一次性 rehash 的耗时操作

1.查找一个 key 的值的话,先会在「哈希表 1」 里面进行查找,如果没找到,就会继续到哈希表 2 里面进行找到。

2.新增一个 key-value 时,会被保存到「哈希表 2 」里面,而「哈希表 1」 则不再进行任何添加操作,这样保证了「哈希表 1 」的 key-value 数量只会减少,随着 rehash 操作的完成,最终「哈希表 1 」就会变成空表

5.rehash 触发条件

触发条件跟**负载因子(load factor)**有关系。

主要有两个:

1.当负载因子大于等于 1 ,并且 Redis 没有在执行 bgsave 命令或者 bgrewiteaof 命令,也就是没有执行 RDB 快照或没有进行 AOF 重写的时候,就会进行 rehash 操作。
2.当负载因子大于等于 5 时,此时说明哈希冲突非常严重了,不管有没有有在执行 RDB 快照或 AOF 重写,都会强制进行 rehash 操作

到此这篇关于Redis之常用数据结构哈希表的文章就介绍到这了,更多相关Redis哈希表内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解redis端口号

    详解redis端口号

    在本篇内容中我们给大家整理了关于redis端口号的相关知识点内容,有兴趣的朋友们学习下。
    2019-06-06
  • 浅谈Redis安全策略

    浅谈Redis安全策略

    Redis 提供了诸多安全策略,比如为了保证数据安全,提供了设置密码的功能。本文就详细的介绍了一下Redis安全策略,具有一定的参考价值,感兴趣的可以了解一下
    2021-11-11
  • Redis删除过期key策略详解

    Redis删除过期key策略详解

    Redis是一款高性能的开源内存数据库,广泛应用于缓存、消息队列、实时分析等场景,在Redis中,我们经常需要删除过期的key,以释放内存空间并保持数据的有效性,本文将为您详细介绍Redis的过期key删除策略,帮助您更好地管理和优化Redis数据库
    2023-10-10
  • redis中Hash字典操作的方法

    redis中Hash字典操作的方法

    redis支持五大数据类型,只支持第一层,也就说字典的value值,必须是字符串,本文主要介绍了redis中Hash字典操作,感兴趣的可以了解一下
    2021-07-07
  • 深入解析Redis中常见的应用场景

    深入解析Redis中常见的应用场景

    这篇文章主要给大家介绍了关于Redis中常见的应用场景的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-09-09
  • Redis如何统计用户访问量

    Redis如何统计用户访问量

    这篇文章主要介绍了Redis如何统计用户访问量问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • Redis 事务知识点相关总结

    Redis 事务知识点相关总结

    这篇文章主要介绍了Redis 事务相关总结,帮助大家更好的理解和学习使用Redis,感兴趣的朋友可以了解下
    2021-03-03
  • Windows下Redis的安装使用教程

    Windows下Redis的安装使用教程

    这篇文章主要以图文结合的方式为大家详细介绍了Windows下Redis的安装使用,Redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部分场合可以对关系数据库起到很好的补充作用,对Redis感兴趣的小伙伴们可以参考一下
    2016-05-05
  • Centos7.3安装Redis4.0.6详细图文教程

    Centos7.3安装Redis4.0.6详细图文教程

    这篇文章主要介绍了Centos7.3安装Redis4.0.6详细教程图解,本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-10-10
  • 浅谈Redis 缓存的三大问题及其解决方案

    浅谈Redis 缓存的三大问题及其解决方案

    Redis 经常用于系统中的缓存,这样可以解决目前 IO 设备无法满足互联网应用海量的读写请求的问题。本文主要介绍了浅谈Redis 缓存的三大问题及其解决方案,感兴趣的可以了解一下
    2021-07-07

最新评论