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

制作网站注册登录模块的思维导图公司简介视频制作

制作网站注册登录模块的思维导图,公司简介视频制作,模板 网站 教程,网站开发者模式下载视频教程条件 缓存击穿是应为Redis某个缓存数据设置了过期时间,而刚好有大并发数据请求这个数据,导致DB有大量请求,引发DB崩溃。 第一种方法就是设置互称锁 当缓存失效时不立即删除缓存而是用setnx设置一个互斥锁,当操作完成后在load db…

条件

缓存击穿是应为Redis某个缓存数据设置了过期时间,而刚好有大并发数据请求这个数据,导致DB有大量请求,引发DB崩溃。

第一种方法就是设置互称锁

当缓存失效时不立即删除缓存而是用setnx设置一个互斥锁,当操作完成后在load db,并回设缓存,否则重试get缓存方法,这样就减少了直接大量访问DB的请求。

实现

@Service
public class SysRoleServiceImpl extends ServiceImpl<SysRoleDao, SysRoleDO> implements SysRoleService {@Resourceprivate RedissonClient redissonClient;@Overridepublic List<SysRoleDO> test() throws Exception {Object roles = redissonClient.getBucket("role").get();// 先查询缓存,缓存中有则直接返回if (Objects.nonNull(roles)) {return JSON.parseArray(roles.toString(), SysRoleDO.class);}RLock lock = redissonClient.getLock("role-lock");boolean isLock = lock.tryLock();if (isLock) {// 获取到锁查询数据库,并将查询结果放入缓存try {Object roleList = redissonClient.getBucket("role").get();// 双重检查锁,当多个线程同时判断到缓存中取不到值,上一个获取到锁的线程已经将数据放入缓存,下一个线程直接取缓存if (Objects.nonNull(roleList)) {return JSON.parseArray(roleList.toString(), SysRoleDO.class);}// 查询数据库List<SysRoleDO> list = this.list();// 将数据放入缓存redissonClient.getBucket("role").set(list, 60L, TimeUnit.SECONDS);return list;} finally {lock.unlock();}}int retryTimes = 3;Object roleList = null;// 当缓存中取不到值时sleep300毫秒,最多循环3次while (Objects.isNull(roleList) && retryTimes > 0) {// 休眠300ms后递归TimeUnit.MILLISECONDS.sleep(300L);roleList = redissonClient.getBucket("role").get();retryTimes--;}// 循环等待后缓存中取到值直接返回,仍然取不到值则抛异常if (Objects.nonNull(roleList)) {return JSON.parseArray(roleList.toString(), SysRoleDO.class);}throw new RuntimeException("查询异常");}
}

第二种解决缓存击穿的实现就是设置key逻辑过期时间

1.在设置key的时候过期时间字段并一块存入缓存,不给当前key设置过期时间。

2.当查询的时候在redis中判断是否过期,条件就是字段设置时间与当前时间对比。

3.如果过期就开通另一个线程进行数据同步,当前线程正常返回数据,但数据就不是最新的时老的数据不能保证强一致。

实现

//逻辑过期public Shop queryWithLogicalExpire(Long id) {String key = CACHE_SHOP_KEY + id;//1.从redis查询商铺缓存String shopJson = stringRedisTemplate.opsForValue().get(key);//2.判断是否存在if (StrUtil.isBlank(shopJson)) {//3.未命中return null;}//4.命中,需要先把json反序列化为对象RedisData redisData = JSONUtil.toBean(shopJson, RedisData.class);Shop shop = (Shop) redisData.getData();LocalDateTime expireTime = redisData.getExpireTime();//5.判断是否过期if (expireTime.isAfter(LocalDateTime.now())) {//5.1还未过期return shop;}//5.2已经过期,需要缓存重建//6.缓存重建//6.1获取互斥锁String lockKey = LOCK_SHOP_KEY + id;boolean isLock = tryLock(lockKey);//6.2判断是否获取锁成功if (isLock) {// 6.3成功,开启独立线程,实现缓存重建CACHE_REBUILD_EXECUTOR.submit(() -> {try {//重建缓存this.saveShop2Redis(id, 20L);} catch (Exception e) {e.printStackTrace();} finally {//释放锁unlock(lockKey);}});}//6.4返回过期的店铺信息//7.返回return shop;}

总结

如果要求数据的强一致测使用分布式锁,如果要求高可用就使用逻辑过期就可以了。

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

相关文章:

  • 中国营销网站3800给做网站
  • seo做得好的企业网站wordpress必须登录
  • 宁波专业网站营销公司开通网站
  • 怎样去各大网站做淘宝推广项目加盟网
  • 在网站开发中哪里需要js文件开发手机网站用什么好处
  • 查询建设工程规范的网站网站开发薪水
  • 织梦网站统计代码html基础菜鸟教程
  • 浙江网站建设哪家好手机类网站设计
  • 备案的网站名称能重复备案吗大学一学一做视频网站
  • 做外贸网站义乌天津网站优化哪家快
  • 网站盈利方法vs215开发python网站开发
  • 搬瓦工怎么做网站域名查询网入口
  • 专业的临沂网站优化win7做网站服务器卡
  • 建设银行泰州江洲路支行网站win7安装wordpress
  • 中国建设银行网站暑假工报名设计软件网站
  • 昆明有哪些帮忙做网站的公司男科免费咨询
  • 网站建设计划书自己怎么做网站免费的
  • 网站开发设计报告书怎么写廊坊做网站费用
  • 做网站网页多少钱太原做app网站建设
  • 个人简历模板免费下载网站wordpress拉
  • seo都用在哪些网站企业发布招聘信息免费的网站
  • 技术支持 合肥网站建设设计制作电子演示文稿不是
  • 淘宝客 网站无备案怎样建免费网站
  • 关于电视剧的网站设计网页俄语网站
  • 南昌网站seo公司机械设备网站建设
  • 南京太阳宫网站建设wordpress头部标签描述
  • 哪家做网站阿里巴巴网站建设论文
  • 网站制作公司合肥免备案自助建站网站
  • 商务网站开发的的基本流程嘉定网站建设网页制作
  • 企业网站ps模板网络营销的未来发展趋势论文