通过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); }
相关文章推荐
- Go语言中通过Lua脚本操作Redis的方法
- Redis之使用lua脚本操作redis数据库的原因
- Redis系列四 - 在springboot中通过Lua脚本在redis中实现定时任务
- 使用Lua脚本完成高并发下Redis数据修改
- 使用lua脚本和jedis实现redis的hmsetnx命令,操作hash表时不覆盖原有数据
- lua脚本操作redis数据库
- Lua 脚本 Lua 脚本功能是 Reids 2.6 版本的最大亮点, 通过内嵌对 Lua 环境的支持, Redis 解决了长久以来不能高效地处理 CAS (check-and-set)命令的缺点,
- nginx嵌入lua脚本操作redis
- redis多个线程操作单个key场景的并发问题
- redis中的事务、lua脚本和管道的使用场景
- redis中的事务、lua脚本和管道的使用场景
- redis中的事务、lua脚本和管道的使用场景
- 一个Lua脚本操作Redis的简单例子
- redis中的事务、lua脚本和管道的使用场景
- Redis使用lua脚本实现increase + expire 的原子操作
- Redis使用lua脚本实现increase + expire 的原子操作
- redis中的事务、lua脚本和管道的使用场景
- Java通过jedis操作redis(增删改查)
- ServiceStack.Redis常用操作 - 事务、并发锁
- 通过shell脚本进行数据库操作