前言
在高并发场景下redis写入数据时可能会产生脏数据,再不加锁的情况下redis多个操作之间是不能保证其原子性的,这里我们可以通过lua脚本来执行多个操作,解决这个问题。
redis下载安装:http://www.runoob.com/redis/redis-install.html
lua下载安装 :https://www.runoob.com/lua/lua-environment.html
整合redis教程:https://m.aliyun.com/jiaocheng/1426152.html
redis基本操作:http://www.runoob.com/redis/redis-lists.html
lua基础语法 :http://www.runoob.com/lua/lua-iterators.html
终端测试
1.启动本地redis-server服务
2.测试lua脚本(test.lua)
redis.call(“del”,KEYS[1])
for i in ipairs(ARGV)
do
redis.call("lpush",KEYS[1],ARGV[i])
end
Lua语法详情查看上方链接
3.终端redis-cli执行lua脚本
redis-cli --eval /Users/webuy/Downloads/test.lua list , 10 9 8 7 6 5 4 3 2 1
redis-cli redis客户端
--eval 告诉redis-cli读取并运行后面的Lua脚本
/Users/webuy/Downloads/test.lua Lua脚本地址
list redis的key(多个key用空格分开,index从1开始)
, 10 9 8 7 6 5 4 3 2 1 数组数据index从1开始
4.效果如图
JAVA语法
@Autowired
private RedisTemplate redisTemplate;
public void setListToRedisByLua(){
List listObject = new ArrayList();
for(int i=0; i<11 ; i++){
listObject.add(i);
}
//JSON格式存储
String[] strings = new String[listObject.size()];
for (int i = 0; i < listObject.size(); i++) {
strings[i] = JSONObject.toJSONString(listObject.get(i));
}
//redis脚本对象
DefaultRedisScript<Long> defaultRedisScript = new DefaultRedisScript<>();
defaultRedisScript.setResultType(Long.class);
defaultRedisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource("脚本地址")));
//执行
redisTemplate.execute(defaultRedisScript, Collections.singletonList("redis的key"), strings);
}