Redis为什么快?

参考文章:
渐进式rehash

Redis为什么快?

1.使用内存存储数据
2.单线程避免上下文切换。
3.Redis采用epoll做为I/O多路复用技术的实现,再加上Redis自身的事件处理模型将epoll中的连接,读写,关闭都转换为了事件,不在I/O上浪费过多的时间,使得Redis在网络 IO 操作中能并发处理大量的客户端请求,实现了高吞吐率。
4.渐进式Rehash

redis如何解决哈希冲突的?

Redis 默认使用了两个全局哈希表:哈希表 1 和哈希表 2,我们知道存储hash那么一定会存在哈希冲突的问题。因此redis采用了链式存储+渐进式rehash的方法来减少哈希冲突的问题。

链式存储

这里和HashMap的存储结构类似。
在这里插入图片描述
虽然数组+链表的形式能够减少hash冲突,但仍然会有弊端。当链表特别长的时候,效率仍然特别低。在HashMap中为了解决这个问题会将链表转换成红黑树,以及HashMap会有扩容的逻辑,redis中也类似,当桶中的节点数超过一定的数量时(已插入的元素数量是桶容量的5倍),就会进行相应的优化。

rehash

redis中rehash的核心思想是,增加现有的哈希桶数量,让逐渐增多的 entry 元素能在更多的桶之间分散保存,减少单个桶中的元素数量,从而减少单个桶中的冲突。(这里其实我感觉跟HashMap中的扩容逻辑很像)下面是它的大致流程:

为了使 rehash 操作更高效,Redis 默认使用了两个全局哈希表:哈希表 1 和哈希表 2。一开始,当你刚插入数据时,默认使用哈希表 1,此时的哈希表 2 并没有被分配空间。随着数据逐步增多,Redis 开始执行 rehash,这个过程分为三步:

  1. 给哈希表 2 分配更大的空间,一般是当前哈希表 1 大小的两倍;
  2. 把哈希表 1 中的数据重新映射并拷贝到哈希表 2 中(在hash表2下进行重新计算hash值);
  3. 释放哈希表 1 的空间。

这里和JVM垃圾回收中的复制算法很像。

那么这里同样会带来新的问题,当数组容量特别大的时候,如果发生rehash那么会移动大量的元素,这样仍然会导致redis线程阻塞。因此采用了渐进式rehash

渐进式rehash

渐进式,顾名思义,就是不一次性将所有的数据进行转移,而是一步一步的进行转移,直到最后全部完成。避免了一次性大批量的在两个全局hash表之间拷贝数据造成线程阻塞

渐进式 rehash:在上述第二步拷贝数据时,Redis 仍然正常处理客户端请求,每处理一个请求时,从哈希表 1 中的第一个索引位置开始,顺带着将这个索引位置上的所有 entries 通过rehash放置到哈希表 2 中;等处理下一个请求时,再顺带拷贝哈希表 1 中的下一个索引位置的 entries。

渐进式rehash执行时,除了根据键值对的操作来进行数据迁移,Redis本身还会有一个定时任务在执行rehash,如果没有键值对操作时,这个定时任务会周期性地(例如每100ms一次)搬移一些数据到新的哈希表中,这样可以缩短整个rehash的过程。综上所述:两种rehash的时机:每次redis处理客户端发送的请求时:一次只搬迁1个桶redis本身的定时任务:一次执行1毫秒,最少搬迁100个桶

思考:一个桶本来已经rehash了再有新增的entry该怎么办?

在进行渐进式 rehash 的过程中, 字典会同时使用 ht[0] 和 ht[1] 两个哈希表, 所以在渐进式 rehash 进行期间, 字典的删除(delete)、查找(find)、更新(update)等操作会在两个哈希表上进行: 比如说, 要在字典里面查找一个键的话, 程序会先在 ht[0] 里面进行查找, 如果没找到的话, 就会继续到 ht[1] 里面进行查找, 诸如此类。 另外, 在渐进式 rehash 执行期间, 新添加到字典的键值对一律会被保存到 ht[1] 里面, 而 ht[0] 则不再进行任何添加操作: 这一措施保证了 ht[0] 包含的键值对数量会只减不增, 并随着 rehash 操作的执行而最终变成空表。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/341020.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python基础】一文搞懂:Python 中 Excel 文件的写入与读取

