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

德州乐陵疫情最新消息今天seo自学网站

德州乐陵疫情最新消息今天,seo自学网站,赤峰市建设网站,做产品类网站有哪些内容文章目录 1.缓存穿透1.1 概念1.2 解决方案1.2.1 缓存空对象1.2.2 布隆过滤 1.2 店铺查询使用缓存穿透解决方案1.2.1 流程 2.缓存雪崩2.1 什么是缓存雪崩?2.2 雪崩解决方案 3.缓存击穿3.1 什么是缓存击穿?3.2解决方案3.2.1 基于互斥锁解决缓存击穿问题&am…

文章目录

      • 1.缓存穿透
        • 1.1 概念
        • 1.2 解决方案
          • 1.2.1 缓存空对象
          • 1.2.2 布隆过滤
        • 1.2 店铺查询使用缓存穿透解决方案
          • 1.2.1 流程
      • 2.缓存雪崩
        • 2.1 什么是缓存雪崩?
        • 2.2 雪崩解决方案
      • 3.缓存击穿
        • 3.1 什么是缓存击穿?
        • 3.2解决方案
          • 3.2.1 基于互斥锁解决缓存击穿问题(热点key问题)
          • 3.2.2 基于逻辑过期方式解决缓存击穿问题

1.缓存穿透

1.1 概念

客户端请求的数据都在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库中

在这里插入图片描述

1.2 解决方案
1.2.1 缓存空对象

在这里插入图片描述

缺点:可能存在短期不一致。数据库新增了这个id对应的数据的时候,缓存中对应的是null
优点:简单

1.2.2 布隆过滤

布隆过滤存储的是一些二进制位,把数据库的数据通过哈希算法,计算出哈希值存储到布隆过滤器中
但是他说存在不一定存在,比如我数据库某条数据删除了,布隆过滤器没有更新
在这里插入图片描述
优点:内存占用少
缺点:实现复杂,存在误判

1.2 店铺查询使用缓存穿透解决方案
1.2.1 流程

在这里插入图片描述
代码实现

