重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这篇文章将为大家详细讲解有关SpringBoot如何通过redisTemplate调用lua脚本并打印调试信息到redislog,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
成都创新互联公司,专注为中小企业提供官网建设、营销型网站制作、成都响应式网站建设、展示型成都网站制作、成都做网站等服务,帮助中小企业通过网站体现价值、有效益。帮助企业快速建站、解决网站建设与网站营销推广问题。
第一次写Lua脚本,并通过springboot的redisTemplate调用脚本,进行脚本与应用的交互。不熟悉真的折腾了好久,现在总结一下学习过程:
第一次写完lua时,想到的就是如何在应用调用脚本的时候,去调试脚本。在网上海搜了一把,能找到的有点相关的寥寥无几。
有一种方法是通过执行redis命令,调用redis客户端,加载lua脚本,然后出现基于命令行调试的交互界面,输入调试命令去调试脚本。如下:
在终端输入命令:redis-cli.exe --ldb --eval LimitLoadTimes.lua 1 mykey , myargv
--ldb:redis-cli.exe进行命令调试的必要参数
--eval:告诉redis客户端去加载Lua脚本,后面跟着的就是 lua脚本的路径(我是直接放在redis目录下),
1:传给Lua脚本的key的数量,我测试的时候是1
--mykey:自己传的一个key值,和前面的数量1对应
--myargv:自己传的除key外的参数,可以是多个
注,命令中的逗号不能忽略,并且前后要有一个空格
回车,如上图,本来以为可以进入调试,结果等了半天,一直没有出现交互的命令行界面,找了好久,还是没找到办法,结果只好先暂停(如果有大神遇到这种情况,跪求解~~)。换一种调试方式,把调试信息打在redis日志上。
下面是我自己调用脚本时,打印调试信息的方式,如果有更好的方式,请不吝赐教。
1、选择redisTemplate序列化方式
首先,创建一个redisTemplate,具体代码就不说了,这个比较简单。要注意的是,需要设置redisTemplate的序列化方式,springBoot默认是基于java jdk的序列化。通过这种序列化后的参数传到Lua脚本是,是无法正常打印到redis日志的,会出现乱码,而且参数如果传的是一个Map或List的话,不方便解析。并且这种序列化占用的字节比较大。所以改成JSON序列化,用FastJson实现。
下面贴上redis序列化代码:
public class FastJsonRedisSerializer
2、应用端加载脚本,并设置传递参数
在springboot中,是用 DefaultRedisScript 类来加载脚本的,并设置相应的数据类型来接收lua脚本返回的数据,这个泛型类在使用时设置泛型是什么类型,脚本返回的结果就是用什么类型接收。注意,该类只接收4种类型的返回类型,之前没注意,还纳闷为什么出错,看源码才晓得,截图,如下:
在lua脚本中,有两个全局的变量,是用来接收redis应用端传递的键值和其它参数的,分别为KEYS、ARGV。
在应用端传递给KEYS时是一个数组列表,在lua脚本中通过索引方式获取数组内的值。
在应用端,传递给ARGV的参数比较灵活,可以是多个独立的参数,但对应到Lua脚本中是,统一用ARGV这个数组接收,获取方式也是通过数组下标获取。
下面贴上应用端的测试代码:
@Service("luaScriptService")public class LuaScriptServiceImpl implements LuaScriptService{ @Autowired private RedisTemplate getRedisScript; @PostConstruct public void init(){ getRedisScript = new DefaultRedisScript
(); getRedisScript.setResultType(List.class); getRedisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource("luascript/LimitLoadTimes.lua"))); } @Override public void redisAddScriptExec(){ /** * List设置lua的KEYS */ List
代码中发送了两个key,还有一个map包装的argv,传递到Lua脚本中时,KEYS和ARGV接收到的是对象字符串,所以得用lua的库做相关的解码,我们发送的时候是用json序列化的,用Lua的库cjson可以转成json对象。下面贴上Lua脚本代码:
--获取KEYlocal key1 = KEYS[1]local key2 = KEYS[2]-- 获取ARGV[1],这里对应到应用端是一个List
3、设置日志级别
代码中,redis.log()函数向运日志中输出信息,这里要注意一下,函数里面设置的日志级别要和redis.conf配置文件中设置的日志级别一样才能正常打印到文件,这里我是设置成了deubg级别。这里可设置的级别有4种,分别如下:
redis.LOG_DEBUG redis.LOG_VERBOSE redis.LOG_NOTICE redis.LOG_WARNING
在应用端,我们设置接收返回的数据类型是List,所以在Lua脚本中,返回的类型用table与之对应,并且放到table变量中的内容,得是字符串,应用端才能通过反序列化,正常解析。下图是输出lua返回值的打印信息:
至此,结束,希望也能对其遇到相同问题的朋友有所帮助。
关于SpringBoot如何通过redisTemplate调用lua脚本并打印调试信息到redislog就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。