文章目录 1 引言2 使用 openpyxl2.1 安装 openpyxl2.2 写入 Excel 文件2.3 读取 Excel 文件 3 使用 pandas3.1 安装 pandas 和 openpyxl3.2 写入 Excel 文件3.3 读取 Excel 文件 4 实例演示4.1 安装所需库4.2 封装为excel_example.py脚本文件 5 注意事项6 总结 1 引言 在现代办…

第十一章 Cookie

第十一章 Cookie 1.什么是Cookie2.Cookie的创建3.Cookie的获取4.Cookie值的修改5.谷歌浏览器和火狐浏览器如何查看Cookie6.Cookie的存活设置7.Cookie的path属性8.Cookie练习之免用户名登入 1.什么是Cookie 2.Cookie的创建 下面我看看如何创建Cookie,如何让客户端保…

86.乐理基础-记号篇-速度记号

内容来源于:三分钟音乐社 上一个内容:85.乐理基础-记号篇-力度记号-CSDN博客 速度记号在下方两个里面已经写过一部分了,这些标记总体上是属于 不变速度 的标记,比如一首乐谱就记了 每分钟60拍,那整首速度就都是不变的…

云服务器哪家便宜?5个优惠云主机推荐

作为多年站长使市面上大多数的云厂商的云服务器都使用过,很多特价云服务器都是新用户专享的,本文有老用户特价云服务器,阿腾云atengyun.com有多个网站、小程序等,国内头部云厂商阿里云、腾讯云、华为云、UCloud、京东云都有用过&a…

互联网加竞赛 基于大数据的社交平台数据爬虫舆情分析可视化系统

文章目录 0 前言1 课题背景2 实现效果**实现功能****可视化统计****web模块界面展示**3 LDA模型 4 情感分析方法**预处理**特征提取特征选择分类器选择实验 5 部分核心代码6 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 基于大数据…

代码随想录day25 回溯算法加强练习

216.组合总和III 题目 找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。 说明: 所有数字都是正整数。解集不能包含重复的组合。 示例 1: 输入: k 3, n 7 输出: [[1,2,4]] 示例 2: 输入…

数字信号处理实验---LSI系统的分析 Matlab代码

1.试用Matlab计算其幅频特性和相频特性,并绘图。 代码: n 0:10; %定义采样点n w [0:1:500]*2*pi/500; % [0,pi]轴被分成1002个点 x1 power(0.9*exp(1i*pi/3),n); %定义输入序列 x2 exp(-1i*n); %定义一个系统的冲激响应 x zeros(1,length(w))…

RK3568驱动指南|第十篇 热插拔-第118章 使用udev挂载U盘和T卡实验

瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工…

Backtrader 文档学习-Strategy with Signals

Backtrader 文档学习-Strategy with Signals backtrader可以不通过重写策略的方式触发交易,尽管重写策略是首选通用的方式。 下面介绍通过使用信号也是可以实现交易触发的。 1.定义signal import backtrader as btdata bt.feeds.OneOfTheFeeds(datanamemydatana…

关于报错 curl: (56) Recv failure: Connection reset by peer

curl ip没问题 curl localhost 则报错 curl: (56) Recv failure: Connection reset by peer 出现这个报错有很多原因, 其中之一就是terminal代理 而关闭代理应用之后, 其实由于配置的终端都是 export指定的代理 所以导致还是一直报错. 通过 curl -v 可以发现 指向了代理ip和…

【HarmonyOS4.0】第八篇-ArkUI系统组件(三)

【HarmonyOS4.0】第七篇-ArkUI系统组件(三) 七、二维码组件 二维码的使用场景,比如扫码添加好友,扫码骑车,扫码支付等等,ArkUI开发框架提供了 RQCode 组件生成一个二维码。 接口: QRCode(value: string)参数: 参数…

一起来了解综合能源服务认证

首先,综合能源服务认证是有国家政策支持的, 《能源生产和消费革命战略(2016-2030)》中指出:1、能源生产端要以绿色低碳为方向,推动能源集中式和分布式开发并举,大幅提高新能源和可再生能源比重&#xff1b…