首页 > 解决方案 > 从 Lua 脚本返回集

问题描述

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-templete

@Autowired
private RedisScript<Set> redisScript;

Set<String> set = redisTemplete.execute(redisScript,"a", Arrays.asList("1", "2")); --to execute redis lua scipt 

Above redisTemplete.execute command not working error: java.lang.ClassCastException: java.lang.String cannot be cast to java.util.Set

It works when I use assign result to List instead of Set    List<String> set = redisTemplete.execute(redisScript, "a", Arrays.asList("1", "2")); --working

有什么方法可以修改 Lua 脚本,使其返回集合而不是列表?

标签: javaspring-bootredislua

解决方案


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

接口 RedisScript<T>

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

因此,您的 redis 脚本首先不应具有 Set 类型。

执行将返回该类型。因此,如果您想要一个 Set,您可能会将您的 List 转换为 Java 端的 Set。

来自https://redis.io/commands/eval

注意:正如您所见,Lua 数组作为 Redis 多批量回复返回,这是一种 Redis 返回类型,您的客户端库可能会在您的编程语言中将其转换为 Array 类型。

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


推荐阅读