缓存redis:
在服务器内部存储sql的查询结果,如果有结果,就将查询结果缓存,下次再有查询直接先查询缓存,减少数据库的访问量,加快程序反应速度
内部是(k,v)的结构
缓存击穿:
过期:某个数据缓存失效时,大量请求涌入数据库,(访问同一个商品)
新增:新增的产品还没有进入缓存中
解决方式:
- 设置缓存永不过期
- 增加互斥锁,只有一个请求可以到达数据库,其他请求稍后返回缓存(redis)中,(访问多个商品)
缓存穿透
恶意攻击,使用负数,0值,无效值,redis查不到,无法拦截。缓存起不到作用,此时缓存就好像被“穿透”了一样,起不到任何作用。
- 内部是(k,v)的结构k是由规则的,可以根据规则来提前抵挡攻击
- 拉黑ip
- 接口校验,提前进行数据判断,阻挡不正确的访问
- 设置一个空值返回结果在缓存中
缓存雪崩
多个数据缓存失效后,导致大量查询请求涌入数据库
- 缓存服务器挂了
- 高峰期缓存大量失效
- 热点缓存失效,对热点数据持续高并发
解决方式:
1.调整缓存过期的时间
- 设置数据永不过期,
- 设置缓存失效为随机,避免缓存同时失效,
- 设置缓存更新,每次访问刷新缓存时间
2.使用互斥锁,放止热点高并发访问
3.设置限流模式
4.超时机制设计
- 等待超时,如果等待请求的时间过长,丢弃任务
- 运行超时,运行时间超过时长,结束任务(内部可能发生了锁冲突等问题)
5.设置双缓存方案,设置redis集群
- 主缓存:主要使用的缓存,主存失效后从数据库加载最新信息
- 备份缓存:长期有效,获取锁失败读取的缓存,主存更新时需要同步更新备份
在集群中,即使某一个redis挂了,其他redis服务,仍可以继续处理请求,最好配合降级服务使用
6.发生缓存雪崩时,还可以使用本地缓存
多台机器上部署的缓存服务实例的内存中,还有一套 ehcache 的缓存,还能支撑一阵
7.发生雪崩后,恢复备份的redis
shiyongRDB,AOF结合方式恢复缓存
8.熔断降级
熔断:当缓存服务器宕机或超时响应时,为了防止整个系统出现雪崩,暂时停止业务服务访问缓存系统。
降级:当出现大量缓存失效,而且处在高并发高负荷的情况下,在业务系统内部暂时舍弃对一些非核心的接口和数据的请求,而直接返回一个提前准备好的 fallback(退路)错误处理信息。