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

前言

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

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值