分布式缓存Redis击穿、雪崩、穿透面试题+SpringCache解决方案

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 分布式缓存Redis击穿、雪崩、穿透面试题+SpringCache解决方案

一、分布式缓存必考题之缓存击穿+解决方案

缓存击穿 (某个热点key缓存失效了):

缓存中没有但数据库中有的数据,假如是热点数据,那key在缓存过期的一刻,同时有大量的请求,这些请求都会击穿到DB,造成瞬时DB请求量大、压力增大。

和缓存雪崩的区别在于这里针对某一key缓存,后者则是很多key。


预防:

设置热点数据不过期

定时任务定时更新缓存

设置互斥锁


SpringCache解决方案:

缓存的同步 sync

sync 可以指示底层将缓存锁住,使只有一个线程可以进入计算,而其他线程堵塞,直到返回结果更新到缓存中

@Cacheable(value = {“product”},key = “#root.args[0]”, cacheManager = “customCacheManager”, sync=true)


二、分布式缓存必考题之缓存雪崩+解决方案

缓存雪崩 (多个热点key都过期):

大量的key设置了相同的过期时间,导致在缓存在同一时刻全部失效,造成瞬时DB请求量大、压力骤增,引起雪崩


预防:

存数据的过期时间设置随机,防止同一时间大量数据过期现象发生

设置热点数据永远不过期,定时任务定时更新


SpringCache解决方案:

设置差别的过时时间

比如CacheManager配置多个过期时间维度

配置文件 time-to-live 配置

cache:

#使用的缓存类型

type: redis

#过时时间

redis:

time-to-live: 3600000


三、分布式缓存必考题之缓存穿透+解决方案

缓存穿透(查询不存在数据):

查询一个不存在的数据,由于缓存是不命中的,并且出于容错考虑,如发起为id为“-1”不存在的数据

如果从存储层查不到数据则不写入缓存这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。存在大量查询不存在的数据,可能DB就挂掉了,这也是黑客利用不存在的key频繁攻击应用的一种方式。


预防:

接口层增加校验,数据合理性校验

缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,设置短点的过期时间,防止同个key被一直攻击


SpringCache解决方案:

空结果也缓存,默认不配置condition或者unless就行

cache:

#使用的缓存类型

type: redis

#过时时间

redis:

time-to-live: 3600000

# 开启前缀,默以为true

use-key-prefix: true

# 键的前缀,默认就是缓存名cacheNames

key-prefix: XD_CACHE

# 是否缓存空结果,防止缓存穿透,默以为true

cache-null-values: true


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1天前
|
缓存 NoSQL Redis
Java技术栈Redis面试总结(全面,实时更新)
Java技术栈Redis面试总结(全面,实时更新)
|
6天前
|
NoSQL 算法 Java
【redis源码学习】持久化机制,java程序员面试算法宝典pdf
【redis源码学习】持久化机制,java程序员面试算法宝典pdf
|
6天前
|
存储 缓存 NoSQL
实战:第十一篇:StringRedisTemplate获取redis信息,面试官突击一问
实战:第十一篇:StringRedisTemplate获取redis信息,面试官突击一问
|
8天前
|
存储 消息中间件 NoSQL
Redis为什么会这么快?Redis到底有多快?【大厂经典面试题】
Redis为什么会这么快?Redis到底有多快?【大厂经典面试题】
30 1
|
8天前
|
存储 NoSQL Redis
Redis源码、面试指南(5)多机数据库、复制、哨兵、集群(下)
Redis源码、面试指南(5)多机数据库、复制、哨兵、集群
224 1
|
8天前
|
监控 NoSQL Redis
Redis源码、面试指南(5)多机数据库、复制、哨兵、集群(上)
Redis源码、面试指南(5)多机数据库、复制、哨兵、集群
277 0
|
8天前
|
存储 NoSQL 调度
Redis源码、面试指南(4)单机数据库、持久化、通知与订阅(下)
Redis源码、面试指南(4)单机数据库、持久化、通知与订阅
13 0
|
1天前
|
消息中间件 存储 Java
Java分布式技术面试总结(全面,实时更新)
Java分布式技术面试总结(全面,实时更新)
|
1天前
|
监控 Java Nacos
Java微服务框架面试总结(全面,实时更新)
Java微服务框架面试总结(全面,实时更新)
|
1天前
|
存储 算法 安全
Java高级进阶面试总结(全面,实时更新)
Java高级进阶面试总结(全面,实时更新)

热门文章

最新文章