常见问题
缓存穿透
即故意去请求缓存中不存在的数据,导致所有的请求都去请求数据库,从而数据库连接异常。
解决方案:
- 使用互斥锁,获得锁后再去请求数据库。否则眠一段时间后重试。
- 增加接口校验,比如,利用布隆过滤器,内部维护一系列合法有效的 Key。迅速判断出,请求所携带的 Key 是否合法有效。
缓存击穿
指缓存中没有但数据库中有的数据(一般是缓存时间到期),同时,并发用户特别多,都去数据库去读数据,造成数据库压力瞬间增大
解决方案:
- 设置使用率高的数据永不过期。
- 使用互斥锁,得到锁的请求负责更新缓存,其他请求等待一段时间。
缓存雪崩
指缓存中数据大批量到过期时间,从而导致查询数据量很大。
解决方案:
-
像缓存击穿的处理方式一样,使用 不过期的超时事件和互斥锁。
-
缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
- 双缓存,缓存 A 和缓存 B。缓存 A 设置失效时间,缓存 B 不设失效时间,做缓存预热操作。