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

【遇见青山】项目难点:缓存穿透的解决方案

【遇见青山】项目难点:缓存穿透的解决方案

  • 1.缓存穿透现象
    • 缓存空对象
    • 布隆过滤
    • 其他方案
  • 2.解决方案,缓存空数据

1.缓存穿透现象

缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。(一般是指黑客的恶意流量攻击)

常见的解决方案有两种:

缓存空对象

在这里插入图片描述

  • 优点:实现简单,维护方便
  • 缺点:额外的内存消耗,可能造成短期的不一致

布隆过滤

在这里插入图片描述

  • 优点:内存占用较少,没有多余key
  • 缺点:实现复杂,存在误判可能

其他方案

  • 增强id的复杂度,避免被猜测id规律
  • 做好数据的基础格式校验
  • 加强用户权限校验
  • 做好热点参数的限流

2.解决方案,缓存空数据

首先,在第一次查询不存在时,缓存空数据数据到Redis中:

// 不存在,查询数据库
Shop shop = getById(id);
// 查询数据库不存在,返回错误
if (shop == null) {// 将null值写入Redis,防止缓存穿透问题stringRedisTemplate.opsForValue().set(CACHE_SHOP_KEY + id, "", CACHE_NULL_TTL, TimeUnit.MINUTES);return Result.fail("店铺不存在!");
}

在查询数据库之前,判断缓存的值是否为""值,如果是则直接返回错误:

// 判断命中的是否为空值 ""
if ("".equals(shopJson)) {return Result.fail("店铺信息不存在!");
}

测试:查询不存在的商户信息,Redis中保存了""值,再次查询时,则不通过数据库,直接在缓存层命中

在这里插入图片描述

http://www.lryc.cn/news/2169.html

相关文章:

  • 单一职责原则|SOLID as a rock
  • 使用百度地图官方WEB API,提示 “ APP 服务被禁用“ 问题的解决方法
  • nodejs如何实现Digest摘要认证?
  • 【C#项目】图书馆管理系统-WinForm+MySQL
  • RNN循环神经网络原理理解
  • 一句话设计模式1: 单例模式
  • 新版国家标准GB/T 28181—2022将于2023年7月1日正式实施,与GB/T 28181—2016差别有哪些?
  • 剑指 Offer 41. 数据流中的中位数
  • 分布式架构下,Session共享有什么方案?
  • 瀚博半导体载天VA1 加速卡安装过程
  • 服务降级和熔断机制
  • 史上最全最详细的Instagram 欢迎消息引流及示例
  • MDB 5 UI-KIT Bootstrap 5 最新版放送
  • 做专家型服务者,尚博信助力企业数字化转型跑出“加速度” | 爱分析调研
  • CSS 重新认识 !important 肯定有你不知道的
  • android 12添加系统字体并且设置为默认字体
  • LeetCode刷题系列 -- 1094. 拼车
  • 二叉查找树的应用 —— K模型和KV模型
  • 深度学习实战(11):使用多层感知器分类器对手写数字进行分类
  • ThingsBoard-警报
  • 如何去阅读源码,我总结了18条心法
  • 排序:归并排序
  • Allegro172版本线到铜皮不按照设定值避让的原因和解决办法
  • 小白该从哪方面入手学习大数据
  • 尚医通(十)数据字典加Redis缓存 | MongoDB
  • 为什么我们不再发明编程语言了?
  • 预处理指令详解
  • Redis
  • Elasticsearch5.5.1 自定义评分插件开发
  • 4.4 序列化与反序列化