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

皮皮果网站建设南昌网站建设方案详细版

皮皮果网站建设,南昌网站建设方案详细版,长春网站建设哪个公司好,销售网站免费做业务场景#xff1a; 在上一篇-Java业务功能并发问题处理的最后#xff0c;我们用RedisTemplate实现了一个分布式锁#xff0c;但是后面又有用户反馈同个单据出现了重复操作#xff0c;让我们回忆下上次的加锁代码#xff1a; 问题描述#xff1a; 原因出现在我们锁住…业务场景 在上一篇-Java业务功能并发问题处理的最后我们用RedisTemplate实现了一个分布式锁但是后面又有用户反馈同个单据出现了重复操作让我们回忆下上次的加锁代码 问题描述 原因出现在我们锁住的那段代码执行了太久超过预设的过期时长。在A线程还在执行中时Redis中作为锁的key已经过期了当B线程进入时判断已经没有锁了因此允许执行。 解决方案分析 由于我们不知道业务需要执行多久需要一个机制在过期前检查是否线程还在运行中为什么必须是过期前因为过期了我们就无法知道线程是超时导致的解锁还是线程主动的解锁。如果线程仍在运行则将过期时间延长。下面绘制一个流程图让大家更直观地了解整个流程此处是模仿Redisson的看门狗机制。 代码实现 // ...省略循环等代码 isSuccessLock redisTemplate.opsForValue().setIfAbsent(redisKey, Thread.currentThread().getName(), lockTime, TimeUnit.MILLISECONDS); if (Boolean.TRUE.equals(isSuccessLock)) {// 新增的重置过期时间方法 在加锁成功后, 开启1个线程, 做redis看门狗机制renewExpiration(lockKey, Thread.currentThread().getName(), lockTime);return true; } // 省略for循环中的try...catch代码renewExpiration刷新锁时间的方法实现 /*** lua脚本 更新锁时间, 如果已经获取不到值, 则不更新锁的过期时间*/ private static final String REDIS_RENEW_LOCK_SCRIPT if redis.call(get, KEYS[1]) ARGV[1] then return redis.call(expire, KEYS[1], ARGV[2]) else return 0 end; /*** 刷新锁时间* param lockKey 锁key* param requestId 锁线程号,redis的value* param lockTime 锁时长*/ public void renewExpiration(String lockKey, String requestId, long lockTime) {DefaultRedisScriptLong redisScript new DefaultRedisScript(REDIS_RENEW_LOCK_SCRIPT, Long.class);// 通过线程池创建异步线程taskExecutor.execute(() - {while (true) {try {// 等待锁时长的1/3后刷新锁的过期时间Thread.sleep(lockTime / 3 * 1000);} catch (InterruptedException e) {Thread.currentThread().interrupt();break;}// 当前template只能传字符串, 将时间转为字符串传入String timeStr String.valueOf(lockTime);// 延长过期时间原子操作Long execute redisTemplate.execute(redisScript, new ArrayList(Collections.singleton(lockKey)), requestId, timeStr);if (execute null || execute 0) {break;}}}); }总结 其实后面才了解到Redis的分布式锁直接引入Redisson就万事大吉了建议大家直接通过Redisson去做Redis的分布式锁省时省力方便完善。此处自己写其实也是为了更深入了解分布式锁的实现而且一开始觉得就一个类解决的事情引入多余的一个工具包会不会有点多余结果做到后面才发现也有一些坑是自己没考虑周到的。等我后面有时间一定直接引入Redisson。 参考链接 redission的看门狗机制及应用
http://www.zqtcl.cn/news/431392/

相关文章:

  • 五合一网站建设费用python 做网站 用哪个框架好
  • 波莱网站开发动态域名可以做网站吗
  • 网站建设 赣icp 南昌面馆装修设计
  • 福田附近公司做网站建设多少钱网站建设文献综述范文
  • 镇江网站建设设计建设银行投诉网站首页
  • 石家庄个人做网站广州全网络营销
  • html5网站建设加盟wordpress 4.8.6
  • 携程网站建设的基本特点哈尔滨做平台网站平台公司
  • 网站建设入门解读国模 wordpress
  • 网站购物车js代码怎么做制作app的软件有哪些
  • 36氪网站用什么程序做的互联网门户网站建设
  • 视频聚合网站怎么做不侵权wordpress 管理员插件
  • 传媒网站后台免费模板网站建设的进度计划
  • 如何做网站排名合肥全网优化
  • 网站建设招聘信息官网 wordpress
  • 城阳网站开发公司网页制作与设计在哪搜题
  • 做网站算运营吗grace wordpress
  • 厦门建设网站建站制作网页动画的软件
  • 百度提交网站收录入口郑州网站app开发
  • 自己的身份已经网站备案了品牌建设目标包括哪些方面
  • 中国免费网站服务器下载保定网站制作系统
  • 深圳app网站设计数据库网站建设公司
  • 手机网站程序下载做地方黄页网站
  • 网站开发时如何设计英文版本专业vi机构
  • 黄骅市人事考试网电商网站怎样优化
  • 可信网站认证必须做吧陕西做网站的
  • 网站怎么静态化wordpress视频安装教程
  • 合浦县建设局网站网站备案号如何查询
  • 网站跳转代码 html亚马逊使用wordpress做的
  • 做哪一类的网站可以短时间变现东莞大朗网站设计