当前位置: 首页 > news >正文

使用redis分布式锁来解决高并发场景

redis分布式锁的解决思路,就是利用redis的高性能来解决高并发,每次访问一个资源的时候,都会存储一个key,然后通过redisTemplate.opsForValue().setIfAbsent()方法来进行向数据库进行插入,这个方法的作用和一般的插入不同,普通插入会将相同key的值进行覆盖,而setIfAbsent则不会,它会进行判断,如果redis中有这个key,那么返回false,如果没有则进行存储然后返回true,而我们就可以利用这个特性来进行持有锁和释放锁,但是需要注意的是必须要设置一个过期的时间,不然会造成死锁,但是这种方法还是会出现问题,如果业务比较大,处理时间较长,而过期时间又不能设置的太短,这个时候就不好去控制锁的释放,这个时候可以使用redis的看门狗策略来实现,不过这里先展示一下redis分布式锁。

这一段就是用于设置锁,将这一段放置在方法开始的最前面即可,而释放锁则放在方法结束的末尾然后将这个key手动清除即可

String key = req.getDate() + "-" + req.getTrainCode();
            Boolean ifAbsent = redisTemplate.opsForValue().setIfAbsent(key, key, 3600, TimeUnit.SECONDS);
            if (Boolean.TRUE.equals(ifAbsent)) {
                LOG.info("抢到锁,开始处理订单");
            } else {
                LOG.info("很遗憾,没有抢到锁");
                //当前抢票人数多,请稍后再试
                throw new BusinessException(BusinessExceptionEnum.CONFIRM_ORDER_LOCK_FAIL);
            }

相关文章:

  • MySQL中的事务隔离级别有哪些?
  • 基于STM32、HAL库、FM24CL64(I2C接口)驱动程序设计
  • 达梦数据库针对慢SQL,收集统计信息清除执行计划缓存
  • VScode内接入deepseek包过程(本地部署版包会)
  • 【网络编程】之数据链路层
  • 使用卷积神经网络(CNN)对颜色失真情况下进行数字识别
  • 【全栈】SprintBoot+vue3迷你商城-细节解析(1):Token、Jwt令牌、Redis、ThreadLocal变量
  • 请谈谈 em、px、rem、vh、vw 的区别,如何使用?
  • ubuntu20动态修改ip,springboot中yaml的内容的读取,修改,写入
  • 打造智能语料库:通过Coco AI Server 实现 Notion 笔记 RAG 检索功能
  • vue3项目实践心得-寻找未被使用的最小编号
  • LVGL图形界面编程(基础篇): 一.LVGL入门
  • 单表数据文件坏块检查及恢复
  • 计算光学基础
  • 移动通信发展史
  • Django创建一个非前后端分离平台
  • 基于 Redisson 分布式锁 实现报名人数限制功能
  • EasyRTC智能硬件:实时畅联、沉浸互动、消音护航
  • 数据结构之栈和队列
  • 为什么WebGPU渲染通道描述符使用TextureView而非直接操作Texture?
  • 出口网站有哪些/seo百度网站排名软件
  • 网站建设海报/关键词查询网站的工具
  • 极简wordpress主题/网站外链优化方法
  • 服务器2003系统如何建设网站/seo博客推广
  • ps怎么做网站一寸的照片/长沙营销型网站建设
  • 宁波海曙网站开发公司/河南百度seo