Redis LIST密钥已损坏

时间:2015-06-25 12:41:23

标签: redis

我偶然发现了一个破坏我们的排队系统的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

底线,对于我们未知的原因,队列密钥已损坏。

你知道可能出现什么问题吗?

谢谢

0 个答案:

没有答案