public Result queryById(Long id) {String key = CACHE_SHOP_KEY+id;// 1.从redis中查询店铺缓存String shopJson = stringRedisTemplate.opsForValue().get(key);// 2.判断缓存是否存在if (StrUtil.isNotBlank(shopJson)) {Shop shop = JSONUtil.toBean(shopJson, Shop.class);return Result.ok(shop);}// 判断命中的是否是空值if (shopJson != null) {// 返回错误信息return Result.fail("店铺不存在");}// 3.不存在,根据id查询数据库Shop shop = getById(id); // mybatisplus功能// 4.不存在,返回错误if (shop == null) {// 将空值写到redisstringRedisTemplate.opsForValue().set(key, "", CACHE_NULL_TTL, TimeUnit.MINUTES);return Result.fail("店铺数据不存在");}// 存在,写入redisstringRedisTemplate.opsForValue().set(key, JSONUtil.toJsonStr(shop), CACHE_SHOP_TTL, TimeUnit.MINUTES);return Result.ok(shop);}

1.缓存穿透产生的原因?
用户请求的数据再数据库和缓存中都不存在,不断发起这样的请求对数据库带来了极大压力
2.缓存穿透的解决方案是什么?
缓存null值,布隆过滤,增加id复杂度,避免被猜测规律,做好基础数据检测校验,加强用户权限

2.缓存雪崩

2.1 什么是缓存雪崩?

缓存雪崩指的是同一时段大量的缓存key同时失效或者redis服务宕机,导致大量请求到达数据库,带来巨大压力

2.2 雪崩解决方案

1.给不同的KEY的TTL添加随机值
2.利用Redis集群提高服务可用性(集群,哨兵,主从)
3.给缓存业务添加降级限流策略(某些服务不让请求)
4.给业务添加多级缓存(nginx,jvm,redis都加缓存)

3.缓存击穿

3.1 什么是缓存击穿?

也称为热点key问题,就是一个被高并发访问并且缓存重建业务较复杂的key突然失效了,无数的请求访问会瞬间给数据库带来极大冲击。

在这里插入图片描述

3.2解决方案

1.互斥锁
2.逻辑过期

在这里插入图片描述
在这里插入图片描述

3.2.1 基于互斥锁解决缓存击穿问题(热点key问题)

在这里插入图片描述

 /** redis锁逻辑* */// 1.获取锁public boolean tryLock(String key) {Boolean flag = stringRedisTemplate.opsForValue().setIfAbsent(key, "1", 10, TimeUnit.SECONDS);return BooleanUtil.isTrue(flag); // Boolean是一个包装类型,可能为null}// 2.释放锁private void unlock(String key) {stringRedisTemplate.delete(key);}/** 缓存击穿封装函数* */public Shop queryWithMutex(Long id) {String key = CACHE_SHOP_KEY+id;// 1.从redis中查询店铺缓存String shopJson = stringRedisTemplate.opsForValue().get(key);// 2.判断缓存是否存在if (StrUtil.isNotBlank(shopJson)) { // 不为空值或者空字符串Shop shop = JSONUtil.toBean(shopJson, Shop.class);return shop;}// 判断命中的是否是空值if (shopJson != null) { // 这样判断他只能是空字符串了// 返回错误信息return null;}// 4.实现缓存重建// 4.1 获取互斥锁String lockKey = "lock:shop:" + id;Shop shop = null; // mybatisplus功能try {boolean isLock = tryLock(lockKey);// 4.2 判断是否获取锁成功if (!isLock) {// 失败,休眠Thread.sleep(50);return queryWithMutex(id);}// 3.获取锁成功,根据id查询数据库// 模拟重建的延时Thread.sleep(200);shop = getById(id);// 4.不存在,返回错误if (shop == null) {// 将空值写到redisstringRedisTemplate.opsForValue().set(key, "", CACHE_NULL_TTL, TimeUnit.MINUTES);return null;}// 存在,写入redisstringRedisTemplate.opsForValue().set(key, JSONUtil.toJsonStr(shop), CACHE_SHOP_TTL, TimeUnit.MINUTES);} catch (InterruptedException e) {throw new RuntimeException(e);} finally {unlock(lockKey);}return shop;}
3.2.2 基于逻辑过期方式解决缓存击穿问题

在这里插入图片描述

商品中原始没有逻辑过期的字段,需要自己自定义一个

@Data
public class RedisData {private LocalDateTime expireTime;private Object data; // data存储shop数据
}

代码逻辑

 /*** 存储店铺封装逻辑过期时间*/public void saveShop2Redis(Long id, Long expireSeconds) {// 查询店铺数据Shop shop = getById(id);try {Thread.sleep(100);} catch (InterruptedException e) {throw new RuntimeException(e);}// 封装逻辑过期时间RedisData redisData = new RedisData();redisData.setData(shop);redisData.setExpireTime(LocalDateTime.now().plusSeconds(expireSeconds));// 写入redisstringRedisTemplate.opsForValue().set(CACHE_SHOP_KEY + id, JSONUtil.toJsonStr(redisData));}// 开启线程池private static final ExecutorService CACHE_REBUILD_EXECUTOR = Executors.newFixedThreadPool(10);public Shop queryWithLogicalExpire(Long id) {String key = CACHE_SHOP_KEY + id;// 1.从redis中查询店铺缓存String shopJson = stringRedisTemplate.opsForValue().get(key);// 2.判断缓存是否存在if (StrUtil.isBlank(shopJson)) {return null;}// 4.命中,需要把json反序列化为对象RedisData redisData = JSONUtil.toBean(shopJson, RedisData.class);JSONObject data = (JSONObject) redisData.getData();Shop shop = JSONUtil.toBean(data, Shop.class);LocalDateTime expireTime = redisData.getExpireTime();//5 判断是否过期if (expireTime.isAfter(LocalDateTime.now())) {// 5.1.未过期,直接返回店铺信息return shop;}// 5.2已过期,需要缓存重建String localKey = LOCK_SHOP_KEY+id;boolean isLock = tryLock(localKey);// 5.3 判断是否获取锁成功if (isLock) {// 6.3 开启独立线程,实现缓存重建CACHE_REBUILD_EXECUTOR.submit(() -> {// 重建缓存try {this.saveShop2Redis(id, 20L);} catch (Exception e) {throw new RuntimeException(e);} finally {// 释放锁unlock(localKey);}});}// 6.4 返回过期的店铺信息return shop;}
http://www.dtcms.com/wzjs/121218.html

相关文章:

  • 网站的上一页怎么做的专业seo培训
  • 020网站建设和维护费用广告联盟平台排名
  • 容桂网站制作咨询做一个网站需要多少钱
  • 公司入口网站app百度开户代理商
  • 免费购物网站程序做一个网站需要多少钱大概
  • 西安SEO网站推广营销网站建设哪家快
  • 网站备案要先怎么做市场营销四大基本策略
  • 搜索引擎营销成功案例seo搜索引擎官网
  • dede网站幻灯片成人再就业培训班
  • 吉林哪里做网站北京度seo排名
  • 哪种技术做网站容易论文答辩百度seo关键词优化工具
  • 响应式网站编码怎吗设置长沙seo推广外包
  • 怎么把源码做网站上海百度推广优化排名
  • 网站右侧悬浮代码seo与网络推广的区别和联系
  • 义乌网站山东seo
  • 收到一张网站服务费怎么做凭证网络营销专员的就业前景
  • 网站建设后台需要什么技术google play官网
  • 企业网站建设计划书自建站怎么推广
  • 能自己做生物实验的网站百度账户托管运营
  • 微网站开发外包seo站长工具
  • 网站盒子怎么做qq营销
  • 建设金融行业网站女生seo专员很难吗为什么
  • 搞定设计网站做的图怎么下载不了市场营销推广方案
  • java网站开发框架杭州seo百度关键词排名推广
  • wordpress自动生成百度地图seo课程培训班费用
  • wordpress是怎么用的长春关键词优化平台
  • 网站模板 php提高工作效率总结心得
  • wordpress文章浏览次数张家口网站seo
  • 政务网站建设 紧急通知河南郑州网站推广优化外包
  • 网站建设中html代码b2b外贸接单平台