首页 > 数据库 >Redis8:商户查询缓存2

Redis8:商户查询缓存2

时间:2024-11-09 18:44:20浏览次数:3  
标签:缓存 Redis8 商户 数据库 redis 穿透 id 请求

欢迎来到“雪碧聊技术”CSDN博客!

在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将不断探索Java的深邃世界,分享最新的技术动态、实战经验以及项目心得。

让我们一同在Java的广阔天地中遨游,携手提升技术能力,共创美好未来!感谢您的关注与支持,期待在“雪碧聊技术”与您共同成长!

目录

一、缓存穿透

1、什么是缓存穿透?

缓存穿透的关键:不怀好意的人,会使大量的请求打到数据库,从而使数据库崩溃。

2、解决缓存穿透的两个方案

①缓存空字符串

②布隆过滤

3、解决商铺查询的缓存穿透问题

①思路:使用缓存空对象的方式。

②编写代码

③运行项目,查看效果

4、总结

①缓存穿透产生的原因是什么?

②缓存穿透的解决方案有哪些?


一、缓存穿透

1、什么是缓存穿透?

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

举例:

假设我们的店铺id是1~20,结果有人非要查询id为100的店铺,这明显是不合理的,于是就会出现如下情况:

此时缓存中没有,去数据库查询也没有,于是这个不怀好意的人抓住了这个漏洞,搞了一堆线程来发送大量的请求,查询这个不存在的id,这些海量的请求都会打到数据库中,长时间一来,数据库就会垮掉(数据库速度不像redis那么快,可能打到数据库的请求一多,就会导致数据库垮掉)。

缓存穿透的关键:不怀好意的人,会使大量的请求打到数据库,从而使数据库崩溃。

2、解决缓存穿透的两个方案

解决关键:不让大量的不合理请求,打到数据库!

①缓存空字符串

解决思路:一个不怀好意的人,查询id=100的店铺时,redis、数据库中都没有,因此数据库就向redis中缓存一个key为100,值为“”空字符串的数据。这样即使这个人,查询id=100的店铺,发送多少次请求都没用,因为都被redis命中了""空字符串,然后就直接拒绝请求了,这是摸不到数据库的,因此就不会导致数据库崩溃。

因此就解决了缓存穿透。

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

                可以给存入redis中null的数据,设置有效期TTL,这样就不会导致爆满。

②布隆过滤

请求先经过“布隆过滤器”,先问问所查询的数据是否存在,如果“布隆过滤器”说不存在,那么将直接拒绝这个请求,根本不给你摸到数据库的机会。

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

3、解决商铺查询的缓存穿透问题

①思路:使用缓存空对象的方式。

第一步:查询数据库时,如果不存在,不仅要报404异常,还要将查询的id作为key,“”空字符串作为value,存入redis中,这样该请求就不会一直摸到数据库。

第二步:判断redis命中时,要额外增加一个判断逻辑:如果命中的是“”空字符串,则直接结束请求;不是“”空字符串,才会返回给前端。

②编写代码

③运行项目,查看效果

第一次访问一个不存在的商铺id=0:

可见此时数据库中,查询该id不存在,于是以该id为key,“”空字符串为value,存入redis中,以便后期防止缓存穿透。

第二次访问该id=0的商铺,就是纯恶意访问,想让这个id=0的请求频繁打在数据库上:

此时发现该请求摸不到数据库,而是在redis命中“”空字符串,然后被拒绝了,挡住了,没有摸到数据库,这就解决了“缓存穿透”。

4、总结

①缓存穿透产生的原因是什么?

用户请求的数据在redis缓存、数据库中都不存在,于是恶意地、频繁地发起这样的请求,一直打到数据库中,给数据库带来巨大压力,导致数据库崩溃。

②缓存穿透的解决方案有哪些?

  • 方式一:缓存“”空字符串
  • 方式二:布隆过滤

标签:缓存,Redis8,商户,数据库,redis,穿透,id,请求
From: https://blog.csdn.net/qq_63981644/article/details/143635020

