lotus

贵有恒何必三更眠五更起 最无益只怕一日曝十日寒

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  1846 随笔 :: 0 文章 :: 109 评论 :: 288万 阅读

 

 

【本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究。若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!】

如果你对Redis和Lua的关系不太清楚,请先阅读:Redis进阶之使用Lua脚本开发

1.RedisScript#

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

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

在Spring Boot2.0的时候,上述配置没有问题,但在Spring Boot1.5测试会出错,需要将List.class改为具体的返回类型(如Long.class)。

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

2.调用脚本#

Copy
/**
* 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);

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

Copy
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脚本#

【本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究。若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!】

Copy
--获取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

参考:https://blog.csdn.net/fsw4848438/article/details/81540495

 

 
posted on   白露~  阅读(1170)  评论(0编辑  收藏  举报
编辑推荐:
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示