java - 从 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 脚本,使其返回集合而不是列表?
解决方案
接口 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 获取该集合,因为它将转换为多批量回复,然后再转换为列表。
推荐阅读
- powershell - PowerShell:通过 .bat 脚本打开文件
- html - 可以在 html5 清单中缓存的文件数量是否有限制?
- azure - 带有私有/公共 IP 和 VM 计数条件的 Azure ARM 模板
- javascript - ExpressJs 等到 MongoDB 获取数据并在输出之前循环
- powerapps - MS powerapps 构建的底层框架和编程语言是什么?
- javascript - Dynamics365 列表视图:自定义 javascript 位于何处?
- html - 如何制作自适应图像滑块?
- r - 将动作按钮与 selectinput 水平对齐
- git - github:将 master 上的最后一次提交恢复到生产环境
- c++ - qt c++ QPaint 与 QVector