【问题标题】:How to delete all values from sorted set which are part of different unsorted set如何从排序集中删除属于不同未排序集的所有值
【发布时间】:2015-08-12 09:53:57
【问题描述】:

我正在尝试使用 lua 脚本删除,但我不知道出了什么问题

import redis
r = redis.Redis(host='localhost',port=6379)
pipe = r.pipeline(transaction = False)
lua = """
local env = redis.call('smembers', 'user_key')
redis.call('zrem','another_key', unpack(env))
"""
p = r.register_script(lua)
p(client=pipe)

【问题讨论】:

  • 我在您的代码中看不到任何集合,但您可以减去集合,即{1,2,3,4,5} - {3,4,5,6,7} 会给您{1,2}
  • 你能更清楚地解释这里的问题吗?到底出了什么问题?这里的 python 包装是否与问题有关?
  • local 是 Lua 中的关键字(也缺少逗号)。也许这就是问题所在......
  • 是的,我知道 local 是保留关键字,在发布问题时我犯了错误,请立即检查
  • 可能你的 Redis 太旧了。 documentation for ZREM 声明您只能在 Redis 2.4 及更高版本上传递多个参数。

标签: python lua redis


【解决方案1】:

local 保留 Lua keyword 用于声明局部变量。在 Redis 的 Lua 脚本引擎中,所有变量都必须是本地变量,以防止沙盒垃圾失控(阅读 http://redis.io/commands/eval#global-variables-protection 的文档)

您的脚本只是缺少一个变量名 - 以下可能会更好:

import redis
r = redis.Redis(host='localhost',port=6379)
pipe = r.pipeline(transaction = False)
lua = """
local l = redis.call('smembers' 'user_key')
redis.call('zrem', unpack(l))
"""
p = r.register_script(lua)
p(client=pipe)

此外,IMO 并不真正需要管道。

【讨论】:

  • 是的,我知道 local 是保留关键字,在发布问题时我犯了错误,请立即检查
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-25
  • 2014-05-10
  • 2011-03-28
  • 1970-01-01
  • 2015-05-24
相关资源
最近更新 更多