FantasticMao 技术笔记
BlogGitHub
  • README
  • C & Unix
    • C
      • 《C 程序设计语言》笔记
      • C 语言中的陷阱
      • CMake 示例
      • GNU make
      • LLVM Clang
      • Nginx 常用模块
      • Vim 常用命令
    • Unix-like
      • 《深入理解计算机系统》笔记
      • 《UNIX 环境高级编程》笔记 - UNIX 基础知识
      • 《UNIX 环境高级编程》笔记 - 文件 IO
      • 《UNIX 环境高级编程》笔记 - 标准 IO 库
      • 《鳥哥的 Linux 私房菜》笔记 - 目录配置
      • 《鳥哥的 Linux 私房菜》笔记 - 认识与学习 bash
      • 《鳥哥的 Linux 私房菜》笔记 - 任务管理
      • OpenWrt 中的陷阱
      • iptables 工作机制
  • Go
    • 《A Tour of Go》笔记
    • Go vs C vsJava
    • Go 常用命令
    • Go 语言中的陷阱
  • Java
    • JDK
      • 《Java 并发编程实战》笔记 - 线程池的使用
      • 设计模式概览
      • 集合概览
      • HashMap 内部算法
      • ThreadLocal 工作机制
      • Java Agent
    • JVM
      • 《深入理解 Java 虚拟机》笔记 - Java 内存模型与线程
      • JVM 运行时数据区
      • 类加载机制
      • 垃圾回收算法
      • 引用类型
      • 垃圾收集算法
      • 垃圾收集器
    • Spring
      • Spring IoC 容器扩展点
      • Spring Transaction 声明式事务管理
      • Spring Web MVC DispatcherServlet 工作机制
      • Spring Security Servlet 实现原理
    • 其它
      • 《Netty - One Framework to rule them all》演讲笔记
      • Hystrix 设计与实现
  • JavaScript
    • 《写给大家看的设计书》笔记 - 设计原则
    • 《JavaScript 权威指南》笔记 - jQuery 类库
  • 数据库
    • ElasticSearch
      • ElasticSearch 概览
    • HBase
      • HBase 数据模型
    • Prometheus
      • Prometheus 概览
      • Prometheus 数据模型和指标类型
      • Prometheus 查询语法
      • Prometheus 存储原理
      • Prometheus vs InfluxDB
    • Redis
      • 《Redis 设计与实现》笔记 - 简单动态字符串
      • 《Redis 设计与实现》笔记 - 链表
      • 《Redis 设计与实现》笔记 - 字典
      • 《Redis 设计与实现》笔记 - 跳跃表
      • 《Redis 设计与实现》笔记 - 整数集合
      • 《Redis 设计与实现》笔记 - 压缩列表
      • 《Redis 设计与实现》笔记 - 对象
      • Redis 内存回收策略
      • Redis 实现分布式锁
      • Redis 持久化机制
      • Redis 数据分片方案
      • 使用缓存的常见问题
    • MySQL
      • 《高性能 MySQL》笔记 - Schema 与数据类型优化
      • 《高性能 MySQL》笔记 - 创建高性能的索引
      • 《MySQL Reference Manual》笔记 - InnoDB 和 ACID 模型
      • 《MySQL Reference Manual》笔记 - InnoDB 多版本
      • 《MySQL Reference Manual》笔记 - InnoDB 锁
      • 《MySQL Reference Manual》笔记 - InnoDB 事务模型
      • B-Tree 简述
      • 理解查询执行计划
  • 中间件
    • gRPC
      • gRPC 负载均衡
    • ZooKeeper
      • ZooKeeper 数据模型
    • 消息队列
      • 消息积压解决策略
      • RocketMQ 架构设计
      • RocketMQ 功能特性
      • RocketMQ 消息存储
  • 分布式系统
    • 《凤凰架构》笔记
    • 系统设计思路
    • 系统优化思路
    • 分布式事务协议:二阶段提交和三阶段提交
    • 分布式系统的技术栈
    • 分布式系统的弹性设计
    • 单点登录解决方案
    • 容错,高可用和灾备
  • 数据结构和算法
    • 一致性哈希
    • 布隆过滤器
    • 散列表
  • 网络协议
    • 诊断工具
    • TCP 协议
      • TCP 报文结构
      • TCP 连接管理
由 GitBook 提供支持
在本页
  • 分片的不同实现
  • 分片的优点
  • 分片的缺点
  • 参考资料
  1. 数据库
  2. Redis

Redis 数据分片方案

最后更新于1年前

分片是将数据拆分至多个 Redis 实例中的过程,因此每个 Redis 实例将会仅包含 keys 的子集。

分片的不同实现

实现数据分片的方式有很多种,例如 范围分片 和 哈希分片。一致性哈希 是一种高级形式的哈希分片,被应用于一些 Redis 的客户端和代理中。

在软件架构上,Redis 中的数据分片可以由不同的模块来实现:

  • 客户端侧分片:对于给定的 key,客户端会直接选择正确的 Redis 节点来进行读写操作。许多 Redis 客户端都实现了这种策略,例如 Jedis 中的 类;

  • 代理侧分片:客户端会将请求发送给 Redis 代理,由代理来选择正确的 Redis 节点。 是一款 Redis 和 Memcached 的代理,它实现了这种策略;

  • 查询路由:客户端可以将请求发送给任意一台 Redis 节点,该节点会将请求重定向至正确的 Redis 节点。Redis Cluster 在和客户端的配合下,实现了这种策略。Jedis 中的 类支持 Redis Cluster。

分片的优点

在 Redis 中进行数据分片主要有两个目的:

  • 使用多个机器的内存总和,来创建一个更大的数据库;

  • 将计算能力扩展到多个内核和多个机器,将网络带宽扩展到多个机器和网络适配器。

分片的缺点

Redis 的一些特性在进行数据分片时,不能很好的工作:

  • 通常不支持涉及多个 key 的操作;

  • 不支持涉及多个 key 的 Redis 事务;

  • 分片的粒度是 key,因此没有办法对单个非常大的 key 进行分片;

  • 当使用分片时,数据处理会变得更加复杂;

  • 在集群中扩容和缩容会变得更加复杂。

参考资料

ShardedJedis
twemproxy
JedisCluster
Scaling with Redis Cluster