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

网站网站做维护犯罪wordpress插件拖拽

网站网站做维护犯罪,wordpress插件拖拽,建设部特殊工种查询网站,重庆永川网站建设报价在SpringBoot中利用Redis实现互斥锁 基本知识 前提条件,有一个能够在Springboot中使用Redis的项目,或者能够直接开也行 为什么要实现互斥锁:当我们利用Redis存储热点数据时,突然就过期失效或者被删除了,导致大量请求同…

在SpringBoot中利用Redis实现互斥锁

基本知识

前提条件,有一个能够在Springboot中使用Redis的项目,或者能够直接开也行

为什么要实现互斥锁:当我们利用Redis存储热点数据时,突然就过期失效或者被删除了,导致大量请求同时访问数据库,增加了数据库的负载。为减轻数据库的负载我们利用互斥锁。

业务的一个逻辑图流程:

在这里插入图片描述

核心思路:相较于原来从缓存中查询不到数据后直接查询数据库而言,现在的方案是 进行查询之后,如果从缓存没有查询到数据,则进行互斥锁的获取,获取互斥锁后,判断是否获得到了锁,如果没有获得到,则休眠,过一会再进行尝试,直到获取到锁为止(这个尝试,要重新从Redis再次尝试获取数据,可能别的锁已经获取到了),才能进行查询

如果获取到了锁的线程,再去进行查询,查询后将数据写入redis,再释放锁,返回数据,利用互斥锁就能保证只有一个线程去执行操作数据库的逻辑,防止缓存击穿

操作锁的核心思路就是利用redis的setnx方法来表示获取锁,该方法含义是redis中如果没有这个key,则插入成功,返回1

具体实现

  • 设置锁,删除锁
   /*** 根据name对特定的数据进行锁* @param name* @return*/
public boolean setLock(String name) {return Boolean.TRUE.equals(redisTemplate.opsForValue().setIfAbsent(name, true, 10, TimeUnit.SECONDS));
}public boolean releaseLock(String name) {return Boolean.TRUE.equals(redisTemplate.delete(name));
}
  • 具体流程实现
@GetMapping("/getOneByLock/{sequence}")
public BaseResponse<Sentences> getOneByLock(@PathVariable long sequence) {// 从redis中查信息String name = "test:redis:sentences:"+ sequence;Sentences sentence = (Sentences) redisTemplate.opsForValue().get(name);// 命中返回数据if(sentence != null ){redisTemplate.expire(name,2,TimeUnit.MINUTES);return ResultUtils.success(sentence);}// 未命中获取锁String LOCK_NAME = "test:redis:lock:" + sequence;boolean lock = redisTemplate.opsForValue().get(LOCK_NAME) != null && (boolean) redisTemplate.opsForValue().get(LOCK_NAME);//如果lock等于false 那么就可以获取到锁并且,锁住不许其他人操作if(!lock){return ResultUtils.success(setLockReleaseLockAboutSentence(LOCK_NAME,name,sequence));}// 没有获取到锁 休眠一段时间,并且反复检测redis中的数据是否存在,或者锁是否释放while(true){try {Thread.sleep(1000);log.error("等待中");} catch (InterruptedException e) {throw new RuntimeException(e);}// 检查是否存在值sentence =  (Sentences) redisTemplate.opsForValue().get(name);if(sentence != null){return ResultUtils.success(sentence);}boolean checkAgain = (boolean) redisTemplate.opsForValue().get(LOCK_NAME);if(!checkAgain){sentence =  setLockReleaseLockAboutSentence(LOCK_NAME,name,sequence);}return ResultUtils.success(sentence);}
}public Sentences setLockReleaseLockAboutSentence(String LOCK_NAME,String redisName, long sequence){// 设置 锁值 为truesetLock(LOCK_NAME);// 并且从数据中查取数据Sentences sentence = sentencesService.getById(sequence);// 这里为了明显不能抢锁设置一个睡眠时间try {log.error("休眠中");Thread.sleep(3000);} catch (InterruptedException e) {throw new RuntimeException(e);}
//            把数据写入RedisredisTemplate.opsForValue().set(redisName,sentence,2, TimeUnit.MINUTES);// 释放锁releaseLock(LOCK_NAME);// 返回数据return sentence;
}

代码说明,在这个代码中为了演示明显,获取锁中延迟3s,竞争锁会延迟1s,下面的演示,初始时Redis中没有数据,只能去数据库中取数据,但是设置了互斥锁,所以只能够一个线程进入数据库取数据,其他只能等待数据得到结果。

结果示意

  • redis中无数据

在这里插入图片描述

  • 结果

在这里插入图片描述

最终效果是好的。redis中已存入数据

在这里插入图片描述

http://www.yayakq.cn/news/530174/

相关文章:

  • 怎么知道网站用什么软件做的佛山网站建设定制
  • 西安建百度网站的公司一级造价工程师报考条件及科目
  • 外卖做的比较好的网站苏州网站建设公司鹅鹅鹅
  • 网站建设营改增高端网站设计企业
  • 公司网站建设的好处东道设计公司规模
  • 网站哪个公司好豫icp郑州网站建设
  • 抽奖网站怎么制作养殖场在哪个网站做环评备案
  • 做高大上分析的网站网站建设技术清单
  • 建设邮箱网站四川建设网招标网
  • 淘宝网站建设素材wordpress邮件通知
  • minisite网站案例韩国手机网站模板
  • 大连在哪个网站做网上核名家具网站素材
  • 比较有名的diy制作网站58同城找房子租房
  • 爱站网使用体验网站的盈利模式
  • 网站开发的背景与环境哈尔滨网站建设制作
  • 一般做公司网站需要哪几点那些网站可以够买域名
  • 哪个网站免费h5模板多物流网站做代理
  • 做详情页网站维护一个网站的安全
  • 做导购网站赚钱wordpress 图片暗箱
  • 织梦网站栏目不能更新html成品网页模板下载
  • vs210做网站全新wordpress主题
  • 做酒网站局域网建设网站如何访问
  • 法国化妆品进口报关做网站开发公司名称
  • 做英语陪同翻译兼职的网站兰州官网优化技术厂家
  • 做网站商城互联网公司青海省公路建设网站
  • 贵阳招聘网站建设昌大建设是哪里的
  • 广西和住房城乡建设厅网站首页平台网站如何做推广
  • 学做网站培训机构龙岩kk网
  • 2345网站登录福州百度推广排名
  • 网站建设方案模版个人网站建设架构