缓存系统相关的一些概念
缓存 刘宇帅 6年前 阅读量: 1213
缓存系统在现在的后台服务中是必不可少的,但缓存系统有很多方面的问题需要我们注意。
缓存穿透
缓存穿透是指当查询一个值不在缓存中的时候,系统会去底层数据库查询,当有大量的流量都命中了缓存中不存在的key那么缓存的存在就起不到作用,底层DB可能会挂掉。如果存在缓存穿透那么这就是漏洞。
解决方案
- 把查询结果为空的情况我们同样缓存起来,可以把缓存时间设置的稍微短点,当数据更新的时候记得更新缓存数据。
- 把所有可能存在的数据,哈希到一个 bitmap ,查询的时候使用该 bitmap 过滤不存在的key。
缓存雪崩
缓存雪崩是指缓存系统中的数据在同一时间过期,导致短时间内所有流量都打到底层存储,底层存储压力过大挂掉的现象
解决方案
- 我们在往缓存系统里写缓存的时候使用单线程的方式,避免所有缓存的过期时间相同。
- 我们可以为不同的key的缓存时间添加一个1-5分钟(根据具体情况定)的随机值,避免所有key过期时间相同
- 我们可以使用二级缓存架构,一级缓存时间比较短,二级缓存是长期存储,当一级缓存失效的时候去访问二级缓存避免对底层DB造成过大压力
缓存击穿
缓存击穿是指缓存中某一个 key 的访问量特别大,当这个 key 过期的时候,高并发的请求会同时去查询数据库,造成和缓存雪崩一样的结果。
解决方案
- 当 key 过期的时候,使用加锁机制,这样保证只有一个线程能够获得锁,其他线程只能等待,获得锁的系统查询DB并把写入缓存,系统线程检测到锁释放的时候就去缓存取数据,取不到就再次申请锁,而后循环上面的过程。
- 上面提到的两级缓存系统,在这里同样适用
- 设置key永久不过期,或者使用定时任务在该key快过期的时候定期取更新缓存
缓存预热
缓存预热是指在系统上线前提前更新缓存系统中数据
解决方案
- 上线前提前使用脚本把相关数据写入缓存系统
- 定时刷新缓存
缓存更新
除了缓存系统自带的过期失效策略外,我们也可以根据不同业务设置不同的缓存更新策略。
方案
- 定时清理更新缓存
- 当取缓存的时候判断缓存是否过期,过期的话再更新缓存
缓存降级
当访问量剧增、相关服务出现问题的时候,我们需要保证服务的可用性,当时可以降低服务的正确性。比如我们做一个商城,我们可以定时把商品列表数据写入缓存系统,当商品列表查询服务出现问题的时候,我们可以把查询接口切换到缓存系统,这样虽然我们无法保证商品的数据的完全正确,但是可以保证我们的系统仍然可以“正常运行”