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

css网站源码百度seo收录

css网站源码,百度seo收录,长沙专业做网站排名,上海网站开发开发好的公司缓存击穿 1、定义 缓存的某个热点数据过期,此时大量的用户请求过来,缓存未命中,然后都打到数据库去,导致数据库压力骤增。 2、解决方案 原因就是此时大量请求未命中缓存,导致都打到数据库,此时数据库压力剧…

缓存击穿

1、定义

缓存的某个热点数据过期,此时大量的用户请求过来,缓存未命中,然后都打到数据库去,导致数据库压力骤增。

2、解决方案

原因就是此时大量请求未命中缓存,导致都打到数据库,此时数据库压力剧增,解决方案分为是单机还是分布式情况部署。

2.1、双重检索(本地方案)

一、基本实现原理

public Object getData(String key) {// 第一次检查(无锁)Object value = cache.get(key);if (value == null) {synchronized (this) {// 第二次检查(有锁)value = cache.get(key);if (value == null) {value = db.query(key);  // 查询数据库cache.set(key, value);  // 写入缓存}}}return value;
}

二、技术细节分析

  1. 双重检查的意义
    • 第一次检查:无锁快速判断,解决大多数缓存命中情况
    • 第二次检查:防止多个线程同时通过第一次检查后重复创建缓存
  2. 与简单同步方案的对比
// 简单同步方案(性能较差)
public synchronized Object getDataSlow(String key) {Object value = cache.get(key);if (value == null) {value = db.query(key);cache.set(key, value);}return value;
}

性能对比:

双重检查:只在缓存未命中时加锁
简单同步:每次调用都加锁,导致性能上面的浪费。

2.2、互斥锁(分布式方案)

核心思想:只允许一个请求重建缓存,其他请求等待
在这里插入图片描述
流程就是:先查询缓存是否命中,未命中,尝试获取互斥锁,获取锁成功,进行缓存重构,未获取锁的就进行递归,进行递归判断是否缓存命中,命中直接返回,未命中继续尝试获取锁,失败继续递归。

  @Nullable// todo 3、缓存击穿 -> 互斥锁:只能由一个线程进行缓存构建,其他线程等待,吞吐量较低private Shop huchi(Long id) {String shopJsonStr = stringRedisTemplate.opsForValue().get("cache:shop:" + id);if (StrUtil.isNotBlank(shopJsonStr)) {return JSONUtil.toBean(shopJsonStr, Shop.class);}// 未命中获取锁String tryLockKey = "cache:shop:lock:" + id;Shop shop = null;try {boolean tryLock = getLock(tryLockKey);// 未命中:不断休眠直至获取成功if(!tryLock) {Thread.sleep(50);return huchi(id);}// 获取互斥锁,进行缓存的构建shop = getById(id);if (shop == null) {// 数据库中也不存在时候,进行空字符串缓存stringRedisTemplate.opsForValue().set("cache:shop:" + id, "", 2, TimeUnit.MINUTES);return null;}stringRedisTemplate.opsForValue().set("cache:shop:" + id, JSONUtil.toJsonStr(shop), 2, TimeUnit.MINUTES);} catch (Exception e) {e.getStackTrace();} finally {unLock(tryLockKey);}return shop;}

优点:保证数据一致性
缺点:可能出现递归导致栈溢出情况,但是这种情况较少可能性。

2.3、逻辑过期(分布式方案)

在这里插入图片描述

步骤:

  1. 进行缓存预热:将设置逻辑过期的写入缓存中
  2. 然后获取redis中的值,根据缓存逻辑设置时间是否过期来决定是否进行缓存的重新构建。如果未过期,直接返回。过期,设置互斥锁,获取锁成功的单独开设一个子线程去进行缓存的更新构建,主线程直接返回结果。获取锁失败,直接返回旧数据
    代码实现:
@Nullable// todo 3、缓存击穿 -> 逻辑过期:通过设置逻辑过期时间,然后判断是否过期来确定是否进行缓存更新private Shop exLogical(Long id) {ExecutorService executorService = Executors.newFixedThreadPool(10);String shopJsonStr = stringRedisTemplate.opsForValue().get("cache:shop:" + id);// 如果不存在那就是一定不存在if (StrUtil.isBlank(shopJsonStr)) {return null;}//RedisDate redisDate = JSONUtil.toBean(shopJsonStr, RedisDate.class);Shop shop = JSONUtil.toBean((JSONObject) redisDate.getObject(), Shop.class);// 未逻辑过期if (redisDate.getEx().isAfter(LocalDateTime.now())) {return shop;}// 逻辑过期//  缓存重建String tryLockKey = "cache:shop:lock:" + id;boolean tryLock = getLock(tryLockKey);if (tryLock) {// 开启独立的线程去独立的进行缓存executorService.submit(() -> {try {this.saveShopRedis(id, 20L);} finally {unLock(tryLockKey);}});}return shop;}// 手动设置逻辑过期时间private void saveShopRedis(Long id, Long ex) {Shop shop = getById(id);RedisDate redisDate = new RedisDate();redisDate.setEx(LocalDateTime.now().plusSeconds(ex));redisDate.setObject(shop);stringRedisTemplate.opsForValue().set("cache:shop:" + id, JSONUtil.toJsonStr(redisDate));}

优点:无等待时间,性能较好
缺点:可能会出现短暂的数据性不一致的情况

http://www.dtcms.com/wzjs/480941.html

相关文章:

  • 日本做a爱片网站数据查询网站
  • 软件外包项目平台济南网站推广优化
  • 做网站开发的薪酬怎么样培训总结
  • 怎样查看网站的访问量广州seo公司推荐
  • 做柱状图饼状图好看的网站百度seo排名帝搜软件
  • 重庆网络营销网站建设销售磁力搜索引擎哪个好
  • 重庆专业的网站服务公司优化排名推广关键词
  • 做视频网站的条件关键词排名提升工具
  • 长沙高升小区做汽车行业网站的网络公司论天心区网页设计最打动人心的广告语
  • 手机怎么注册网站线上营销方式主要有哪些
  • jsp网站部署怎么做线下引流推广方法
  • 便宜网站建设多少钱seo咨询岳阳
  • 官方网站建设公司网络推广官网首页
  • 如何用网站模板做网站刚刚中国出啥大事了
  • 有个做h手游的网站网站排名优化方案
  • 河南一情况优化防疫措施
  • 网站设计模板html百度seo排名软件
  • 工程建设资料员报名网站互联网营销师培训机构
  • 南昌高端网站建设移动优化课主讲:夫唯老师
  • 长沙柒零叁网站建设郑州seo培训班
  • 网站布局的好坏的几个要素sem优化软件哪家好
  • 编程网站编程网络推广是啥
  • 天猫是b2b电子商务网站吗小网站搜什么关键词好
  • 村官 举措 村级网站建设免费网站的平台
  • wordpress 上传文件大小湖南网络优化服务
  • 软件开发培训平台肇庆seo外包公司
  • 团购网站建设怎么样免费建站网站网页
  • 做的好看的pc端网站百度网盘客服中心电话
  • 科技网站设计公司排名如何引流推广
  • 网络求职做阿姨哪个网站好软文代发价格