springboot整合redis+lua实现getdel操作保证原子性

这篇具有很好参考价值的文章主要介绍了springboot整合redis+lua实现getdel操作保证原子性。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  1. 原始代码

脚本逻辑先获取redis的值,判断是否等于期望值。 条件成立则删除,不成立则返回0

if redis.call('get', KEYS[1]) == ARGV[1] then
    return redis.call('del', KEYS[1])
end
return 0
  1. 测试代码

根据上面的逻辑加了测试, 在判断成功后等待5秒后执行删除操作。同时开启另外一个线程去修改这个key的值, 发现修改的线程一直阻塞。直到等待的线程5秒结束后且完成删除操作后,修改的线程才会执行。

原因:

redis是单线程执行,

Redis会将整个Lua脚本作为一个原子操作执行,这意味着脚本中的多个命令要么全部执行成功,要么全部失败。这有助于维护数据的原子性和一致性。

Redis执行Lua脚本时,它会自动锁定相关的键,以防止其他客户端对这些键进行并发修改。这确保了在脚本执行期间对键的访问是互斥的。

注意: 如果脚本中涉及多个key的操作并redis部署的是cluster模式时, 需要额外确认多个key都在一个slot中。还好我这就1个key!!!略过.............文章来源地址https://www.toymoban.com/news/detail-744656.html

String str_script =
            // 1. 判断key的值是否等于期望值,等于则进行删除,不相等则直接结束
            "if (redis.call('get', KEYS[1]) == ARGV[1]) then\n" +
            "    local start = redis.call('TIME')[1] * 1000 + redis.call('TIME')[2] / 1000\n" +
            "    while (redis.call('TIME')[1] * 1000 + redis.call('TIME')[2] / 1000 - start) < 5000 do\n" +
            "        print('等待5秒结束.....')"+
            "    end\n"+
            // 2. 值判断成功,等待5秒执行删除操作
            "    return redis.call('del', KEYS[1])\n" +
            "end\n" +
            "return 0";
    public String getAndDelete(String key, String expectedValue) {
        log.info("start..................");
        DefaultRedisScript script = new DefaultRedisScript(str_script, Long.class);
        Object res = redisTemplate.execute(script, Collections.singletonList(key), expectedValue);
        log.info("end..................");
        return res.toString();
    }

到了这里,关于springboot整合redis+lua实现getdel操作保证原子性的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • redis集群的多key原子性操作如何实现?

    在单实例redis中,我们知道多key原子性操作可以用lua脚本或者multi命令来实现。 比如说有一个双删场景,要保证原子性同时删除 k1 和 k2 。 可以用lua双删 也可以用事务双删 但是在redis的集群中,key被hash到不同的slot,slot又被分配到多个不同redis实例。那么多key原子性操作如何

    2024年02月07日
    浏览(41)
  • SpringBoot整合阿里云短信服务详细过程(保证初学者也能实现)

    网上关于实操性的文章普遍大部分都记录不全,要么只记录重点部分,对于刚学习的小伙伴来说看起来是比较困难的 所以,基于这一点。 该文章会详细介绍使用SpringBoot整合阿里云短信服务的每一步过程,同时会将验证码存放到Redis中并设置过期时间 , 尽量保证实战的同时也

    2023年04月15日
    浏览(37)
  • springboot+redis+mysql+quartz-通过Java操作jedis定时使用lua脚本获取缓存数据并更新数据库

    springboot+redis+mysql+quartz-通过Java操作jedis定时使用lua脚本获取缓存数据并更新数据库 代码讲解:7.1点赞功能-定时持久化到数据库-Java整合lua_哔哩哔哩_bilibili https://www.bilibili.com/video/BV1ZX4y1H7JT/ 代码: blogLike_schedule/like07 · xin麒/XinQiUtilsOrDemo - 码云 - 开源中国 (gitee.com) https://gitee

    2024年02月13日
    浏览(51)
  • SpringBoot整合Redis实现缓存信息监控

    SpringBoot整合Redis可以通过RedisTemplate和Redisson两种方式。 根据Connection获取 Redis缓存 信息 // 方式1:获取Redis缓存全部信息 Properties info = redisTemplate.getRequiredConnectionFactory().getConnection().info(); // 方式2:根据Connection获取Redis缓存指定信息: Properties info = redisTemplate.getRequiredConnection

    2024年01月20日
    浏览(46)
  • 【Spring】SpringBoot整合Redis,用Redis实现限流(附Redis解压包)

       📝个人主页:哈__ 期待您的关注  本文介绍SpringBoot整合Redis并且进行接口的限流,文章主要介绍的是一种思想,具体代码还要结合实际。 Redis的解压包我放在了百度网盘上,有需要的可以下载。 Redis-x64-3.0.504 解压码:uhwj 我们在本地解压下载的Redis压缩包,打开解压后的

    2024年04月09日
    浏览(50)
  • 微服务 SpringBoot 整合 Redis GEO 实现附近商户功能

    本文参考黑马 点评项目 在点评项目中 如何 实现 附近商家的查询呢,展示出距离自己5公里内的商户,这样的功能如何实现? 答案是可以采用Redis 来实现,当然可能有很多实现方式,本文主要介绍如何使用Redis实现 附近商户的搜索功能 CSDN博客之星参选博主:Bug终结者 我正在

    2024年01月16日
    浏览(44)
  • springboot 整合rabbitMq保证消息一致性方案

    RabbitMQ是一种开源的消息代理软件,它实现了高级消息队列协议(AMQP)标准,可用于在应用程序之间传递消息。RabbitMQ最初由LShift开发,现在由Pivotal Software维护。 RabbitMQ可以在多个平台上运行,包括Windows、Mac OS X和各种Linux发行版。它提供了多种编程语言的客户端库,如Java、

    2024年02月02日
    浏览(38)
  • 【SpringBoot】 整合RabbitMQ 保证消息可靠性传递

    生产者端 目录结构 导入依赖 修改yml 业务逻辑 测试结果         在publisher-confirm-type中有三个确认消息接受类型:none、correlated、simple。         publisher-confirm-type: none 表示 禁用发布确认模式 。是 默认值 。使用此模式之后,不管消息有没有发送到Broker(RabbitMQ)都不会

    2024年02月10日
    浏览(47)
  • 【案例实战】SpringBoot整合Redis实现缓存分页数据查询

    正式观看本文之前,设想一个问题,高并发情况下,首页列表数据怎么做? 类似淘宝首页,这些商品是从数据库中查出来的吗?答案肯定不是,在高并发的情况下,数据库是扛不住的,那么我们要怎么去扛住C端大并发量呢,这块我们可以借助Redis,我们知道Redis是一个基于内

    2024年02月09日
    浏览(54)
  • 【案例实战】SpringBoot整合Redis的GEO实现查找附近门店功能

    像我们平常美团点外卖的时候,都会看到一个商家距离我们多少米。还有类似QQ附近的人,我们能看到附近的人距离我们有多少米。 那么这些业务是怎么做的呢?是如何实现 基于位置的附近服务 系统呢。 在去了解基于位置的附近服务之前,我们先来看一下什么是GIS技术。

    2024年02月10日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包