SpringBoot通过RedisTemplate执行Lua脚本的方法步骤

lua 脚本

Redis 中使用 lua 脚本,我们需要注意的是,从 Redis 2.6.0后才支持 lua 脚本的执行。

使用 lua 脚本的好处:

原子操作:lua脚本是作为一个整体执行的,所以中间不会被其他命令插入。
减少网络开销:可以将多个请求通过脚本的形式一次发送,减少网络时延。
复用性:lua脚本可以常驻在redis内存中,所以在使用的时候,可以直接拿来复用,也减少了代码量。

1.RedisScript

首先你得引入spring-boot-starter-data-redis依赖,其次把lua脚本放在resources目录下。

@Bean public DefaultRedisScript<List> defaultRedisScript() {
DefaultRedisScript<List> defaultRedisScript = new DefaultRedisScript<>();
defaultRedisScript.setResultType(List.class);
defaultRedisScript.setScriptSource(new ResourceScriptSource(new
ClassPathResource("redis/demo.lua"))); return defaultRedisScript; }

在Spring Boot2.0的时候,上述配置没有问题,但在Spring

Boot1.5测试会出错,需要将List.class改为具体的返回类型(如Long.class)。

RedisScript的getSha1()方法可以获取脚本摘要。

2.调用脚本

/** * List设置lua的KEYS */ List<String> keyList = new ArrayList();
keyList.add("count"); keyList.add("rate.limiting:127.0.0.1"); /** * 

用Mpa设置Lua的ARGV[1]

*/ Map<String, Object> argvMap = new HashMap<String, 

Object>(); argvMap.put("expire", 10000); argvMap.put("times", 10); /** *

调用脚本并执行

 */ List result = redisTemplate1.execute(redisScript, keyList, argvMap); 

System.out.println(result);

若是出现序列化问题,可以指定序列化方式。

public <T> T execute(RedisScript<T> script, RedisSerializer<?> argsSerializer,
RedisSerializer<T> resultSerializer, List<K> keys, Object... args) { return
scriptExecutor.execute(script, argsSerializer, resultSerializer, keys, args); } 

3.Lua脚本

--获取KEY local key1 = KEYS[1] local key2 = KEYS[2] --

获取ARGV[1],这里对应到应用端是一个List<Map>. -- 注意,这里接收到是的字符串,所以需要用csjon库解码成table类型 local

receive_arg_json = cjson.decode(ARGV[1]) --获取ARGV内的参数并打印 local expire =
receive_arg_json.expire local times = receive_arg_json.times 

总结

以上所述是小编给大家介绍的SpringBoot通过RedisTemplate执行Lua脚本的方法步骤,希望对大家有所帮助!

(0)

