当前位置: 首页 > news >正文

Redis超高并发分key实现

Redis扛并发的能力是非常强的,所以高并发场景下经常会使用Redis,但是Redis单分片的写入瓶颈在2w左右,读瓶颈在10w左右,如果在超高并发下即使是集群部署Redis,单分片的Redis也是有可能扛不住的,如下图所示:
在这里插入图片描述
虽然Redis做了集群部署,但是Redis的key只会存在一个分片上,此时超高并发下redis1很有可能会被打垮。那么在超高的并发如何解决某个热key带来的单分片被打垮的问题呢?下面聊聊Redis分key来解决这个问题的方案。

1、什么是Redis分key

Redis分key就是将一个热点key通过拆分成若干key,然后让这若干个key分散到Redis集群的不同节点,如下图所示:

在这里插入图片描述
将热点key拆分成3个小key,然后通过Redis的算法将这3个key分散到Redis集群的分片上(集群有多少个分片,就拆分成几个key)。这样由原先的一个key拆分成3个小key,在超高并发下由这3个key共同的来承担原先一个热点key扛的流量。

2、拆分后的key分散到集群的分片上

拆分key的思路可以很好的解决单个热点key可能打垮Redis集群中某个分片的问题,但是我们如何保证一个小key落到一个分片上呢?首先我们来回顾一下Redis集群中key落分片的原理,如下所示的Redis的集群:
在这里插入图片描述
从原理上分析key落在哪个节点上是经过了两次的映射,第一次映射是CRC16计算出来key哈希值除以16384之后得到是对应的槽,第二次映射是槽映射到redis的节点,这样可以知道key落在哪个分片上。

根据上述的原理,我们可以通过Redis的命令来获取Redis集群上的集群关系来计算key落在哪个分片上。我们现在为了保证一个key落在一个分片上,可以通过手动的方式来设置key,设置的过程如下:

(1)手写第一个key_longxia,然后自己手动根据CRC16和槽映射关系之后就知道它落到了哪个节点(假设是redis0上)如下所示
在这里插入图片描述
2)准备第二个key(如key_longxia01),假设计算之后发现也落到了redis0上,那么我们换一个key(如key_biancheng),经过计算发现其落在redis1上,如下所示:
在这里插入图片描述
(3)同样的方式,准备第三个key(如key_long),保证其可以落在redis2上即可,如下所示:
在这里插入图片描述
分key的时候,我们不要追求 key 是有规律的了,可以随便加点前缀与后缀,只要保证每个小key都分散到集群的分片上即可。

通过上述的试探我们得到了3个拆分后的小key,并且这些小key可以落到集群的节点上,整理出这些拆分后的key如下所示:
在这里插入图片描述

3、分key的工作原理

在这里插入图片描述

手动尝试出来的三个key我们写固定到代码中(或者放在配置中心上)。当业务请求过来之后,我们可以通过业务id与拆分出来的key数量取余数的方式映射出当前请求打到哪个key上(如key_longxia),然后通过这个可以经过redis的两次映射找到对应的节点,找到节点后就可以操作数据了。

结论:

(1)Redis分可以的原理就是将一个热点key拆分成若干个小key后分散不集群的不同节点上(集群有几个节点就拆分成几个小key)

(2)为保证key可以分散到集群节点上,采用的是手动尝试的方式来获取拆分后的小key。

(3)分key的方案常用于超高并发业务场景下,如抢优惠券、实时榜单等。

相关文章:

  • HDR图像处理:色调映射和色域映射参数
  • 记一次OOM异常问题排查
  • 感觉自己邮电部诗人
  • electron + vue3 + vite 渲染进程与渲染进程之间的消息端口通信
  • 用nodejs加electron加roboticjs判断鼠标点击时是否在浏览器内部
  • 1.VisionPro的安装
  • 植物学(botany)这个单词怎么记?牛吃草,草是一种植物
  • BLDC直流无刷电机转速电流双闭环调速MATLAB仿真
  • PyTorch分布式训练
  • 基于 Selenium 的软件测试方法研究
  • Java 大视界 -- Java 大数据中的数据可视化大屏设计与开发实战(127)
  • Oracle VirtualBox安装CentOS 7
  • STM32使用EXTI触发进行软件消抖(更新中)
  • CDefView::_GetPIDL函数分析之ListView_GetItem函数的参数item的item.mask 为LVIF_PARAM
  • Linux_17进程控制
  • 某快餐店用户市场数据挖掘与可视化
  • 强大的数据库DevOps工具:NineData 社区版
  • 使用Dockerfile构建一个Docker镜像
  • 达梦数据库-学习-10-SQL 注入 HINT 规则(固定执行计划)
  • 状态模式的C++实现示例
  • 秦洪看盘|风格有所转变,热钱回流高弹性品种
  • 刘国中将出席第78届世界卫生大会并顺访瑞士、访问白俄罗斯
  • 一周文化讲座|“我的生命不过是温柔的疯狂”
  • 泽连斯基已离开土耳其安卡拉
  • 最高人民法院、中国证监会联合发布《关于严格公正执法司法 服务保障资本市场高质量发展的指导意见》
  • 一图看懂|印巴交火后,双方基地受损多少?