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

这篇具有很好参考价值的文章主要介绍了Redis(三)存储原理与数据模型(hash冲突、渐进式rehash)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Redis系列文章

Redis(一)原理及基本命令(柔性数组)
Redis(二)网络协议和异步方式(乐观锁&悲观锁)
Redis(三)存储原理与数据模型(hash冲突、渐进式rehash)
Redis跳表


一、redis 存储结构

Redis是key-value的结构,其中value包含:字典,双向链表,压缩列表,跳表,整数数组,动态字符串。
Redis(三)存储原理与数据模型(hash冲突、渐进式rehash),Redis,redis,哈希算法,数据库

存储转换

其中redis中各value的数据结构根据不同的情况有不同的自动存储转换。
Redis(三)存储原理与数据模型(hash冲突、渐进式rehash),Redis,redis,哈希算法,数据库

键值存储实现

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跳表文章来源地址https://www.toymoban.com/news/detail-573392.html

到了这里,关于Redis(三)存储原理与数据模型(hash冲突、渐进式rehash)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • redis 存储原理与数据模型

    redis 数据库通过 dict 实现映射关系。key 的固定类型是 string,value 的类型有多种。 redis 中 KV 组织是通过字典来实现的;hash 结构当节点超过512 个或者单个字符串长度大于 64 时,hash 结构采用字典实现。 dict 由哈希表 dictht + 哈希节点 dictEntry 组成。哈希表有两个,通常 ht[0] 使

    2024年02月14日
    浏览(35)
  • redis存储原理与数据模型学习笔记

    redis-server 命令处理 网络事件的监听 bio close file 异步关闭大文件 bio aof fsync 异步 aof 刷盘 bio lazy free 异步清理大块内存 io thd * io 多线程 emalloc bg thd jemalloc 后台线程 单线程为什么快? server.h dict.h 注意 dictEntry **ht_table[2]; 怎么从key定位到value? 哈希原理: 数组 + hash(key) % 数组长

    2024年02月10日
    浏览(42)
  • Redis数据类型-Hash哈希存储类型

    小白:伟哥,java中的Map集合类型在Redis中有对应的存储吗? 伟哥:有的,我带你撸一波。 Redis的hash哈希存储类型,类似于是java中的map存储结构,适合用来存储对象,每个哈希最多可以存储4294967295(2^32-1)个字段值对,具体数量实际上也受Redis部署的虚拟机上的总内存的限制

    2024年02月12日
    浏览(45)
  • 写点东西《渐进式网络应用入门》

    PWA 是一种渐进式网络应用程序,它结合了应用程序的功能和网络技术。 您可以说它们是使用网络技术构建的应用程序,但感觉和功能都像原生应用程序。 网络应用程序似乎变得有限,因为大多数人更喜欢构建移动应用程序,以便用户可以将它们保存在手机上,而不是构建网

    2024年01月19日
    浏览(45)
  • Vue3 Flask 渐进式入门笔记

    以下均在Windows 10环境下实现。 安装node.js的过程略过。 1、在cmd命令行中执行以下命令: 2、查看vue版本 注意,如果电脑中以前有vue2版本,则需要卸载后重启电脑再重新安装,否则有可能安装失败。 1、执行以下命令以创建项目 第一步需要填写项目名称;后面的除router建议选

    2024年02月09日
    浏览(43)
  • IO/NIO交互模拟及渐进式实现

    2024年02月03日
    浏览(55)
  • 渐进式编程之旅:探寻PHP函数的奇妙世界

    目录 前言 一、函数的定义和调用 1.1 初识函数 1.1.1 函数分类 1.1.2 自定义函数 1.1.3 return 1.2 参数设置 1.2.1 无参函数 1.2.2 按值传递参数 1.2.3 引用传参 1.2.4 设置参数默认值 1.2.5 指定参数类型(弱) 1.3 变量的作用域 1.3.1 变量分类 1.3.2 全局变量的使用 1.3.3 global关键

    2024年02月08日
    浏览(65)
  • 【GitOps系列】如何实施自动化渐进式交付?

    前言 在实施金丝雀发布的过程中,我们通过 Argo Rollout 的金丝雀策略将发布过程分成了 3 个阶段,每个阶段金丝雀的流量比例都不同,经过一段时间之后,金丝雀环境变成了新的生产环境。实际上,这也是一种渐进式的交付方式,它通过延长发布时间来保护生产环境,降低了

    2024年02月14日
    浏览(47)
  • 渐进式web全栈:blazor web app

    本文要说的这种开发模式,这种模式并不是只有blazor支持,js中有一样的方案next.js nuxt.js;blazor还有很多其它内容,本文近关注渐进式开发模式。 是的,前后端是主流,不过以下情况也许前后端分离并不是最好的选择: 小公司,人员不多,利润不高,创业阶段能省则省 个人

    2024年02月05日
    浏览(51)
  • Unity教程||Unity 渐进式光照贴图烘焙详解

    随着各大计算平台的算力稳步增长,特别是GPU技术的不断进化,原先可望而不可及的技术比如实时光线追踪技术开始逐步走入玩家的视野。一些先锋厂商甚至已经超出Demo的范畴,开始正式推出支持实时光追的游戏。 不过目前的实时光追技术还只能在配备了最新Nvidia RTX 20系列

    2024年02月08日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包