Redis 文档建议我将键名指定为脚本的参数并在脚本中读取它们,而不是在脚本中硬编码它们。如果我在调用脚本时知道名称,这会很好。
就我而言,我的键名存储在 Redis 对象(哈希)中,我需要根据参数检索一些哈希条目,然后以原子方式访问这些键。
有人对如何使其以合规方式工作有任何想法吗?
Redis 文档建议我将键名指定为脚本的参数并在脚本中读取它们,而不是在脚本中硬编码它们。如果我在调用脚本时知道名称,这会很好。
就我而言,我的键名存储在 Redis 对象(哈希)中,我需要根据参数检索一些哈希条目,然后以原子方式访问这些键。
有人对如何使其以合规方式工作有任何想法吗?
我遇到了同样的问题。正如您所提到的,Redis EVAL 命令文档告诉:
脚本使用的所有键都应使用 KEYS 数组传递,方式如下:
eval "return redis.call('set',KEYS 1 ,'bar')" 1 foo OK
以正确方式传递键的原因是,在 EVAL 之前,可以在执行之前分析所有 Redis 命令,以确定该命令将操作哪些键。
但后来在同一文档中写道:
为了使 EVAL 成为真的,键也必须是显式的。这在很多方面都很有用,尤其是为了确保 Redis Cluster 能够将您的请求转发到适当的集群节点(Redis Cluster 正在进行中,但脚本功能的设计是为了很好地使用它) . 但是,此规则并未强制执行,以便为用户提供滥用 Redis 单实例配置的机会,代价是编写与 Redis 集群不兼容的脚本。
综上所述,在使用 Redis Cluster 时,以正确的方式传递 key是相关的,因此 Redis 集群机制知道你在操作什么数据,并且由于它,它知道你的数据在哪里。
当您不想使用 Redis Cluster 或以其他方式实现集群时,以正确的方式传递密钥不是强制性的。
您的原子访问是否需要在从哈希中读取键名的操作中产生,还是仅在您读取键名并准备进一步使用它之后才需要?
如果你需要它,然后使用 Lua 脚本从哈希中读取键名,将其存储在一个变量中,然后在根据该键名获取数据时进一步使用它。如果您只需要第二部分的原子性,请首先读取键名,然后将其用作 Redis 文档为第二部分建议的参数。