从 Lua 脚本返回集

Posted

技术标签:

【中文标题】从 Lua 脚本返回集【英文标题】:Return Set from Lua Script 【发布时间】:2021-09-29 11:19:26 【问题描述】:

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 脚本使其返回 set 而不是 List?

【问题讨论】:

【参考方案1】:

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

接口 RedisScript

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

所以你的 redis 脚本一开始就不应该有 Set 类型。

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

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

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

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

【讨论】:

以上是关于从 Lua 脚本返回集的主要内容,如果未能解决你的问题,请参考以下文章

Lua脚本语言——进阶语法

基于lua的网页脚本开发语言cgilua(转)

欲求不满之 Redis Lua脚本的执行原理

Redis使用Lua的一些优化和注意事项

Lua入门脚本(与Redis结合)

Redis Lua 脚本解包返回不同的结果