5.缓存问题
缓存穿透
指的是对某个一定不存在的数据进行请求,该请求将会穿透缓存到达数据库。
解决方案:
- 对这些不存在的数据缓存一个空数据。
- 对这类请求进行过滤
缓存雪崩
指的是由于数据没有加载到缓存中,或者缓存数据在同一时间出现大面积的失效(过期),又或者是缓存服务器崩溃,导致大量的请求都到达数据库。
在有缓存的系统中,系统非常的依赖缓存,缓存分担了很大一部分的数据请求,当发生缓存雪崩时,数据库因为无法处理这么多的请求,导致数据库崩溃。
解决方案:
- 为了防止缓存在同一时间内大量的过期导致缓存雪崩,可以通过观察用户行为,合理的设置缓存过期时间来实现。
- 为了防止缓存服务器发生宕机而导致的缓存雪崩,我们可以采用分布式缓存,分布式缓存每个节点只缓存部分数据,当某个节点宕机,也可以保证其他节点的数据可以使用。
- 也可以进行缓存预热,避免在系统刚启动不久由于还未将大量数据进行缓存而导致缓存雪崩。
缓存一致性
缓存一致性要求数据更新的同时缓存数据也能够实时更新。
解决方案:
- 在数据更新的同时去更新缓存数据。
- 在读缓存之前判断缓存是不是最新的,如果不是最新的,那么先进行更新。
要保证缓存一致性需要付出很大的代价,缓存数据最好是对那些对一致性要求不高的数据进行缓存,允许缓存数据存在一些脏数据。
缓存无底洞现象
指的是为了满足业务要求添加了大量的缓存节点,但是性能不但没有好转反而下降的现象。
产生原因:缓存系统通常采用hash函数将key映射到对应的缓存节点,随着缓存节点数目的增加,键值分布到更多的节点上,导致客户端一次批量操作会涉及到多次网络操作,这意味着批量操作的耗时会随着节点数目的增加而不断的增大。此外,网络连接数变多,对节点的性能也有一定的影响。
解决方案:
- 优化批量数据操作命令
- 减少网络通信次数
- 降低接入成本,使用长连接、连接池,NIO等。