相关推荐

  • SpringBoot+Redis执行lua脚本的方法步骤

    1.背景 有时候,我们需要一次性操作多个 Redis 命令,但是 这样的多个操作不具备原子性,而且 Redis 的事务也不够强大,不支持事务的回滚,还无法实现命令之间的逻辑关系计算.所以,一般在开发中,我们会利用 lua 脚本来实现 Redis 的事务. 2.lua 脚本 Redis 中使用 lua 脚本,我们需要注意的是,从 Redis 2.6.0后才支持 lua 脚本的执行. 使用 lua 脚本的好处: 原子操作:lua脚本是作为一个整体执行的,所以中间不会被其他命令插入. 减少网络开销:可

  • Spring Boot单元测试中使用mockito框架mock掉整个RedisTemplate的示例

    概述 当我们使用单元测试来验证应用程序代码时,如果代码中需要访问Redis,那么为了保证单元测试不依赖Redis,需要将整个Redis mock掉.在Spring Boot中结合mockito很容易做到这一点,如下代码: import org.mockito.Mockito; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration

  • Spring boot项目redisTemplate实现轻量级消息队列的方法

    背景 公司项目有个需求, 前端上传excel文件, 后端读取数据.处理数据.返回错误数据, 最简单的方式同步处理, 客户端上传文件后一直阻塞等待响应, 但用户体验无疑很差, 处理数据可能十分耗时, 没人愿意傻等, 由于项目暂未使用ActiveMQ等消息队列中间件, 而redis的lpush和rpop很适合作为一种轻量级的消息队列实现, 所以用它完成此次功能开发 一.本文涉及知识点 excel文件读写--阿里easyexcel sdk 文件上传.下载--腾讯云对象存储 远程服务调用--restTe

  • SpringBoot通过RedisTemplate执行Lua脚本的方法步骤

    lua 脚本 Redis 中使用 lua 脚本,我们需要注意的是,从 Redis 2.6.0后才支持 lua 脚本的执行. 使用 lua 脚本的好处: 原子操作:lua脚本是作为一个整体执行的,所以中间不会被其他命令插入. 减少网络开销:可以将多个请求通过脚本的形式一次发送,减少网络时延. 复用性:lua脚本可以常驻在redis内存中,所以在使用的时候,可以直接拿来复用,也减少了代码量. 1.RedisScript 首先你得引入spring-boot-starter-data-redis依赖,其

  • SpringBoot通过redisTemplate调用lua脚本并打印调试信息到redis log(方法步骤详解)

    第一次写Lua脚本,并通过springboot的redisTemplate调用脚本,进行脚本与应用的交互.不熟悉真的折腾了好久,现在总结一下学习过程: 第一次写完lua时,想到的就是如何在应用调用脚本的时候,去调试脚本.在网上海搜了一把,能找到的有点相关的寥寥无几. 有一种方法是通过执行redis命令,调用redis客户端,加载lua脚本,然后出现基于命令行调试的交互界面,输入调试命令去调试脚本.如下: 在终端输入命令:redis-cli.exe --ldb --eval LimitLoadTi

  • springboot使用redisTemplate操作lua脚本

    目录 写在前面 使用lua 解释 写在前面 操作redis使用Lua脚本有诸多好处 减少网络开销:可以将多个请求通过脚本的形式一次发送,减少网络时延和请求次数. 原子性的操作:Redis会将整个脚本作为一个整体执行,中间不会被其他命令插入.因此在编写脚本的过程中无需担心会出现竞态条件,无需使用事务. 代码复用:客户端发送的脚步会永久存在redis中,这样,其他客户端可以复用这一脚本来完成相同的逻辑. 速度快:见 与其它语言的性能比较, 还有一个 JIT编译器可以显著地提高多数任务的性能; 对于那

  • SpringBoot启动时自动执行sql脚本的方法步骤

    需要配置项目下的yml文件: 在文件下加如如下配置: data: classpath:code-generator-data.sql initialization-mode: always spring.datasource.initialization-mode: 初始化模式(springboot2.0),其中有三个值: always为始终执行初始化 embedded只初始化内存数据库(默认值),如h2等 never为不执行初始化 spring.datasource.data: 数据初始化,默

  • C# 执行Javascript脚本的方法步骤

    前一阵子使用C#编写SCXML状态机,需要解析EMCScript表达式,使用了Jint库(https://github.com/sebastienros/jint/),当时感觉与C#之间的数据转换不是很方便.这两天有时间又关注了一下,发现新的3.0版本有了很大改进,在这里介绍给大家,供参考. 首先要安装nuget包,注意增加prerelease选项,安装最新的版本,使用dotnet命令行指令如下: dotnet add  package Jint --prerelease 直接计算表达式: Co

  • redis执行lua脚本的实现方法

    目录 1. 语法格式 2.类型转换 3.lua脚本 3.1 script命令 3.2 脚本原子性 3.3 脚本缓存和EVALSHA 3.4 全局变量保护 3.5 日志记录 从redis 2.6.0版本开始,redis内置了Lua解释器,并提供了eval命令来解析Lua脚本求值. 1. 语法格式 语法: eval script numkeys keys args 参数: eval - redis提供解析lua脚本的命令          script - lua脚本           numke

  • centos 设置定时任务执行指定脚本的方法

    vim /etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ # For details see man 4 crontabs # Example of job definition: # .---------------- minute (0 - 59) # |  .------------- hour (0 - 23) # |  |  .---------- day of mont

  • phpredis执行LUA脚本示例代码

    前言 本文主要给大家介绍了关于phpredis执行LUA脚本的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 示例代码 $lua = <<<EOT local kws = {} local lrkws = {} local nkws = {} local kw_ids = {} local lr_ids = {} local n_ids = {} for kw in string.gmatch(KEYS[1], "[^|]+") do tab

  • windows 10 设定计划任务自动执行 python 脚本的方法

    我用 python 写了一些脚本,有一些是爬虫脚本,比如爬取知乎特定话题的热门问题,有一些是定期的统计分析脚本,输出统计结果到文档中.之前我都是手动执行这些脚本,现在我希望如何这些脚本能自动定时执行.那么,windows 10 操作系统如何定时自动执行 python 脚本? 我的设备是 windows 10操作系统,自带的"计划任务"可以满足我的需求,具体操作步骤,整理如下. 步骤1:打开 "计算机管理" 界面 点击电脑左下角的windows图标,或者键盘的wind

随机推荐