Redis中的Lua脚本是否可以在运行时确定键值?

看一下这个Lua脚本:

        local clientIds = redis.call('ZRANGEBYSCORE', KEYS[1], '-inf', ARGV[1], 'LIMIT', '0', ARGV[2]);
        local prefix = 'lock:';
        local lockedClientIds = {};
        for _, value in ipairs(clientIds)
        do
           local key = prefix .. tostring(value)
           if redis.call('EXISTS', key) == 0 then
              redis.call('SET', key, 'PX', ARGV[3]);
              table.insert(lockedClientIds, value)
           end
        end
        redis.pcall('ZREM', KEYS[1], unpack(lockedClientIds));
        return lockedClientIds;

它从有序集合中取出一些值,并使用这些值创建键(经过一些简单的字符串拼接)。我不确定这是否可以,因为根据Redis Lua教程,所有键都应该在KEYS数组中提供,所以必须在编译时已知,而不是在运行时确定。

所有Redis命令必须在执行之前进行分析,以确定 命令将操作哪些键。为了使此为真 对于EVAL,必须显式传递键。这是很有用的,在很多方面都很有用 但特别是为了确保Redis Cluster可以将您的请求转发到 适当的集群节点。请注意,这个规则不是强制执行的。

所以这是什么意思?这意味着只有在单个节点上才能正常工作,当Redis分布在多个节点上时,它将无法正常工作吗?

点赞
用户4021802
用户4021802

是的,脚本在集群模式下可能无法正常工作。

只有在键在相同的hash插槽中时,它才会继续在集群模式下工作。可以使用hash标签的概念来实现这一点。

注意:我假设,“Redis分布在许多节点上”的意思是Redis集群模式。

2021-06-14 16:19:50