Redis分片

2023-11-17

目录

一:Redis为什么要分片

二:分布式存储的特性

三:分片方案

(1)范围分片

优点

缺点

(2)hash节点取余分区

(3)一致性hash分区


一:Redis为什么要分片

一般你系统核心缓存的命中率需维持在99%甚至99.9%,哪怕下降1%,系统都会遭受毁灭性打击。

算笔账,假设系统QPS 1w,每次调用会访问10次缓存或DB的数据,则当缓存命中率仅减少1%,DB每s就增加1w * 10 * 1% = 1000次请求。
一般单个MySQL节点读请求峰值QPS就1500左右,增加的这1000次请求很可能会给DB带来毁灭打击。

更不用说缓存节点故障会有多大影响了。图中单点部署的缓存节点就成了整体系统中最大隐患!
那如何解决这个问题,提升缓存可用性?

可部署多个节点,同时让这些节点互为备份。这样,当某节点故障,其备份节点可顶替它继续服务。
这就是分布式缓存的高可用方案。

就需要把数据和请求分散到多台机器,这就需要引入分布式存储。
单点缓存节点受机器内存、网卡带宽和单节点请求量限制,随着请求量和数据量的增加,不能承担更高并发,考虑将数据分片,依照分片算法将数据打散到多个不同节点,每个节点存储部分数据。

这样在某个节点故障的情况下,其他节点也可以提供服务,保证了一定的可用性。这就好比不要把鸡蛋放在同一个篮子里,这样一旦一个篮子掉在地上,摔碎了,别的篮子里还有没摔碎的鸡蛋,不至于一个不剩。
 

二:分布式存储的特性

  • 增强可用性
    如果数据库的某个节点出现故障,在其他节点的数据仍然可用
  • 维护方便
    如果数据库的某个节点出现故障,需要修复数据,只需修复该节点
  • 均衡I/O
    可以把不同的请求映射到各节点以平衡 I/O,改善整个系统性能
  • 改善查询性能
    对分区对象的查询可以仅搜索自己关心的节点,提高检索速度

分布式存储首先要解决把整个数据集按分区规则映射到多个节点的问题,即把数据集划分到多个节点,每个节点负责整体数据的一个子集:

分片可以让Redis管理更大的内存,Redis将可以使用所有机器的内存。如果没有分区,你最多只能使用一台机器的内存。
分片使Redis的计算能力通过简单地增加计算机得到成倍提升,Redis的网络带宽也会随着计算机和网卡的增加而成倍增长。
 

三:分片方案

假设:

  • 有 4 个 Redis 实例 R0,R1,R2,R3
  • 很多表示用户的键,像 user:1,user:2

有如下方案可映射键到指定 Redis 节点。

(1)范围分片

也叫顺序分区,最简单的分区方式。通过映射对象的范围到指定的 Redis 实例来完成分片。

优点

  • 键值业务相关
  • 可顺序访问
    同一范围内的范围查询不需要跨节点,提升查询速度
  • 支持批量操作

缺点

  • 数据分散度易倾斜
  • 需要一个映射范围到实例的表格。该表需要管理,不同类型的对象都需要一个表,所以范围分片在 Redis 中常常并不可取,因这要比其他分片可选方案低效得多。

 

(2)hash节点取余分区

例如你有三个数据库,那就余3,然后根据余数分配到不同的数据库

不利于扩展,当需要扩展的时候,前三个数据库的数据都可能需要迁移到第四个redis数据库中,发生大规模的数据迁移

(3)一致性hash分区

原理
1.环形 hash 空间
2.按常用 hash 算法,将对应的 key hash到一个具有 2^32 个桶的空间,即(0 ~ 2^32 - 1)的数字空间中。


将这些数字头尾相连,想象成一个闭合环形:

  • 把数据通过一定的 hash 算法映射到环上
  • 将机器通过一定的 hash 算法映射到环上
  • 节点按顺时针转动,遇到的第一个机器,就把数据放在该机器
  • 把对象映射到hash空间

当新增数据库redis4的时候,不需要动redis1和redis2的数据,只需要改变redis3

但是还是会出现数据倾斜问题

