您的位置:首页 > 数据库 > Redis

通过lua脚本保证redis操作在并发场景下的原子性

2019-01-24 21:03 731 查看

前言

          在高并发场景下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)

[code]redis.call(“del”,KEYS[1])

for i in ipairs(ARGV)
do
redis.call("lpush",KEYS[1],ARGV[i])
end

Lua语法详情查看上方链接

         3.终端redis-cli执行lua脚本

[code]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语法

[code]    @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);
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: