1.lua+java
第一种形式直接在代码中
@Autowired
private RedisTemplate<String,String> redisTemplate;
@PostMapping("/test")
public Response test() {
String lua = "redis.call ('set', KEYS[1], ARGV[1]) "
+ " local str1 = redis.call ('get', KEYS [1]) "
+ " return str1 ";
DefaultRedisScript<String> rs = new DefaultRedisScript<>(lua, String.class);
String res =(String) redisTemplate.execute(rs,Arrays.asList("test"),"123456");
return Response.ok(res);
}
第二种形式放在配置文件中
@PostMapping("/test")
public Response test() {
DefaultRedisScript<String> rs = new DefaultRedisScript<>();
rs.setScriptSource(new ResourceScriptSource(new ClassPathResource("lua/hSet.lua")));
rs.setResultType(String.class);
/**
* 1.过期时间要变成字符串,时间为秒
* 2.FIELD 字段不能放到key中,不然会报错
* (error) CROSSSLOT Keys in request don't hash to the same slot
*/
redisTemplate.execute(rs,Arrays.asList("hashMapTest"),"app","12345689","130");
return Response.ok(1);
}
redis.call('HSET', KEYS[1],ARGV[1],ARGV[2])
redis.call('EXPIRE', KEYS[1],ARGV[3])
2.纯lua脚本
下面是通过Lua脚本来查找redis 中hash类型中有空值的数据。
eval "local keys=redis.call('keys','*'); local kP={}; local y='';for i=1,#keys do local b=redis.call('TYPE',keys[i]); for g,h in pairs(b) do if(h=='hash') then kP[i]=keys[i] else kP[i]=0 end ; end end for i,v in pairs(kP) do if(v~=0 and (redis.call('HEXISTS',v,'null')==1)) then y=y..' '..v end end ;return y" 0
格式化后
local keys=redis.call('keys','*');
local kP={}; local y='';
for i=1,#keys
do local b=redis.call('TYPE',keys[i]);
for g,h in pairs(b)
do if(h=='hash')
then kP[i]=keys[i] else kP[i]=0 end ;
end
end
for i,v in pairs(kP)
do if(v~=0 and(redis.call('HEXISTS',v,'null')==1))
then y=y..' '..v end
end ;
return y
1.在判断key是什么类型数据时遇到坑,不能直接判断redis.call(‘TYPE’,keys[i])=‘hash’,因为它返回的是ok和hash。
参考
https://blog.csdn.net/weixin_43603149/article/details/107262478