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

redis缓存雪崩和缓存击穿

目录

 缓存雪崩

解决方案:

缓存击穿

​解决方案


 缓存雪崩

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

解决方案:

u 给不同的 Key TTL 添加随机值
u 利用 Redis 集群提高服务的可用性
u 给缓存业务添加降级限流策略
u 给业务添加多级缓存

缓存击穿

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

解决方案

        1.互斥锁

        2.逻辑过期

互斥锁和逻辑回归的优缺点 

互斥锁:

        优点:

没有额外的内存消耗
保证一致性
实现简单

         缺点:

线程需要等待,性能受影响
可能有死锁风险

逻辑回归:

        优点:

线程无需等待,性能较好

         缺点:

不保证一致性
有额外内存消耗
实现复杂

 使用互斥锁的形式解决缓存击穿

 public Shop queryWithMutex(Long id) throws InterruptedException {String key = CACHE_SHOP_KEY + id;//1.从redis中查询店铺缓存String jsonShop = stringRedisTemplate.opsForValue().get(key);//2.判断是否存在if (StrUtil.isNotBlank(jsonShop)) {//3.存在,直接返回return JSONUtil.toBean(jsonShop, Shop.class);}if ("".equals(jsonShop)) {return null;}//4.不存在,重建缓存//4.1  获取互斥锁//shop为实体类Shop shop = null;try {Boolean isLock = tryLock(LOCK_SHOP_KEY + id);//4.2 判断是否获取成功if (!isLock) {//4.3 失败,则休眠并重试Thread.sleep(50);return queryWithPassThrough(id);}//4.4 成功,根据id查询数据库shop = getById(id);//5. 不存在 返回错误if (shop == null) {// 将空值放入redisstringRedisTemplate.opsForValue().set(key, "", CACHE_NULL_TTL, TimeUnit.MINUTES);return null;}// 6. 存在 写入 redisstringRedisTemplate.opsForValue().set(key, JSONUtil.toJsonStr(shop), CACHE_SHOP_TTL, TimeUnit.MINUTES);} catch (InterruptedException e) {throw new RuntimeException(e);} finally {//7.释放互斥锁unLock(LOCK_SHOP_KEY + id);}//8.返回return shop;}
http://www.lryc.cn/news/110779.html

相关文章:

  • 计算机网络(5) --- http协议
  • ubuntu 硬盘操作
  • C#垃圾回收器GC、析构函数(Finalize 方法)和Dispose
  • 第20周 服务容错-Hystrix
  • 浏览器不同源的页面之间如何跨域通信
  • 【云原生】K8S二进制搭建三:高可用配置
  • HOT78-跳跃游戏
  • HDFS中的NAMENODE元数据管理(超详细)
  • 区块链实验室(14) - 编译FISCO-BCOS
  • for(auto iter:vec) 及 for(auto iter:vec) 的典型用法
  • 【iosH5开发】IOS浏览器对于Vue3 Element-plus el-input中,input.value.focus无法聚焦问题
  • 【2023】华为OD机试真题Java CC++ Python JS Go-题目0257-增强的strstr
  • Android 解析ping回复包
  • 在外地ssh远程连接家里ubuntu服务器(Coplar内网穿透)
  • windows创建占用特定端口程序
  • 【uniapp 定位获取详细位置】
  • 后端进阶之路——万字总结Spring Security与数据库集成实践(五)
  • mysql8查看执行sql记录历史,配置开启sql历史日志general_log
  • git 版本控制与合并
  • 【力扣】23. 合并 K 个升序链表 <链表指针、堆排序、分治>
  • 微信小程序真机防盗链referer问题处理
  • SpringBoot集成Redisson实现延迟队列
  • 思想道德与法治
  • vue3登录页面
  • SK5代理与IP代理:网络安全守护者的双重防线
  • 线程间的同步、如何解决线程冲突与死锁
  • 8.4一日总结
  • 【面试】某公司记录一次面试题
  • 215. 数组中的第K个最大元素(快排+大根堆+小根堆)
  • Ubuntu18.04配置ZED_SDK 4.0, 安装Nvidia显卡驱动、cuda12.1