java调用redis脚本_Java架构笔记-SpringBoot使用Lua脚本操作Redis

本文介绍SpringBoot如果通过Lua脚本去执行Redis,介绍简单用法例子,如对Lua脚本还不了解的可以先参考我这边文章Lua脚本快速入门更深层次的用法请参考Redis官网

1. 添加依赖

org.springframework.boot

spring-boot-starter-data-redis

org.springframework.boot

spring-boot-starter-web

2. 编写Lua脚本

---

--- Created by Gjing.

--- DateTime: 2019/6/21 10:49

---

--- 获取key

local key = KEYS[1]

--- 获取value

local val = KEYS[2]

--- 获取一个参数

local expire = ARGV[1]

--- 如果redis找不到这个key就去插入

if redis.call("get", key) == false then

--- 如果插入成功,就去设置过期值

if redis.call("set", key, val) then

--- 由于lua脚本接收到参数都会转为String,所以要转成数字类型才能比较

if tonumber(expire) > 0 then

--- 设置过期时间

redis.call("expire", key, expire)

end

return true

end

return false

else

return false

end

3. 编写配置

/**

* @author Gjing

**/

@Configuration

public class LuaConfiguration {

@Bean

public DefaultRedisScript redisScript() {

DefaultRedisScript redisScript = new DefaultRedisScript<>();

redisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource("script/Test.lua")));

redisScript.setResultType(Boolean.class);

return redisScript;

}

}

4. 调用测试

/**

* @author Gjing

**/

@RestController

public class LockController {

@Resource

private DefaultRedisScript redisScript;

@Resource

private StringRedisTemplate stringRedisTemplate;

@GetMapping("/lua")

public ResponseEntity lua() {

List keys = Arrays.asList("testLua", "hello lua");

Boolean execute = stringRedisTemplate.execute(redisScript, keys, "100");

assert execute != null;

return ResponseEntity.ok(execute);

}

}

5. 返回结果执行成功控制台输出执行失败控制台输出

Redis中内容

6. Redis使用Lua的好处1.减少网络开销:本来5次网络请求的操作,可以用一个请求完成,原先5次请求的逻辑放在redis服务器上完成。使用脚本,减少了网络往返时延。

2.原子操作:Redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。

3.复用:客户端发送的脚本会永久存储在Redis中,意味着其他客户端可以复用这一脚本而不需要使用代码完成同样的逻辑。

7. Redis使用Lua的注意点1.Lua脚本的bug特别可怕,由于Redis的单线程特点,一旦Lua脚本出现不会返回(不是返回值)得问题,那么这个脚本就会阻塞整个redis实例。

2.Lua脚本应该尽量短小实现关键步骤即可。(原因同上)

3.Lua脚本中不应该出现常量Key,这样会导致每次执行时都会在脚本字典中新建一个条目,应该使用全局变量数组KEYS和ARGV, KEYS和ARGV的索引都从1开始

4.传递给lua脚本的的键和参数:传递给lua脚本的键列表应该包括可能会读取或者写入的所有键。传入全部的键使得在使用各种分片或者集群技术时,其他软件可以在应用层检查所有的数据是不是都在同一个分片里面。另外集群版redis也会对将要访问的key进行检查,如果不在同一个服务器里面,那么redis将会返回一个错误。(决定使用集群版之前应该考虑业务拆分),参数列表无所谓。。

5.lua脚本跟单个redis命令和事务段一样都是原子的已经进行了数据写入的lua脚本将无法中断,只能使用SHUTDOWN NOSAVE杀死Redis服务器,所以lua脚本一定要测试好。

每天更新,记得点个关注,喜欢交流和分享的伙伴也可以私信我,拉你进我的Java交流群!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值