Redis提供量执行Lua脚本的命令:https://redis.io/commands/eval/
Redis控制台执行(一般不直接使用)
eval "return redis.call('set','name','zhangsan')" 0
解释
- eval 是Redis的命令 去执行lua脚本内容
- "return redis.call('set','name','zhangsan')" lua语法:set 一个key名name,值是zhangsan
- 0 脚本需要传参的个数。lua与shell一样,0代表一个参数
lua操作Redis
本质是需要引入lua操作Redis库的。本质是Java执行Redis命令去调用Lua脚本,然后Lua操作了Redis。所以不需要引入Lua的Redis库去操作。白话就是 Redis操作Lua执行Redis命令。
redis.call('命令名称','key','其他参数'...)
Java操作Redis执行lua脚本实现redis
lua 脚本被当做一命令集合一起被执行,且 redis 是单线处理机制,因此不需要 WATCH 保证隔离性,天然具备隔离性。
// 预加载脚本,避免频繁读取脚本。同时mylua.lua文件需要放在resources下
public static final DefaultRedisScript luaScript;
static {
luaScript = new DefaultRedisScript();
luaScript.setLocation(new ClassPathResource("mylua.lua")); // 指定脚本文件路径
luaScript.setResultType(Long.class); // 指定脚本返回值类型
}
@Test
public void java操作redis执行lua执行redis() {
Object execute = redisTemplate.opsForValue().getOperations().execute(luaScript, Collections.singletonList("Key中第一个参数"), "我是其他参数中第一个");
System.out.println(execute.toString());
}
mylua.lua文件 放在Resources下
-- 环境说明:当前数据库中存储的 key是用户唯一性标识,value代表优惠券id。要求判断用户是否使用过此优惠券
-- 键名用户唯一性标识,由执行命令的脚本传递
local key = KEYS[1]
-- 优惠券Id,由java的方法的其他参数传递
local couponId = ARGV[1]
-- 从redis读取用户是否使用
local isUse = redis.call('get',key)
-- 判断redis中的锁与其他参数是否一致
-- 注意 如果isUse在redis中没有,isUse也不是一个nil的存在,我看的其他博客说的是table
if isUse ~= couponId then
redis.call('set','result','用户优惠券与目标优惠券不一致')
redis.call('set',key,couponId)
return 0
else
redis.call('set','result','用户已经使用过此优惠券了')
return 1
end
return -1
执行两次命令,返回值是不同的,请尝试!
特殊说明:
上述文章均是作者实际操作后产出。烦请各位,请勿直接盗用!转载记得标注原文链接:www.zanglikun.com
第三方平台不会及时更新本文最新内容。如果发现本文资料不全,可访问本人的Java博客搜索:标题关键字。以获取最新全部资料 ❤
第三方平台不会及时更新本文最新内容。如果发现本文资料不全,可访问本人的Java博客搜索:标题关键字。以获取最新全部资料 ❤