缓存的意义
1:缓存一般都在内存中操作,性能比数据库高。
2:缓存资源的消耗相比数据库资源的消耗更低。
基于提高应用性能的目的,使用缓存提升了数据处理的性能,降低数据存储的消耗,提高了数据访问的响应时间。
缓存雪崩
- 问题点:
当大量的缓存key设置的过期时间都是同一个时间点,那么当到达这个时间点时,大量的缓存key失效,导致请求全部落地到数据库,造成数据库瞬间并发请求提高,带来雪崩问题。
- 解决方案:
1:过期时间添加随机值,将相同过期时间点概率降低。(弊端:缓存失效时间不能准确的管理)
2:缓存不设置过期时间,通过更新操作更新缓存。(弊端:更新失败,缓存一致性问题)
缓存穿透
- 问题点:
请求的key,在缓存及db中都不存在,数据库查询不存在,不进行缓存设置,导致每次请求都落地到数据库。如果是恶意的请求,将造成数据库压力过大。例如:业务id是数据库自增的,使用id为-1的请求参,那么每次都会查询数据库,而且数据不存在。
- 解决方案:
1:将不存在的key也缓存,设置value为特定业务值及合适的过期时间。那么请求过来时,换查询缓存,并且在过期时间内不会落地数据库。(弊端:当数据库出现新的id,且之前缓存已经被设置为控制,那么过期时间内无法访问新增的数据)
2:布隆过滤器,将所有可能存在的id存储在一个bitmap,请求前先经过过滤器判断是否存在。(弊端:存在误判的可能)
缓存击穿
- 问题点:
对于某个热点key,每秒并发很高,在key失效的时间点,瞬间并发请求同时查询数据库,导致数据库压力瞬时暴涨。如果这样的key很多,而且当存在跟缓存雪崩一样问题的情况,数据库无疑压力更大。
- 解决方案:
1:热点key不设置过期时间,通过更新操作同步。(弊端:更新失败带来的一致性问题)
2:通过锁机制,只允许一个请求查库同,时可以考虑使用缓存降级,获得锁失败的进程查询降级的缓存。(弊端:互斥锁带来的性能问题,导致其他线程在等待)
网友评论