登录
注册
开源
企业版
高校版
搜索
帮助中心
使用条款
关于我们
开源
企业版
高校版
私有云
模力方舟
AI 队友
登录
注册
12月21日就在北京,来看大模型推理 + 国产硬件生态 + 开源社区分享,一起搞技术、聊开源、领福利~~
代码拉取完成,页面将自动刷新
捐赠
捐赠前请先登录
取消
前往登录
扫描微信二维码支付
取消
支付完成
支付提示
将跳转至支付宝完成支付
确定
取消
Watch
不关注
关注所有动态
仅关注版本发行动态
关注但不提醒动态
3
Star
45
Fork
21
DreamCoders
/
CoderGuide
代码
Issues
1169
Pull Requests
0
Wiki
统计
流水线
服务
JavaDoc
PHPDoc
质量分析
Jenkins for Gitee
腾讯云托管
腾讯云 Serverless
悬镜安全
阿里云 SAE
Codeblitz
SBOM
我知道了,不再自动展开
更新失败,请稍后重试!
移除标识
内容风险标识
本任务被
标识为内容中包含有代码安全 Bug 、隐私泄露等敏感信息,仓库外成员不可访问
缓存穿透问题
待办的
#IAJL40
陌生人
拥有者
创建于
2024-08-13 10:12
<blockquote><strong>缓存穿透-数据库没有对应的数据空查询</strong></blockquote><p><span style="color: rgb(25, 27, 31); background-color: rgb(255, 255, 255);">先来看一个常见的缓存使用方式:读请求来了,先查下缓存,缓存有值命中,就直接返回;缓存没命中,就去查数据库,然后把数据库的值更新到缓存,再返回。</span></p><p><img src="https://jsd.onmicrosoft.cn/gh/iGaoWei/codercdn@master/question/20240627/2024062710531929714.png" alt="https://jsd.onmicrosoft.cn/gh/iGaoWei/codercdn@master/question/20240627/2024062710531929714.png" data-href="" style=""/></p><p style="text-align: start;">读取缓存</p><p style="text-align: start;"><strong>缓存穿透</strong>:指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,进而给数据库带来压力。</p><blockquote style="text-align: start;">通俗点说,读请求访问时,缓存和数据库都没有某个值,这样就会导致每次对这个值的查询请求都会穿透到数据库,这就是缓存穿透。</blockquote><h4 style="text-align: start;">缓存穿透一般都是这几种情况产生的:</h4><p style="text-align: start;"><strong>业务不合理的设计</strong>,比如大多数用户都没开守护,但是你的每个请求都去缓存,查询某个userid查询有没有守护。</p><p style="text-align: start;"><strong>业务/运维/开发失误的操作</strong>,比如缓存和数据库的数据都被误删除了。</p><p style="text-align: start;"><strong>黑客非法请求攻击</strong>,比如黑客故意捏造大量非法请求,以读取不存在的业务数据。</p><h4 style="text-align: start;"><strong>如何避免缓存穿透呢?</strong> 一般有三种方法。</h4><p style="text-align: start;">1.如果是非法请求,我们在API入口,对参数进行校验,过滤非法值。</p><p style="text-align: start;">2.如果查询数据库为空,我们可以给缓存设置个空值,或者默认值。但是如有有写请求进来的话,需要更新缓存哈,以保证缓存一致性,同时,最后给缓存设置适当的过期时间。(业务上比较常用,简单有效)</p><p style="text-align: start;">3.使用布隆过滤器快速判断数据是否存在。即一个查询请求过来时,先通过布隆过滤器判断值是否存在,存在才继续往下查。</p><blockquote style="text-align: start;">布隆过滤器原理:它由初始值为0的位图数组和N个哈希函数组成。一个对一个key进行N个hash算法获取N个值,在比特数组中将这N个值散列后设定为1,然后查的时候如果特定的这几个位置都为1,那么布隆过滤器判断该key存在。</blockquote>
<blockquote><strong>缓存穿透-数据库没有对应的数据空查询</strong></blockquote><p><span style="color: rgb(25, 27, 31); background-color: rgb(255, 255, 255);">先来看一个常见的缓存使用方式:读请求来了,先查下缓存,缓存有值命中,就直接返回;缓存没命中,就去查数据库,然后把数据库的值更新到缓存,再返回。</span></p><p><img src="https://jsd.onmicrosoft.cn/gh/iGaoWei/codercdn@master/question/20240627/2024062710531929714.png" alt="https://jsd.onmicrosoft.cn/gh/iGaoWei/codercdn@master/question/20240627/2024062710531929714.png" data-href="" style=""/></p><p style="text-align: start;">读取缓存</p><p style="text-align: start;"><strong>缓存穿透</strong>:指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,进而给数据库带来压力。</p><blockquote style="text-align: start;">通俗点说,读请求访问时,缓存和数据库都没有某个值,这样就会导致每次对这个值的查询请求都会穿透到数据库,这就是缓存穿透。</blockquote><h4 style="text-align: start;">缓存穿透一般都是这几种情况产生的:</h4><p style="text-align: start;"><strong>业务不合理的设计</strong>,比如大多数用户都没开守护,但是你的每个请求都去缓存,查询某个userid查询有没有守护。</p><p style="text-align: start;"><strong>业务/运维/开发失误的操作</strong>,比如缓存和数据库的数据都被误删除了。</p><p style="text-align: start;"><strong>黑客非法请求攻击</strong>,比如黑客故意捏造大量非法请求,以读取不存在的业务数据。</p><h4 style="text-align: start;"><strong>如何避免缓存穿透呢?</strong> 一般有三种方法。</h4><p style="text-align: start;">1.如果是非法请求,我们在API入口,对参数进行校验,过滤非法值。</p><p style="text-align: start;">2.如果查询数据库为空,我们可以给缓存设置个空值,或者默认值。但是如有有写请求进来的话,需要更新缓存哈,以保证缓存一致性,同时,最后给缓存设置适当的过期时间。(业务上比较常用,简单有效)</p><p style="text-align: start;">3.使用布隆过滤器快速判断数据是否存在。即一个查询请求过来时,先通过布隆过滤器判断值是否存在,存在才继续往下查。</p><blockquote style="text-align: start;">布隆过滤器原理:它由初始值为0的位图数组和N个哈希函数组成。一个对一个key进行N个hash算法获取N个值,在比特数组中将这N个值散列后设定为1,然后查的时候如果特定的这几个位置都为1,那么布隆过滤器判断该key存在。</blockquote>
评论 (
0
)
登录
后才可以发表评论
状态
待办的
待办的
进行中
已完成
已关闭
负责人
未设置
标签
Redis
未设置
标签管理
里程碑
未关联里程碑
未关联里程碑
Pull Requests
未关联
未关联
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
未关联
未关联
master
开始日期   -   截止日期
-
置顶选项
不置顶
置顶等级:高
置顶等级:中
置顶等级:低
优先级
不指定
严重
主要
次要
不重要
参与者(1)
1
https://gitee.com/DreamCoders/CoderGuide.git
git@gitee.com:DreamCoders/CoderGuide.git
DreamCoders
CoderGuide
CoderGuide
点此查找更多帮助
搜索帮助
Git 命令在线学习
如何在 Gitee 导入 GitHub 仓库
Git 仓库基础操作
企业版和社区版功能对比
SSH 公钥设置
如何处理代码冲突
仓库体积过大,如何减小?
如何找回被删除的仓库数据
Gitee 产品配额说明
GitHub仓库快速导入Gitee及同步更新
什么是 Release(发行版)
将 PHP 项目自动发布到 packagist.org
评论
仓库举报
回到顶部
登录提示
该操作需登录 Gitee 帐号,请先登录后再操作。
立即登录
没有帐号,去注册