redis中的Lua脚本,redis的事务机制

lua脚本的特点

lua脚本可以操作redis数据库,并且脚本中的代码满足原子性,要么全部被执行,要么全部不执行

lua脚本的语法

脚本示例

lua脚本的草稿:

最终的lua脚本

lua脚本在java里调用的方法

RedisTemplete类里有一个方法,接收参数为

RedisScript类(储存lua脚本内容),List类型的 KEYS[]数组,Object类型的ARGY[]数组

1.编写lua脚本文件

保存文件名为unlock.lua

Lua 复制代码
if (redis.call('get', KEYS[1]) == ARGV[1]) then
    -- 一致则释放锁
    return redis.call('del', KEYS[1])
end
return 0

2.把lua文件读取为redis的lua脚本,也就是DefaultRedisScript类型的对象

java 复制代码
private static final DefaultRedisScript<Long> UNLOCK_SCRIPT;

static {
    UNLOCK_SCRIPT = new DefaultRedisScript();
    UNLOCK_SCRIPT.setLocation(new ClassPathResource("unlock.lua"));
    UNLOCK_SCRIPT.setResultType(Long.class);
}

3.在java里执行lua脚本

java 复制代码
    @Override
    public void unlock() {
        stringRedisTemplate.execute(UNLOCK_SCRIPT,
                Collections.singletonList(KEY_PREFIX + name),
                ID_PREFIX + Thread.currentThread().getId());
    }

这样就把解锁变为了一个原子性的事务

相关推荐
SimonKing26 分钟前
告别SQL盲猜!6种方案带你玩转SQL打印
java·后端·程序员
_祝你今天愉快29 分钟前
Java垃圾回收(GC)探析
android·java·后端
回家路上绕了弯31 分钟前
Java 本地缓存王者:Caffeine 全方位实战指南
java·后端
自由的疯40 分钟前
Java 11 新特性之 飞行记录器(JFR)
java·后端·架构
℡余晖^1 小时前
每日面试题20:spring和spring boot的区别
java·spring boot·spring
poemyang1 小时前
“同声传译”还是“全文翻译”?为何HotSpot虚拟机仍要保留解释器?
java·java虚拟机·aot·编译原理·解释执行
苦学编程的谢2 小时前
Spring AOP_2
java·后端·spring·java-ee
没有bug.的程序员2 小时前
《Spring Boot应用工程化提升:多模块、脚手架与DevTools》
java·运维·spring boot
Derek_Smart2 小时前
工业级TCP客户端高可靠连接架构设计与Netty优化实践
java·性能优化·netty