2017-06-08 120 views
0

我想知道什么是链接在一起的一系列命令的最佳方式,以便它们都在返回最终结果之前在redis上执行?我所有的数据都存储在集合中。Redis链命令

data1 = [ a, b, c, d, e] 
data2 = [b, c] 

我将如何去获得数据1和数据2(结果= B,C),然后调用结果SRANDMEMBER的交集?在一系列的它看起来像:

redis> SINTER data1 data2 
redis> SRANDMEMBER <previous result> 

有当然可以是其他操作链在一起像那么sdiff和SADD而是从一个路口选择一个随机的项目好像最简单的例子。

我试图创建一个Lua脚本,但我收到的消息“的Lua Redis的()命令参数必须是字符串或整数”时,我试图执行以下代码:

local k1, k2 = KEYS[1], KEYS[2] 
local intersect, single_record 

if not redis.call("exists", k1) then return 0 end 

intersect_data = redis.call("SINTER", k1, k2) 
single_record = redis.call("SRANDMEMBER", intersect_data) 

return single_record 
+1

https://redis.io/commands/multi和https://redis.io/commands/sinterstore可能适合您。 – Niloct

+0

'MULTI'在Lua脚本的上下文中没有意义,因此在尝试调用它时被禁用。 –

+0

“将一系列命令链接在一起以便它们在返回最终结果之前在redis上执行的最佳方式是什么?”。我从来没有说过要使用lua脚本。 – Niloct

回答

1

TL;博士 - 你”重新传递一个Lua表(intersect_data)而不是一个字符串和一个可选数字SRANDMEMBER

SINTER可能会返回0个或多个结果作为Lua表。 SRANDMEMBER需要一个单个密钥名称,它是一个Redis集合和一个可选的count(整数)参数。

我在上面的逻辑中看到的最大问题是,它似乎假设相交只产生一个结果。它不关心0或多于1 ...

假设始终从相交处返回单个结果,应该调用SRANDMEMBERintersect_data[1](表中的第一个元素)。

+0

有没有办法对Luna表执行redis命令或隐藏Luna表? – dirkoneill

+0

是的 - Lua的'unpack'就在那里,但请注意'SRANDMEMBER'接受一个单一的键作为输入 –