分布式Redis|使用Lua脚本自定义Redis命令

Redis(REmote DIctionary Server)是一个Key Value存储系统,是非常著名的NoSQL数据库之一。

Redis常常作为系统的缓存Cache使用。在互联网行业应用十分广泛,是进入互联网行业Java攻城狮必备技能。

开始之前,分享给大家这套Redis教程,在视频中,你能了解NoSQL是什么,NoSQL和关系型数据库的对比优缺点。

掌握Redis是什么、能干什么、如何用;掌握Redis在Windows和Linux下的安装配置、五大数据类型、常用操作命

令、Redis持久化、主从复制、事务控制以及用Jedis操作进行Java开发等技术点。

在线观看:

Redis实战精讲-13小时彻底搞定Redis
Redis教程-最新Redis视频教程-不得不精Redis
SpringBoot视频教程(九)SpringBoot集成Redis

视频资料及源码免费下载:

Redis实战精讲-13小时彻底搞定Redis
SpringBoot实战讲解-SpringBoot从入门到精通
Spring Boot 升级版最新教程全面讲解【通俗易懂】

1.在Redis中使用Lua

在Redis中执行Lua脚本有两种方法:eval和evalsha。

1.1 eval
在这里插入图片描述
下面例子使用了key列表和参数列表来为Lua脚本提供更多的灵活性:
在这里插入图片描述
此时KEYS[1]=“redis”,ARGV[1]=“world”,所以最终的返回结果是"hello redisworld"。

如果Lua脚本较长,还可以使用redis-cli–eval直接执行文件。
在这里插入图片描述
注意,这种方式不需要指定key的数量,用 , 号划分key和arg,注意逗号左右的空格。
eval命令和–eval参数本质是一样的,客户端如果想执行Lua脚本,首先在客户端编写好Lua脚本代码,然后把脚本作为字符串发送给服务端,服务端会将执行结果返回给客户端。

1.2 evalsha

除了使用eval,Redis还提供了evalsha命令来执行Lua脚本。

首先要将Lua脚本加载到Redis服务端,得到该脚本的SHA1校验和,evalsha命令使用SHA1作为参数可以直接执行对应Lua脚本,避免每次发送Lua脚本的开销。这样客户端就不需要每次执行脚本内容,而脚本也会常驻在服务端,脚本功能得到了复用。

加载脚本

script load命令可以将脚本内容加载到Redis内存中,例如下面将lua_get.lua加载到Redis中,得到SHA1为:“7413dc2440db1fea7c0a0bde841fa68eefaf149c”
在这里插入图片描述
执行脚本

evalsha的使用方法如下,参数使用SHA1值,执行逻辑和eval一致。
在这里插入图片描述
所以只需要执行如下操作,就可以调用lua_get.lua脚本:
在这里插入图片描述

2.Lua的RedisAPI

Lua可以使用redis.call函数实现对Redis的访问,例如下面代码是Lua使用redis.call调用了Redis的set和get操作:
在这里插入图片描述
放在Redis的执行效果如下:
在这里插入图片描述
除此之外Lua还可以使用redis.pcall函数实现对Redis的调用,redis.call和redis.pcall的不同在于,如果redis.call执行失败,那么脚本执行结束会直接返回错误,而redis.pcall会忽略错误继续执行脚本,所以在实际开发中要根据具体的应用场景进行函数的选择。

获取KEY可以通过 KEYS[1],获取 Value 可以通过 ARGV[1] 。

3.开发提示

Lua可以使用redis.log函数将Lua脚本的日志输出到Redis的日志文件中,但是一定要控制日志级别。Redis3.2提供了Lua Script Debugger功能用来调试复杂的Lua脚本,具体可以参考:http://redis.io/topics/ldb。
在这里插入图片描述
其他还有:

redis.LOG_DEBUG

redis.LOG_VERBOSE

redis.LOG_NOTICE

redis.LOG_WARNING

4.SpringBoot通过RedisTemplate执行Lua脚本

1.RedisScript

首先你得引入spring-boot-starter-data-redis依赖,其次把lua脚本放在resources目录下。
分布式Redis|使用Lua脚本自定义Redis命令_第1张图片
在Spring Boot2.0的时候,上述配置没有问题,但在Spring Boot1.5测试会出错,需要将List.class改为具体的返回类型(如Long.class)。

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

2.调用脚本
分布式Redis|使用Lua脚本自定义Redis命令_第2张图片
若是出现序列化问题,可以指定序列化方式。
在这里插入图片描述
3.Lua脚本
分布式Redis|使用Lua脚本自定义Redis命令_第3张图片

作者:薛师兄
主页:github.com/onblog
原文链接:https://my.oschina.net/u/3464538/blog/4491661

你可能感兴趣的:(编程语言,Java,springboot,java,编程语言,redis)