我有以下场景:
- Redis SENTINEL,一个主Redis和两个副本
- Redis连接超时配置为30秒
- 莴苣的Java REDIS客户端
- 莴苣的REDIS客户端上的Spring数据
我有一个REDIS列表,我使用作为队列。正如预期的那样,队列上的每个元素必须由且只能由一个元素处理器处理。然而,在一些奇怪的情况下,我有时会遇到这样的情况:
-> BLMOVE A B 8
(*) I get a timeout here after 30 seconds
(即从列表A
移动到列表B
,并阻塞8 seconds
)我遇到的问题是,元素实际上从列表A
移动到列表B
,我仍然得到超时,所以在此异常之后,元素在队列B
中丢失,并且从未得到处理。我知道这可能是REDIS连接的网络问题。
有几个方法可以解决这个问题:
-
使用具有故障转移功能的REDIS SENTINEL。这样,如果主REDIS实例发生故障,哨兵将自动故障转移到副本实例,并且您的元素不会丢失。
-
使用REDIS集群。这将为您提供高可用性,并确保您的元素在发生故障时不会丢失。
-
使用REDIS复制设置。这将为您提供一个热备REDIS实例,如果主实例出现故障,它可以接管。
-
使用REDIS持久化设置。这将确保您的元素在发生故障时不会丢失。
-
使用REDIS备份设置。这将确保您的元素在发生故障时不会丢失。