可通过虚拟节点来解决这个问题

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Redis分片 的相关文章

  • Redis 写入 .ssh/authorized_keys

    当前设置 2 个主服务器 12 个工作服务器 工作人员通过 ssh copy id 连接到主设备 主设备和工作人员正在主设备上的 redis 队列中写入数据 过去一周我遇到的问题是 Redis 正在将数据写入authorized keys
  • Redis部署配置-主从复制

    目前我有两台服务器 我已经部署了基于node js Express JS的Web服务API 我正在使用 Redis 来缓存 JSON 字符串 将此设置部署到生产中的最佳选择是什么 我懂了here https stackoverflow co
  • socket.io redis 和内存泄漏

    我的socket io版本是 电子邮件受保护 cdn cgi l email protection and 电子邮件受保护 cdn cgi l email protection 我在 Windows 上 在某些地方 我看到问题已得到解决 我
  • python 3.5 中的 json.loads 和 Redis

    我使用 json dumps 创建了一个 JSON 对象 并在 Redis 列表中将其 RPUSH ed 当使用 LRANGE redis lrange 返回 JSON 时 我收到一个二进制字符串 b si 00 ff 所以 json lo
  • 我的 Redis 自动生成的密钥

    我不知道我的 Redis 版本 4 0 9 到底发生了什么 我正在运行一个应用程序并使用 Redis 来存储我的数据库 但是 然后 Redis 自动创建 3 个新键 Backup1 Backup2 Backup3 并删除我的所有数据 这是我
  • 如何使用Spring Cache处理redis异常?

    我目前正在开发一个包含 Spring Data Redis 和 Spring Cache 的项目 在spring data redis中 我使用redis模板调用redis 我在 try catch 块中处理 redis 模板抛出的所有异常
  • Redis键空间事件不触发

    我有两个 Redis 客户端 在一个文件中我有一个简单的脚本设置并删除了 Redis 键 var redis require redis var client redis createClient 6379 127 0 0 1 client
  • WSL Redis 遇到系统尚未使用 systemd 作为 init 系统(PID 1)启动。无法操作[已关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试遵循本文中讨论的 Redis 安装过程article https www digitalocean com community
  • Redis 排序集和解决关系

    我正在使用 Redis 排序集来存储我正在处理的项目的排名 我们没有预料到 我们想要如何处理关系 Redis 按字典顺序对具有相同分数的条目进行排序 但我们想要做的是对具有相同分数的所有条目给予相同的排名 例如在以下情况 redis 127
  • redis 阻塞直到 key 存在

    我是 Redis 新手 想知道是否有办法能够await get通过它的键来获取值 直到该键存在 最小代码 async def handler data await self fetch key async def fetch key ret
  • 在 Kubernetes/Openshift 中将客户端-服务器流量保持在同一区域的最佳方法?

    我们运行兼容 Kubernetes OKD 3 11 的本地 私有云集群 其中后端应用程序与用作缓存和 K V 存储的低延迟 Redis 数据库进行通信 新的架构设计将在两个地理上分布的数据中心 区域 之间平均划分工作节点 我们可以假设节点
  • 在 sidekiq 上配置 redis 身份验证

    我想我错过了一些东西 因为我在文档中找不到如何编写 redis 实例的用户名和密码以与 sidekiq 一起使用 有没有办法做到这一点 或者是通过 ENV 变量 Sidekiq 将无法识别的 Redis 选项直接传递给 Redis 驱动程序
  • 如何将node.js管道传输到redis?

    我有很多数据要插入 SET INCR 到redis DB 所以我正在寻找pipeline http redis io topics pipelining 质量插入 http redis io topics mass insert通过node
  • 如何在Redis中进行持久化存储?

    关闭redis服务器后 使用set存储的值被破坏 在这里我找到了使用持久性存储的方法 有人帮助我 如何使用javascript实现这一点 我想将客户端的一些值存储在 redis 数据库中 并且必须在其他客户端中使用该值 您需要配置 Redi
  • Redis Cluster 与 Pub/Sub 中的 ZeroMQ,用于水平扩展的分布式系统

    如果我要设计一个巨大的分布式系统 其吞吐量应随系统中的订阅者数量和通道数量线性扩展 哪个会更好 1 Redis集群 仅适用于Redis 3 0 alpha 如果是集群模式 您可以在一个节点上发布并在另一个完全不同的节点上订阅 消息将传播并到
  • 为什么 Redis TimeSeries 不捕获聚合中的最后一个元素?

    我试图了解 Redis 的时间序列规则创建的工作原理 但我很困惑为什么 Redis 会忽略聚合中的最后一项 并想知道这是否是预期的行为 我在中创建了示例代码redis cli为了显示 127 0 0 1 6379 gt FLUSHALL O
  • Redis、会话过期和反向查找

    我目前正在构建一个网络应用程序 并想使用 Redis 来存储会话 登录时 会话会使用相应的用户 ID 插入到 Redis 中 并且过期时间设置为 15 分钟 我现在想实现会话的反向查找 获取具有特定用户 ID 的会话 这里的问题是 由于我无
  • Spring Data JPA Redis:无法编写基于自定义方法的查询

    我已经使用 Redis 配置了 Spring Data JPA 并使用RedisRepositorieswith 提供了类似的方法find findAll 所有这些方法似乎都工作得很好 但我无法编写我的自定义方法 RedisEntity f
  • redis - 使用哈希

    我正在使用 redis 为我的 Web 应用程序实现社交流和通知系统 我是 redis 的新手 我对哈希值及其效率有一些疑问 我读过这篇很棒的文章Instagram 帖子 http instagram engineering tumblr
  • redis 2.8.7 Linux Sentinel环境配置问题,如何使其自启动,应该订阅什么?

    现在我们尝试使用 redis 2 8 7 作为缓存存储 来自使用 booksleeve 客户端的 NET Web 应用程序 目前看来这是一个非常有趣和令人兴奋的任务 redis 文档非常好 但由于缺乏真正的实践经验 我确实有几个关于如何正确

随机推荐

  • ARM-A架构入门基础(三)MMU

    14天学习训练营导师课程 周贺贺 ARMv8 ARMv9架构 快速入门 1 MMU Memory Management Unit 内存管理单元 MMU的意义在于将软件程序的虚拟地址转换为真实的物理地址 2 MMU种类 Secure EL1
  • 数据结构——图解循环队列长度计算问题

    队列定义是这样的 define MAXSIZE 10 typedef struct ElemType data MAXSIZE int front rear SeqQueue 一个队列 一个存放元素的数组 一个队头指针 一个队尾指针 fro
  • np.array与list的内存大小比较

    1 np array与list 比较 a 1 2 3 4 需要4个指针和四个数据 增加了存储和消耗cpu a np array 1 2 3 4 只需要存放四个数据 读取和计算更加方便 2 np array与list所占内存 def test
  • sqlserver语言转mysql_SQLSERVER 脚本转MYSQL 脚本的方法总结

    标签 1 MYSQL中SQL脚步都要以分号 结尾 这点比SQLSERVER要严谨 2 所有关键字都要加上 比如 Status 替换成 Status 按是有个 的键 3 SQLSERVER的dbo 在mysql中不支持 都要去掉 4 isnu
  • java field static_Java基础之关键字static

    static是Java中的一个关键字 用来修饰成员变量与成员方法 还可以用于编写静态代码块 对于被static修饰的东西 JVM在加载类的时候 就给这些变量在内存中分配了一定的空间 即在编译阶段时就为这些成员变量的实例分配了空间 一 静态变
  • 机器学习入门之流浪地球

    机器学习入门之流浪地球 1 引言 2 问题描述 3 问题分析 4 问题求解 4 1 数据集 4 2 模型构造 4 3 损失函数 4 4 梯度下降 4 5 模型训练 4 6 预测 4 7 完整实现代码 5 总结与思考 1 引言 我国里程碑式科
  • 求n边形周长的k等分点坐标(今日头条)

    题目 本题来自今天头条的笔试 有一个n边形 P0 P1 Pn 每一条边皆为垂直或水平线段 现给定数值k 以P0为起点将n边形的周长分为k段 每段的长度相等 请打印出k等分点的坐标 T0 T1 Tk 的坐标 分析 1 可以计算出从第0个点 到
  • 线程池ExecutorService

    1 线程池创建方式 1 通过Executors创建线程池 import java util concurrent ExecutorService import java util concurrent Executors public cl
  • Ubuntu18.04未安装Qt报qt.qpa.plugin could not load the Qt platform plugin xcb问题的解决方法

    在Ubuntu 18 04开发机上安装了Qt 5 14 2 当将其可执行程序拷贝到另一台未安装Qt的Ubuntu 18 04上报错 拷贝可执行程序前 使用ldd将此执行程序依赖的动态库也一起拷贝过去 包括Qt5 14 2 5 14 2 gc
  • JS ES6 单链表2种插入尾部方式

    一种是类里加一个指向尾部最后一个元素指针 通过他添加一个元素到队列最后 一种是每次增一个元素都从头开始遍历直到最后一个 然后添加 打开出来有单链表结构是一样的 除了上面的 多了一个队尾指针 class Node 单个结点 data next
  • Cadence 生成gerber文件,嘉立创下单助手解析不了PCB板的问题

    概述 最近由于公司的原因 使用Cadence EDA工具绘制一块 TMC2300电机驱动板 遇到一些问题 在这记录一下坑 也方便遇到这个问题的硬件攻城狮得到解决 1 EDA Cadence 17 4 在生成gerber文件时 使用CAM35
  • type_traits技术与C++

    引言 一个方法实现过程中 业务逻辑很多都是相似的 但是与具体的特化类型的不同有一定的差异 这个时候可以采用特化模板的方式实现 不同的类型使用不同的特化实现 但是这种情况造成一定的业务逻辑的冗余 而trait技术可以将特化类型通过封装 以一个
  • windows10进行Colmap配置

    colmap下载 https demuc de colmap 新的colmap按照官网的编译方式仅需要预装好CMake Boost QT5 CUDA和CGAL 1 CMake CMake安装最简单 去官网下载好压缩包解压即可 建议下载新版
  • 使用sentencepiece模型替换词表

    最近在用DeBERTa模型跑一些下游任务 了解到了sentencepiece模型 用于替代预训练模型中的词表 sentencepiece 是google开源的文本Tokenzier工具 本身提供四种切分方法 包括 char word byt
  • Python爬虫三国演义

    爬取三国全篇内容 定位目标 https www shicimingju com book sanguoyanyi html 在这里插入代码片import requests from bs4 import BeautifulSoup f op
  • 100天精通Python(可视化篇)——第86天:matplotlib绘制不同种类炫酷热力图参数说明+代码实战

    文章目录 专栏导读 一 热力图介绍 1 介绍 2 参数说明 二 绘制热力图 1 普通热力图 2 添加坐标轴和标题 3 添加热力标尺 4 添加色块数值
  • 虚析构和纯虚析构

    问题 多态使用时 如果子类中有属性开辟到堆区 那么父类指针在释放时无法调用到子类的析构代码 解决方式 将父类的析构改为虚析构或纯虚析构 可以解决父类指针释放子类对象 都需要具体的实现函数 虚析构和纯虚析构的区别 如果是纯虚析构 该类属于抽象
  • 【踩坑】解决maven的编译报错Cannot connect to the Maven process. Try again later

    背景 新公司新项目 同事拷给我maven的setting配置文件 跑项目编译发现maven报 Cannot connect to the Maven process Try again later If the problem persis
  • 你了解Spring BeanFactoryAware嘛

    其实再写这篇文章之前呢 我是看Spring IOC源码 可是老师啃不动 那么就从外围开始吧 在Spring生命周期的探索当中 其中网上主流的做法就是让我们的Bean实现一大波接口 到目前为止 这些接口的名称一个也没有记住 Spring的这个
  • Redis分片

    目录 一 Redis为什么要分片 二 分布式存储的特性 三 分片方案 1 范围分片 优点 缺点 2 hash节点取余分区 3 一致性hash分区 一 Redis为什么要分片 一般你系统核心缓存的命中率需维持在99 甚至99 9 哪怕下降1