【问题标题】:Is nested GET possible in Redis?在 Redis 中可以嵌套 GET 吗?
【发布时间】:2015-11-12 20:40:15
【问题描述】:

基本设置是这样的:

SET foo bar
SET baz foo

这样的事情可以在单个语句中实现吗?

GET GET baz
"bar"

谢谢

【问题讨论】:

    标签: redis


    【解决方案1】:

    虽然您不能使用 Redis 字符串来做到这一点,但如果您保留一个包含所有“键”和“值”的哈希值,这是可行的。例如:

    HSET miniredis foo bar
    HSET miniredis baz foo
    

    现在,要获取货物,您需要 Lua,但由于所有内容都捆绑在一个数据结构中,因此它将是集群安全的(以可扩展性为代价)。

    EVAL "return redis.call('HGET', KEYS[1], redis.call('HGET', KEYS[1], ARGV[1]))" 1 miniredis baz
    

    当然,这仅在始终存在一个取消引用级别时才有效。另一个特点是自我引用的能力(例如HSET miniredis minime minime)。如果需要,应该处理这些。

    【讨论】:

      【解决方案2】:

      你不能使用基本的 redis API 来做到这一点。

      我可以看到两个选项:

      • 您可以使用任何与 redis 一起使用的编程语言自行完成;
      • 请使用lua script

      这是一个非常简单的 lua 脚本示例,做你想做的事:

      eval "return redis.call('get', redis.call('get', KEYS[1]))" 1 baz
      

      注意:您只能将此脚本与独立的 redis 安装一起使用,因为它使用未通过 KEYS 数组显式声明的键,因此它不是集群安全的(感谢 Itamar Haber 的评论)。

      【讨论】:

      • > 使用 lua 脚本执行此操作 - 不要。您正在访问未通过 KEYS 数组显式声明的键,这不是集群安全的。
      • ;) 添加一个应该做的基于 Lua 的答案
      猜你喜欢
      • 2011-11-26
      • 1970-01-01
      • 2012-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多