从Lua脚本返回Set

Lua脚本:

local r = {}

for _, m in pairs(ARGV) do
    if redis.call('SISMEMBER', KEYS[1], m) == 1 then
        r[#r + 1] = m
    end
end
return r

我正在使用sprint boot的redis模板

@Autowired
private RedisScript<Set> redisScript;

Set<String> set = redisTemplete.execute(redisScript,"a", Arrays.asList("1", "2")); --执行redis lua脚本

上述redisTemplete.execute 命令不起作用 报错:java.lang.ClassCastException: java.lang.String 无法转换为java.util.Set

当我将结果分配给List而不是Set时 它能够工作 List<String> set = redisTemplete.execute(redisScript, "a", Arrays.asList("1", "2")); --工作

有没有办法修改Lua脚本,使其返回Set而不是List?

点赞
用户2858170
用户2858170

https://docs.spring.io/spring-data/redis/docs/current/api/org/springframework/data/redis/core/script/RedisScript.html

接口RedisScript

类型参数:

  • T - 脚本结果类型。 应该是Long、Boolean、List或反序列化值类型之一。如果脚本返回一个一次性状态(即“OK”),则可为null。

因此,您的redis脚本一开始不应具有Set类型。

执行将返回该类型。因此,如果要获得Set,您可能需要在Java端将List转换为Set。

https://redis.io/commands/eval

注意:正如您所看到的,Lua数组被返回为Redis多批回复,即Redis返回类型,您的客户端库可能会将其转换为程序设计语言中的Array类型。

尽管您可以使用表在Lua中实现集合,但我认为没有办法通过您的API获取该集合,因为它将被转换为多个批回复,然后转换为List。

2021-07-22 08:09:28