通过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
    评论
Redis中,Lua脚本可以通过使用EVAL命令来实现原子性操作。通过将多个Redis命令组合在一个Lua脚本中执行,可以确保这些命令在同一时间内被连续地执行,从而保证原子性。引用 在Lua脚本中,可以使用redis.call()和redis.pcall()这两个不同的函数来调用Redis命令。redis.call()函数用于执行普通的Redis命令,而redis.pcall()函数则用于执行Redis命令并处理错误。通过使用这两个函数,可以在Lua脚本中执行多个Redis命令,并保证它们的原子性。引用 另外,Redis在执行Lua脚本时采用了单线程的方式,这意味着同一时间内只能执行一个Lua脚本,不会被其他脚本Redis命令打断。因此,在执行Lua脚本期间,不会发生并发问题,从而保证原子性。引用 综上所述,通过将多个Redis命令组合在Lua脚本中,并使用redis.call()和redis.pcall()函数来执行这些命令,结合Redis的单线程执行机制,可以保证Lua脚本原子性操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Redis Lua脚本实现原子性操作](https://blog.csdn.net/kuishao1314aa/article/details/120367618)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值