-
卧槽!缓存的问题太多了(雪崩、击穿、穿透…)一个个解决!
作者:温安适
来源:https://my.oschina.net/floor/blog/4964676
引言
一个超级疲惫的下午,离下班还有30分钟,小航拿了一袋坚果,对我说:”温哥,来来来,吃个坚果,开心下”
有了前几次的,经验,我意识到,这兄弟又要问题问题,委婉的回绝到:”谢谢好意,你吃吧,我不饿”。
小航,一看我有所防备,有拿出了安慕希,并且抓住了我的手臂,说道:“大神,我有困惑,请您帮帮我”
看他如此诚恳,我不好意思的说道:“大神不敢当,水平有限,恐无法为你解惑”。
小航一看有戏,有给了我一袋坚果,眼中有光的说道:“哥,您指点一二,无论对错,我都愿意听”
我感动(dong xi hao chi)的说:“什么问题,我试试看”
小航立刻说道:“使用缓存都有什么问题”
我缓缓道来:“主要四个问题,击穿,穿透,雪崩,污染”
问题描述
逐个解决
缓存击穿
热点key过期了,请求打到了数据库
解决方式
不给热点key设置过期时间
缓存穿透
缓存没有,数据库也没有。
解决方式
- 缓存空值或缓存缺省值
- 对入参进行校验,屏蔽无效参数请求
- 在redis前置布隆过滤器,快速判断
缓存雪崩
大量key同时失效
给key的过期时间加上随机数,避免同时过期
Redis挂了
- Redis,搭建主从集群(提高redis可靠性)
- 服务限流(限制访问量,减少redis压力)
- 服务熔断(直接返回错误,不在继续往下请求)
- 服务降级(redis替代方式,或者直接走库)
缓存污染
有不常用的key占用redis内存。
解决方式:
- 如果知道是那个key,直接删除
- Redis空间充足,可以考虑不解决
- 设置redis过期策略为allkey-lfu
注意是lfu,把访问次数最低的数据淘汰出缓存
Lru,解决不了如下场景:大量数据进行一次全体读取,因为这些被查询的数据刚刚被访问过,所以 lru 字段值都很大,无法淘汰不常用的key
总结
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
JavaScript判断两个数组相等的四类方法
js如何操作video标签
React实战--利用甘特图和看板,强化Paas平
【记录】正则替换的偏方
前端下载 Blob 类型整理
抽象语法树AST必知必会
关于JS定时器的整理
JS中使用Promise.all控制所有的异步请求都完
js中字符串的方法
import-local执行流程与node模块路径解析流程