Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Redis cluster是否需要读/写分片知识? 传统(常规)redis_Redis_Memcached - Fatal编程技术网

Redis cluster是否需要读/写分片知识? 传统(常规)redis

Redis cluster是否需要读/写分片知识? 传统(常规)redis,redis,memcached,Redis,Memcached,从我所读到的,当使用memcached时: 每个客户端都知道所有服务器 服务器之间不进行通信 如果客户机希望设置或读取与某个键对应的值,则客户机的库首先计算该键的散列,以确定要使用哪个服务器 我的理解是,Redis(不是Redis集群)提出了相同的要求和逻辑。也就是说,客户机需要知道他们需要向哪些服务器写入数据(例如,使用散列或等效文件) Redis群集 使用Redis cluster,情况似乎有所不同。它看起来像: 大师们互相交谈 主从对话 这似乎使它更接近于例如etcd或Zookee

从我所读到的,当使用memcached时:

  • 每个客户端都知道所有服务器
  • 服务器之间不进行通信
  • 如果客户机希望设置或读取与某个键对应的值,则客户机的库首先计算该键的散列,以确定要使用哪个服务器
我的理解是,Redis(不是Redis集群)提出了相同的要求和逻辑。也就是说,客户机需要知道他们需要向哪些服务器写入数据(例如,使用散列或等效文件)

Redis群集 使用Redis cluster,情况似乎有所不同。它看起来像:

  • 大师们互相交谈
  • 主从对话
这似乎使它更接近于例如
etcd
Zookeeper
,只是它可能都在内存中(因此缓存速度更快)

这就是说,在
etcd
中,可以向任何节点(跟随者或领导者)写入数据,例如,以RR(循环)方式(即只要
etcd
节点响应,必须知道在向节点读/写数据时数据是如何分片的。这是因为
etcd
使用一致性算法(Raft)在节点间分发数据,
etcd
尝试在所有节点上写入和存储所有数据

这是否也适用于Redis群集?或者,在读取/写入集群时,是否需要知道每个键的位置(以及要命中的节点)

我的理解是,Redis(不是Redis集群)提出了相同的要求和逻辑。也就是说,客户机需要知道他们需要向哪些服务器写入数据(例如,使用散列或等效文件)

不完全是。在这种情况下,只有一个主节点,客户端总是需要写入主节点(当主节点与副本同步时,将覆盖对副本节点的写入)。客户端可以从任何节点读取数据,但从副本读取的数据可能已过时。因为每个节点都有一个所有数据的完整副本,所以没有散列数据。如果您还使用Redis Sentinel,则可以从Redis Sentinel动态获取主节点和副本节点信息。此外,Sentinel将执行主故障切换操作

这是否也适用于Redis群集?或者,在读取/写入集群时,是否需要知道每个键的位置(以及要命中的节点)

客户端需要知道每个密钥在哪个节点上的位置。但是,客户端可以将请求发送到任何节点。如果请求的密钥不在此节点上,则节点将使用密钥的位置信息进行响应。然后,客户端可以向正确的节点发送另一个请求

通常一个好的客户端库会实现这个逻辑,最终用户不需要知道这些细节

我的理解是,Redis(不是Redis集群)提出了相同的要求和逻辑。也就是说,客户机需要知道他们需要向哪些服务器写入数据(例如,使用散列或等效文件)

不完全是。在这种情况下,只有一个主节点,客户端总是需要写入主节点(当主节点与副本同步时,将覆盖对副本节点的写入)。客户端可以从任何节点读取数据,但从副本读取的数据可能已过时。因为每个节点都有一个所有数据的完整副本,所以没有散列数据。如果您还使用Redis Sentinel,则可以从Redis Sentinel动态获取主节点和副本节点信息。此外,Sentinel将执行主故障切换操作

这是否也适用于Redis群集?或者,在读取/写入集群时,是否需要知道每个键的位置(以及要命中的节点)

客户端需要知道每个密钥在哪个节点上的位置。但是,客户端可以将请求发送到任何节点。如果请求的密钥不在此节点上,则节点将使用密钥的位置信息进行响应。然后,客户端可以向正确的节点发送另一个请求


通常一个好的客户端库会实现这个逻辑,最终用户不需要知道这些细节。

非常有趣,谢谢!总结一下:对于(基本)Redis,客户端总是向单个节点写入数据,但原则上可以从副本读取数据,因为在这种情况下,所有节点都将包含相同的数据(最大延迟)。但是,对于Redis群集,情况就不同了,客户端最终需要从保存它正在查找的数据的其中一个节点获取密钥,因为并非所有节点都包含所有数据。我没弄错吧?@Josh是的,你弄错了,谢谢!完整性(如果其他人看到这一点):总之,对于问题,OP标题:1)是的,数据在Redis集群中分片,但在普通Redis中不分片。也就是说,2)对于Redis cluster,客户端不需要提前知道或记住数据的确切托管位置。@Josh要补充的一点是,在群集场景中,您应该将其视为一个节点组。因此,您要查找的数据将存储在一个节点组中,但仍然可以从该组中的主节点或任何一个副本节点获取。非常有趣,谢谢!总结一下:对于(基本)Redis,客户端总是向单个节点写入数据,但原则上可以从副本读取数据,因为在这种情况下,所有节点都将包含相同的数据(最大延迟)。但是,对于Redis群集,情况就不同了,客户端最终需要从保存它正在查找的数据的其中一个节点获取密钥,因为并非所有节点都包含所有数据。我没弄错吧?@Josh是的,你弄错了,谢谢!完整性(如果其他人看到这一点):总之,对于问题,OP标题:1)是的,数据在Redis集群中分片,但在普通Redis中不分片。也就是说,2)对于Redis集群,客户机不需要提前知道或了解reme