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

做 个收废品网站注册50万公司一年税是多少

做 个收废品网站,注册50万公司一年税是多少,搜索引擎优化的英语简称,泉州建站模板源码在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/439712/

相关文章:

  • 用织梦做的公司网站 经常被攻击网站被攻击的方法
  • 漂亮的网站底部代码搭建 wordpress
  • 襄阳文明建设投诉网站php网站怎么做seo
  • 大鹏网络网站建设报价未来电子商务发展前景
  • 网站开发前端好还是后端好网站建设和维护合同书
  • 手机网站前端开发布局技巧做网站 当站长
  • 凡科网制作网站教程做网站生成二维码
  • 中国外贸网站深圳网站设计制作公司 维仆
  • 如何判断一个网站的关键词是否难做购物平台官网
  • 做网站的公司高创网站建设投标人资质
  • 湖北好的快速排名系统西安seo培训机构
  • 蘑菇街网站建设方案wordpress域名修改
  • 站外推广平台有哪些免费软件app
  • 互联网网站建设公司组织架构网页设计属于ui范围吗
  • 网站的空间什么意思阿里巴巴司法拍卖网官网
  • 云南网站建设效果好吗如何改变网站的排版
  • 最新网站开发技术重庆网站公司建设
  • 可以举报一个做网络网站发大财吗杭州市建设监理协会网站
  • 漂亮的数据型网站免费vi模板网站
  • 邯郸市住房和建设官方网站甘肃网站建设项目
  • 网站建设市场分析做网站前端工资
  • 网站开发流程 文档蓝海网站建设
  • 安徽网站建设科技雄安专业网站建设电话
  • 网站建设的数据所有权珲春市建设局网站是多少
  • 肥东住房和城乡建设部网站如何网站防止采集
  • 石家庄住房建设厅网站做海淘的网站做海淘的网站有哪些
  • 专业做网站公司排名国家企业公司网站建设
  • 中文网站做google广告怎么样做搜狗pc网站快速
  • 网站销售好做吗ufolio wordpress主题
  • 网页设计实训报告工作内容和步骤湛江seo代理商