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());
    }

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

相关推荐
\光辉岁月/几秒前
15.JavaSE-网络
java·开发语言·网络
const_qiu1 分钟前
第二章 2.4:搭建 Monorepo 骨架 + 共享包 @autix/contracts
java·人工智能·arcgis
Lysander.Jovian7 分钟前
Redis使用
redis
救救孩子把21 分钟前
AI面试八股文-03_3-RAG 系统面试题
人工智能·redis·面试·agent·rag
wangchunyu11434 分钟前
JDK8新特性实战(Lambda、Stream、Optional)
java·开发语言
JosieBook1 小时前
【多线程】两台机器同时抢一个字典:一次并发 Bug 的排查
java·网络·bug
牛战士coding1 小时前
LLM 选错工具怎么办?提示词之外还需要确定性规则兜底
java·人工智能
今天的砖头有点烫手啊1 小时前
Java 序列化到底怎么选?从 Serializable 到 Protobuf 的演进与选型
java·json
Wang's Blog1 小时前
Java 项目实战: 交友项目 - 登录发送验证码的测试验证与经验复盘
java·开发语言·交友
夕除1 小时前
redis--主从还是集群,内存
java·spring·mybatis