我有一个已创建的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命令。
编辑
另外,我认为我的答案可能是在排序的集合上而不是队列上。
我不知道它的nodejs客户端详细信息,但是以下是lua中非常简单的indexOf命令的实现。
在我的文件中,indexof.lua我有以下代码:
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。
mylist
> rpush mylist foo bar baz qux (integer) 4
我们可以使用lua脚本在列表中找到任何值的索引。该命令为O(N)。
$ redis-cli --eval indexof.lua mylist , bar (integer) 1
的索引bar为1
bar
> lindex mylist 1 "bar"
的索引nil是-1
nil
$ redis-cli --eval indexof.lua mylist , nil (integer) -1
请参阅有关EVAL命令的http://redis.io/commands/eval其他文档。