【问题标题】:Redis Chain CommandsRedis 链命令
【发布时间】:2017-06-08 20:48:46
【问题描述】:

我想知道将一系列命令链接在一起以便在返回最终结果之前都在 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 脚本,但当我尝试执行以下代码时收到消息“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

【问题讨论】:

  • MULTI 在 Lua 脚本的上下文中没有意义,因此在尝试调用它时被禁用。
  • “将一系列命令链接在一起的最佳方式是什么,以便它们在返回最终结果之前都在 redis 上执行”。而且我从来没有说过要使用 lua 脚本。

标签: lua redis


【解决方案1】:

tl;dr - 您将 Lua 表 (intersect_data) 而非字符串和可选数字传递给 SRANDMEMBER

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

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

假设从 intersect 始终返回单个结果,您应该使用 intersect_data[1](表中的第一个元素)调用 SRANDMEMBER

【讨论】:

  • 有没有办法对Luna表执行redis命令或者对Luna表进行隐蔽?
  • 是的 - Lua 的unpack 就是为此而存在的,但请注意SRANDMEMBER 接受单个键作为输入
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-10
  • 1970-01-01
  • 2016-07-20
  • 1970-01-01
  • 1970-01-01
  • 2020-06-12
  • 2013-02-28
相关资源
最近更新 更多