springboot使用redisTemplate操作lua脚本

 更新时间:2022年08月17日 14:33:24   作者:秃了也弱了。  
本文主要介绍了springboot使用redisTemplate操作lua脚本,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

写在前面

操作redis使用Lua脚本有诸多好处

  • 减少网络开销:可以将多个请求通过脚本的形式一次发送,减少网络时延和请求次数。
  • 原子性的操作:Redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。因此在编写脚本的过程中无需担心会出现竞态条件,无需使用事务。
  • 代码复用:客户端发送的脚步会永久存在redis中,这样,其他客户端可以复用这一脚本来完成相同的逻辑。
  • 速度快:见 与其它语言的性能比较, 还有一个 JIT编译器可以显著地提高多数任务的性能; 对于那些仍然对性能不满意的人, 可以把关键部分使用C实现, 然后与其集成, 这样还可以享受其它方面的好处。**
  • 可以移植:只要是有ANSI C 编译器的平台都可以编译,你可以看到它可以在几乎所有的平台上运行:从 Windows 到Linux,同样Mac平台也没问题, 再到移动平台、游戏主机,甚至浏览器也可以完美使用 (翻译成JavaScript)。
  • 源码小巧:20000行C代码,可以编译进182K的可执行文件,加载快,运行快。

使用lua

@Test
public void redisLuaTest(){

    String script1 = "if redis.call('setnx', KEYS[1], ARGV[1]) == 1 then redis.call('set', KEYS[2], ARGV[2]) return 1 else return 0 end";
    Long result1 = (Long)redisTemplate.execute(
            new DefaultRedisScript<Long>(script1, Long.class),
            Arrays.asList("key1", "key2"),
            "value1", "value2"
    );
    System.out.println(result1); // 1

    // 如果key1==value1,则删除key1,返回删除的状态,否则返回0
    String script2 = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
    Long result2 = (Long)redisTemplate.execute(
            new DefaultRedisScript<Long>(script2, Long.class),
            Arrays.asList("key1"),
            "value1"
    );
    System.out.println(result2); // 1
}

解释

/**
第一个参数使用默认的DefaultRedisScript即可;
List<K> keys是key的集合
Object... args是val的集合
*/
@Override
public <T> T execute(RedisScript<T> script, List<K> keys, Object... args) {
    return scriptExecutor.execute(script, keys, args);
}

key的集合,在lua中可以使用KEYS[1]、KEYS[2]……获取,注意KEYS必须大写不能拼错;
val的集合,在lua中可以使用ARGV[1]、ARGV[2]……获取,注意ARGV必须大写不能拼错。

说白了,使用redisTemplate操作lua,也就是传key的集合和val的集合,这一串lua脚本可以保证其原子性的。

具体lua语法其实也很简单,基本掌握了if else、循环、赋值语句,就能应付大部分操作redis的命令。

lua中的redis.call命令就是操作redis的命令,第一个参数就是redis的原始命令,后面的参数就是redis命令的参数,使用起来也非常方便。

到此这篇关于springboot使用redisTemplate操作lua脚本的文章就介绍到这了,更多相关springboot redisTemplate操作lua内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 在Eclipse安装Spring boot插件的步骤(图文)

    在Eclipse安装Spring boot插件的步骤(图文)

    这篇文章主要介绍了在Eclipse安装Spring boot插件的步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • 简单了解Mybatis如何实现SQL防注入

    简单了解Mybatis如何实现SQL防注入

    这篇文章主要介绍了简单了解Mybatis如何实现SQL防注入,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • 如何使用BufferedReader循环读文件

    如何使用BufferedReader循环读文件

    这篇文章主要介绍了如何使用BufferedReader循环读文件的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Freemaker Replace函数的正则表达式运用

    Freemaker Replace函数的正则表达式运用

    这篇文章主要介绍了Freemaker Replace函数的正则表达式运用 的相关资料,需要的朋友可以参考下
    2015-12-12
  • 如何使用Java生成PDF文档详解

    如何使用Java生成PDF文档详解

    这篇文章主要给大家介绍了关于如何使用Java生成PDF文档的相关资料,PDF是可移植文档格式,是一种电子文件格式,具有许多其他电子文档格式无法相比的优点,需要的朋友可以参考下
    2023-07-07
  • spring boot Rabbit高级教程(最新推荐)

    spring boot Rabbit高级教程(最新推荐)

    RabbitMQ的消息过期是基于追溯方式来实现的,也就是说当一个消息的TTL到期以后不一定会被移除或投递到死信交换机,而是在消息恰好处于队首时才会被处理,本篇文章给大家介绍spring boot Rabbit高级教程,感兴趣的朋友一起看看吧
    2023-10-10
  • Java版水果管理系统源码

    Java版水果管理系统源码

    这篇文章主要为大家详细介绍了Java版水果管理系统源码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • java迭代器中删除元素的实例操作详解

    java迭代器中删除元素的实例操作详解

    在本篇内容里小编给各位分享了一篇关于java迭代器中删除元素的实例操作详解内容,有兴趣的朋友们可以学习下。
    2021-01-01
  • Spring Boot 自动配置之条件注解浅析

    Spring Boot 自动配置之条件注解浅析

    这篇文章主要介绍了Spring Boot 自动配置之条件注解浅析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-02-02
  • RabbitMq中channel接口的几种常用参数详解

    RabbitMq中channel接口的几种常用参数详解

    这篇文章主要介绍了RabbitMq中channel接口的几种常用参数详解,RabbitMQ 不会为未确认的消息设置过期时间,它判断此消息是否需要重新投递给消费者的唯一依据是消费该消息的消费者连接是否己经断开,需要的朋友可以参考下
    2023-08-08

最新评论