Redis 链式命令

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

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

如何获取 data1 和 data2 的交集(结果为 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),那么return 0 end

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

return single_record
点赞
用户3160475
用户3160475

tl;dr- 在 SRANDMEMBER 中,您传递了一个 Lua 表 (intersect_data) 而不是一个字符串和一个可选的数字。

SINTER 可能返回一个 Lua 表的 0 个或多个结果。SRANDMEMBER 需要一个 单独的 Redis Set 键名和一个可选的计数(整数)参数。

我认为上述逻辑中最大的问题是它似乎假定交集始终只有一个结果。它并不关心有 0 个或多于 1 个...

假设交集始终只返回一个结果,那么您应该使用 intersect_data[1](表中的第一个元素)调用 SRANDMEMBER

2017-06-08 12:48:46