我偶然发现了一个破坏我们的排队系统的Redis列表的虚假问题。
仅在我们的Redis SaaS提供商上观察到此行为,我们无法在本地Redis服务器上复制,两者均在2.8.12版本上运行。
问题在于创建LIST类型密钥。密钥名为nsworker:queue:latency-check
。可以使用以下命令访问此密钥:
blpop
:弹出列表中的第一项,阻止等待项目可用。rpush
:将项目推送到列表中。问题在于,在对该特定关键项进行的前几次操作之后,它会因缺乏任何更好的术语而变得“笨拙”。具体的关键就像吮吸所有命令,如黑洞,没有效果......
我已关闭所有服务和服务器,并使用我本地的redis-cli登录redis数据库,观察以下命令集:
> exists nsworker:queue:latency-check
(integer) 0
显然列表不存在,让我们试试LLEN:
> llen nsworker:queue:latency-check
(integer) 0
0长度,我们现在尝试RPUSH和LLEN:
> rpush nsworker:queue:latency-check 1
(integer) 1
> llen nsworker:queue:latency-check
(integer) 0
Redis确认项目已被推送,但列表中的长度仍然报告0!尝试LPOP:
> lpop nsworker:queue:latency-check
(nil)
使用LPUSHX仅推送列表存在,我们得到0响应:
> lpushx nsworker:queue:latency-check 1
(integer) 0
没有X的LPUSH与RPUSH具有相同的效果:
> lpush nsworker:queue:latency-check 1
(integer) 1
> llen nsworker:queue:latency-check
(integer) 0
> exists nsworker:queue:latency-check
(integer) 0
底线,对于我们未知的原因,队列密钥已损坏。
你知道可能出现什么问题吗?
谢谢