相关文章

  • DDCA —— 缓存(Cache):缓存体系结构、缓存操作
    1.存储器层次(TheMemoryHierarchy)1.1现代系统中的存储器其中包括L1、L2、L3和DRAM1.2存储器的局限理想存储器的需求如下:零延迟容量无限零成本带宽无限零功耗但理想存储器的需求彼此冲突:容量更大的存储器意味着更大的延迟:需要花更长的时间来确定数据所在位置更......
  • Web缓存中毒(Web Cache Poisoning)是一种网络攻击技术,攻击者通过篡改或伪造Web服务器的
    Web缓存中毒(WebCachePoisoning)是一种网络攻击技术,攻击者通过篡改或伪造Web服务器的缓存内容,使得用户在访问网站时,获得恶意内容或错误内容的攻击方式。这种攻击通常依赖于利用Web缓存的设计缺陷或未充分验证的请求参数,从而让缓存服务器存储并返回恶意的、篡改过的响应。工作原理......
  • MyBatis如何关闭一级缓存(分注解和xml两种方式)
    @目录问题:为什么有缓存什么场景下必须需要关闭一级缓存关闭一级缓存方法(针对使用MyBatis场景)第1种:注解形式(可指定仅仅某个Mapper关闭注解)第2种:sql动态拼接传入的随机数问题:为什么有缓存mybatis默认开启一级缓存什么场景下必须需要关闭一级缓存场景:执行2次相同sql,但是第一次......
  • 【Mysql】Mysql 有几级缓存?每一级缓存,具体是什么?
     Mysql有几级缓存?每一级缓存,具体是什么?转载:======https://mp.weixin.qq.com/s/fyMiy4G1Fa7laUSbydiHsA本文目录- 一、MySQL缓存机制概述- 二、MySQL整体架构  -1.解析器(Parser)  -2.优化器(Optimizer)  -3.执行器(Executor)  -三个核心组件之间的交互......
  • 十四 MyBatis的缓存
    十四、MyBatis的缓存缓存:cache缓存的作用:通过减少IO的方式,来提高程序的执行效率。mybatis的缓存:将select语句的查询结果放到缓存(内存)当中,下一次还是这条select语句的话,直接从缓存中取,不再查数据库。一方面是减少了IO。另一方面不再执行繁琐的查找算法。效率大大提升。my......
  • 清除打印机缓存文件
    I.网络打印机对于网络打印机,打印机缓存文件通常存储在打印机自身的内存中,可以通过打印机的控制面板或网页界面进行管理和清除。II.本地打印机2.1停止打印服务【Win+R】打开“运行”窗口,输入services.msc,按回车键。在“服务”窗口中,找到并双击“PrintSpooler”服......
  • 100%吃透Spring 的三级缓存
    在此之前,我们需要了解什么是spring的循环依赖,下面我引用一篇之前的文档此处为语雀内容卡片,点击链接查看:https://www.yuque.com/u41175337/xy9eiy/egcll6gqml0ofb9a然后带你从源码级别debug,一步一步带你探索Spring是如何通过三级缓存来解决循环依赖问题的首先先创建两个类......
  • redis缓存常见问题及解决方案
    redis缓存常见问题及解决方案1、缓存穿透缓存穿透:是指查询一个不存在的数据,由于缓存无法命中,将去查询数据库,但是数据库也无此记录,并且出于容错考虑,我们没有将这次查询的null写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。在流量大时,可能DB就......
  • 高并发场景常见的三个缓存问题
    缓存穿透大量不存在的数据访问,缓存中没有,直接访问DB,大量的数据并发的访问DB,导致DB崩溃解决方法解决方法1:将空的结果也缓存到Redis解决方法2:在Redis的前面添加一个布隆过滤网,将DB组件放到布隆过滤中,将DB中不存在的数据先过滤一遍缓存雪崩大量的请求发送过来的时......
  • 阿里云cdn缓存过期时间,会导致服务器流量消耗,尤其是大文件
    您成功添加域名后,可以修改缓存时间。设置的缓存时间长短会导致回源流量不一样,费用也有所不同,建议根据不同的业务需求设置缓存时长。缓存过期时间会影响回源频率,建议根据实际业务需求设置资源缓存时长。缓存过期时间过短,会导致CDN频繁回源,增加源站的流量消耗;缓存过期时间过长,会......