- 有人知道 Redis 复制和 Redis 分片的区别吗?
- 它们用于什么?Redis 将数据存储在内存中,这如何影响复制/分片?
- 是否可以同时使用它们?
分片(Sharding)和复制(Replication)是两个正交的概念,它们可以很好地结合使用。分片将数据按键进行拆分;而复制则是将所有数据进行拷贝。
分片可用于提高性能,减少任何一个资源的压力和内存负载。复制可用于获得读操作的高可用性。如果从多个副本中读取,还可以减少所有资源的命中率,但所有资源的内存需求保持不变。需要注意的是,虽然你可以向从节点写入数据,但复制只允许主->从的写入方式。因此,你无法通过这种方式扩展写操作。
假设你有如下元组:[1:苹果]、[2:香蕉]、[3:樱桃]、[4:榴莲],并且有两台机器 A 和 B。使用分片,我们可以将键2、4存储在机器A上;键1、3存储在机器B上。使用复制,我们可以将键1、2、3、4同时存储在机器A和机器B上。
通常通过对键执行一致性哈希来实现分片。上面的示例是使用以下哈希函数实现的:h(x){return x%2==0?A:B}。
为了结合这两个概念,我们可以为每个分片进行复制。在上述示例中,机器A的所有数据(2、4)可以复制到机器C上,机器B的所有数据(1、3)可以复制到机器D上。
任何键值存储(Redis 只是其中之一)都支持分片,尽管某些跨键函数将不再适用。Redis支持开箱即用的复制功能。
简单来说,Sharding用于扩展写入操作,而Replication用于扩展读取操作。正如Alex所提到的,Replication也是实现高可用性(HA)的解决方案之一。
如果考虑到分片可以在集群中的节点之间进行复制,它们通常一起使用。
关于您的第三个问题,与其使用RAM刷新选项,更好的选择是使用Redis Append Only File(AOF)。仅以写入速度为代价,您会获得更可靠的写入。这很像mysql的二进制日志。建议每秒执行1个fsync。