一尘不染

通过Redis列表中的值获取项目的索引

redis

我有一个已创建的Redis列表,此刻我将它用作队列,偶尔会反向。我的问题是我希望能够按值获取该队列/列表上某项的索引。

如果我具有以下值的列表:

{"dan","eduardo","pedro"}

索引将是:

0 : "dan"
1 : "eduardo"
2 : "pedro"

我希望能够通过传递值来获取列表中该值的索引。

像“ eduardo”一样,返回“ 1”。

如果可以的话,那怎么可能呢?

我还应该说的是,我正在对列表执行队列命令,从顶部删除项目,然后在底部添加项目。

我目前正在使用node.js 0.6.6和最新的redis模块以及最新的redis版本2.4.4。

我为redis-cli中的解决方案感到高兴。

此外,没有其他限制,那么必须可以单独使用redis进行操作,没有外部进程等,但是如果要对lua go使用EVAL命令。

编辑

另外,我认为我的答案可能是在排序的集合上而不是队列上。


阅读 1389

收藏
2020-06-20

共1个答案

一尘不染

我不知道它的nodejs客户端详细信息,但是以下是lua中非常简单的indexOf命令的实现。

在我的文件中,indexof.lua我有以下代码:

local key = KEYS[1]
local obj = ARGV[1]
local items = redis.call('lrange', key, 0, -1)
for i=1,#items do
    if items[i] == obj then
        return i - 1
    end
end 
return -1

让我们将一些值推到mylist

> rpush mylist foo bar baz qux
(integer) 4

我们可以使用lua脚本在列表中找到任何值的索引。该命令为O(N)。

$ redis-cli --eval indexof.lua mylist , bar
(integer) 1

的索引bar为1

> lindex mylist 1
"bar"

的索引nil是-1

$ redis-cli --eval indexof.lua mylist , nil
(integer) -1

请参阅有关EVAL命令的http://redis.io/commands/eval其他文档。

2020-06-20