前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java调用Lua脚本操作Redis

Java调用Lua脚本操作Redis

作者头像
收心
发布2022-08-01 08:59:19
2.1K0
发布2022-08-01 08:59:19
举报
文章被收录于专栏:Java实战博客

Redis提供量执行Lua脚本的命令:https://redis.io/commands/eval/

Redis控制台执行(一般不直接使用)

代码语言:javascript
复制
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

代码语言:javascript
复制
redis.call('命令名称','key','其他参数'...)

Java操作lua脚本实现redis

lua 脚本被当做一命令集合一起被执行,且 redis 是单线处理机制,因此不需要 WATCH 保证隔离性,天然具备隔离性。

代码语言:javascript
复制
    // 预加载脚本,避免频繁读取脚本。同时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操作lua执行redis() {
        Object execute = redisTemplate.opsForValue().getOperations().execute(luaScript, Collections.singletonList("Key中第一个参数"), "我是其他参数中第一个");
        System.out.println(execute.toString());
    }

mylua.lua文件 放在Resources下

代码语言:javascript
复制
-- 环境说明:当前数据库中存储的 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

执行两次命令,返回值是不同的,请尝试!

特殊说明: 以上文章,均是我实际操作,写出来的笔记资料,不会盗用别人文章!烦请各位,请勿直接盗用!转载记得标注来源!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Redis控制台执行(一般不直接使用)
  • lua操作Redis
  • Java操作lua脚本实现redis
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档