我想知道将一系列命令链接在一起的最佳方法是什么,以便在返回最终结果之前它们都在redis上执行?我的所有数据都存储在Sets中。
data1 = [ a, b, c, d, e]
data2 = [b, c]
如何获取data1和data2(result = b,c)的交集,然后在结果上调用SRANDMEMBER?在一系列中,它看起来像:
redis> SINTER data1 data2
redis> SRANDMEMBER <previous result>
当然可以将其他操作链接在一起,如SDIFF和SADD,但从交叉点选择一个随机项似乎是最简单的例子。
我尝试创建一个lua脚本,但是我收到了消息&#34; Lua redis()命令参数必须是字符串或整数&#34;当我试图执行以下代码时:
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
答案 0 :(得分:1)
tl; dr - 您将一个Lua表(intersect_data
)而不是字符串和一个可选数字传递给SRANDMEMBER
。
SINTER
可能会返回0或更多结果作为Lua表。 SRANDMEMBER
需要一个单个键名,即Redis Set和可选的count(整数)参数。
我在上面的逻辑中看到的最大问题是它似乎假设交叉产生了恰好一个结果。它不关心0或大于1 ......
假设始终从交叉点返回单个结果,则应使用SRANDMEMBER
(表中的第一个元素)调用intersect_data[1]
。