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

Redis经典问题:缓存穿透

(笔记总结自《黑马点评》项目)

一、产生原因

用户请求的数据在缓存中和数据库中都不存在,不断发起这样的请求,给数据库带来巨大压力。

常见的解决方式有缓存空对象和布隆过滤器。

二、缓存空对象

思路:当我们客户端访问不存在的数据时,先请求redis,但是此时redis中没有数据,此时会访问到数据库,但是数据库中也没有数据,这个数据穿透了缓存,直击数据库,我们都知道数据库能够承载的并发不如redis这么高,如果大量的请求同时过来访问这种不存在的数据,这些请求就都会访问到数据库,简单的解决方案就是哪怕这个数据在数据库中也不存在,我们也把这个数据存入到redis中去,这样,下次用户过来访问这个不存在的数据,那么在redis中也能找到这个数据就不会进入到缓存了。

优点:实现简单,维护方便

缺点:额外的内存消耗;可能造成短期的不一致

 


示例代码:

    @Overridepublic Result queryById(Long id) {String key = CACHE_SHOP_KEY + id;//从redis中查询商铺缓存String shopJson = stringRedisTemplate.opsForValue().get(key);//判断是否存在if (StrUtil.isNotBlank(shopJson)) {//存在,返回Shop shop = JSONUtil.toBean(shopJson, Shop.class);return Result.ok(shop);}//判断命中的是否是空值(存在但是不是null,也就是空字符串)if (shopJson != null) {//返回一个错误信息return Result.fail("店铺信息为空");}//不存在,根据id查询数据库Shop shop = getById(id);//不存在,返回错误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);}

三、布隆过滤器

布隆过滤器其实采用的是哈希思想来解决这个问题,通过一个庞大的二进制数组,走哈希思想去判断当前这个要查询的这个数据是否存在,如果布隆过滤器判断存在,则放行,这个请求会去访问redis,哪怕此时redis中的数据过期了,但是数据库中一定存在这个数据,在数据库中查询出来这个数据后,再将其放入到redis中,假设布隆过滤器判断这个数据不存在,则直接返回。

这种方式优点在于节约内存空间,存在误判,误判原因在于:布隆过滤器走的是哈希思想,只要哈希思想,就可能存在哈希冲突。(判断不存在则一定不存在,判断存在有可能不存在)

四、其他方法

①增强id的复杂度,避免被猜测id规律。

②做好数据的基础格式校验。

③加强用户权限校验。

④做好热点参数的限流。

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

相关文章:

  • DEFORMABLE DETR: DEFORMABLE TRANSFORMERS FOR END-TO-END OBJECT DETECTION (论文解析)
  • 网络连接评分机制之NetworkFactory
  • 极致精细的jmeter+ant+jenkins 搭建接口自动化测试
  • Unity物体查找方式
  • 【Spring容器的启动流程】
  • Python---字符串
  • MySQL数据 - 索引
  • 长安链BaaS服务平台调研
  • 怎么关闭php错误提示?两者方法分享
  • Android Aidl跨进程通讯(三)--进阶使用
  • vue.js+nodejs家庭个人理财收支管理系统5x6nf
  • 怎样去掉win11快捷方式的小箭头
  • Django项目如何配置日志文件信息
  • 遇到一个异步任务后是否会直接加入到异步队列当中
  • SUSE Linux文件系统在线扩容
  • 智能电话机器人的出现,能够解决哪些问题?
  • 16-数据结构-图的存储结构
  • 递推算法及常见示例(C++、Python实现)
  • vscode调试程序设置
  • 电商邮件营销攻略:教你如何有效运营邮件营销策略!
  • centos+jenkins+pycharm
  • Linux-Centos7安装Docker
  • 前端Vue入门-day06-路由进阶
  • 数据库服务器是什么意思?数据库服务器有哪些?
  • 配电网智能软开关(sop)规划模型matlab
  • Qt 常用函数
  • UMA 2 - Unity Multipurpose Avatar☀️六.Advanced Occlusion高级遮挡功能解决皮肤服饰穿模
  • 深度解析自然语言处理之篇章分析
  • Python3.11教程3:模块和包(pip/conda)、文件系统(os/ shutil/json/pickle/openpyxl/xlrd)
  • shell 脚本工具(三剑客)