《Redis 核心技术与实战》课程学习笔记(七)

切片集群:数据增多了,是该加内存还是加实例?

  • 切片集群,也叫分片集群,就是指启动多个 Redis 实例组成一个集群,然后按照一定的规则,把收到的数据划分成多份,每一份用一个实例来保存。
    《Redis 核心技术与实战》课程学习笔记(七)_第1张图片

如何保存更多数据?

  • Redis 应对数据量增多有两种方案:纵向扩展(scale up)和横向扩展(scale out)。
    • 纵向扩展:升级单个 Redis 实例的资源配置,包括增加内存容量、增加磁盘容量、使用更高配置的 CPU。
    • 横向扩展:横向增加当前 Redis 实例的个数。在面向百万、千万级别的用户规模时,横向扩展的 Redis 切片集群会是一个非常好的选择。

数据切片和实例的对应分布关系

  • Redis Cluster 方案采用哈希槽(Hash Slot),来处理数据和实例之间的映射关系。
  • 在 Redis Cluster 方案中,一个切片集群共有 16384 个哈希槽,这些哈希槽类似于数据分区,每个键值对都会根据它的 key,被映射到一个哈希槽中。
    《Redis 核心技术与实战》课程学习笔记(七)_第2张图片
    • 具体的映射过程分为两大步:
      • 首先根据键值对的 key,按照 CRC16 算法计算一个 16 bit 的值;
      • 然后,再用这个 16bit 值对 16384 取模,得到 0~16383 范围内的模数,每个模数代表一个相应编号的哈希槽。
    • 在手动分配哈希槽时,需要把 16384 个槽都分配完,否则 Redis 集群无法正常工作。

客户端如何定位数据?

  • 在定位键值对数据时,它所处的哈希槽是可以通过计算得到的,这个计算可以在客户端发送请求时来执行。但是,要进一步定位到实例,还需要知道哈希槽分布在哪个实例上。
  • Redis 实例会把自己的哈希槽信息发给和它相连接的其它实例,来完成哈希槽分配信息的扩散。
    • 当实例之间相互连接后,每个实例就有所有哈希槽的映射关系了。
    • 客户端收到哈希槽信息后,会把哈希槽信息缓存在本地。
    • 当客户端请求键值对时,会先计算键所对应的哈希槽,然后就可以给相应的实例发送请求了。
  • Redis Cluster 方案提供了一种重定向机制,所谓的“重定向”,就是指,客户端给一个实例发送数据读写操作时,这个实例上并没有相应的数据,客户端要再给一个新实例发送操作命令。
    • 当客户端把一个键值对的操作请求发给一个实例时,如果这个实例上并没有这个键值对映射的哈希槽,那么,这个实例就会给客户端返回 MOVED 命令响应结果,这个结果中就包含了新实例的访问地址。
    • 迁移部分完成的情况下,客户端会收到一条 ASK 报错信息。
    • 和 MOVED 命令不同,ASK 命令并不会更新客户端缓存的哈希槽分配信息。
    • ASK 命令的作用只是让客户端能给新实例发送一次请求,而不像 MOVED 命令那样,会更改本地缓存,让后续所有命令都发往新实例。

你可能感兴趣的:(数据库,微服务,redis,学习,笔记)