Spring Data Redis(Lettuce)的ReadFrom.NEAREST仅在集群配置中有效
最终结论
在Spring Data Redis(Lettuce)中,ReadFrom.NEAREST只在集群配置中有效。在主从复制配置(包括Sentinel配置)中无效。
依据
1. 在Lettuce的文件中确认。
节点的延迟是通过集群拓扑刷新来确定的。如果拓扑视图从未刷新,则使用初始集群节点读取的值。
2. 在Lettuce的源代码中确认
根据评论中提到的情况,我推断出调用getNodes方法的只有ClusterScanSupport。
/**
* Descriptor of nodes that are available for the current read operation.
*/
public interface Nodes extends Iterable<RedisNodeDescription> {
/**
* Returns the list of nodes that are applicable for the read operation. The list is ordered by latency.
*
* @return the collection of nodes that are applicable for reading.
*
*/
List<RedisNodeDescription> getNodes();
}
起初的问题
Redis主从结构。
Note: Please note that the Chinese translation provided is in Simplified Chinese. If you prefer Traditional Chinese, please let me know.
-
- 東京リージョン
az-a: Redis(master) + Application(Spring Boot + Spring Data Redis)
az-c: Redis(replica) + Application(Spring Boot + Spring Data Redis)
az-d: Redis(replica)
由于AZ之间的网络延迟很大,所以对于从应用程序进行Redis读取的处理来说,最好从同一AZ内的节点进行。
* 对于写入操作,只能针对master进行,因此只能放弃AZ之间的网络延迟。
如果将Application的ReadFrom设置为NEAREST,它应该会从最近的Redis节点进行读取操作,但实际上不如开头的结论所说的那样工作。
可以通过规避措施来解决。
通过RedisStaticMasterReplicaConfiguration配置连接,并将ReadFrom设置如下。不允许使用SentinelConfiguration。
-
- 東京リージョン
az-a: Redis(master) + Application(ReadFrom.MASTER_PREFERREDを指定。)
az-c: Redis(replica) + Application(ReadFrom.REPLICA_PREFERREDを指定。az-dにも行きそうだけど行かない。ノードの設定順に影響されるかも。)
az-d: Redis(replica)
使用Redis可以将读取操作限定在同一个可用区内。
其他措施
使用Pipeline可以将多个命令一次通信完成(未经验证,只是推测)。
请
我想知道Jedis和其他语言的Redis库是怎么样的,请告诉我。