面试基础之-缓存设计问题
缓存雪崩
定义:缓存雪崩是指在缓存层面发生大规模的缓存失效(例如,缓存同时到期),导致所有的请求都落到数据库上,引起数据库压力骤增,可能导致数据库宕机的现象。
防止措施:
- 设置不同的过期时间:为缓存数据设置不同的过期时间,避免大量缓存同时失效。
- 使用持久化:确保缓存服务具有持久化机制,在重启后能够迅速恢复缓存数据。
- 设置缓存更新锁:在缓存失效后,通过分布式锁确保只有一个请求去构建缓存,其他请求等待缓存建立后直接使用。
- 预热缓存:在缓存到期前,系统自动更新缓存。
- 使用高可用的缓存架构:比如主从复制、集群,确保缓存服务的高可用性。
缓存穿透
定义:缓存穿透是指查询不存在的数据,由于缓存不会缓存这些空结果,每次查询都会穿透到数据库,如果有大量此类查询,会对数据库造成不必要的压力。
防止措施:
- 缓存空值:即使是查询不到的数据,也将其结果作为空值缓存起来,设置较短的过期时间。
- 参数校验:在应用层添加校验,避免不合法的查询请求查询数据库。
- 布隆过滤器:使用布隆过滤器预先检查某个值是否可能存在于数据库中,如果不可能存在,则直接返回,不查询数据库。
缓存击穿
定义:缓存击穿是指一个热点的key非常热门,在缓存失效的瞬间,持续的大量请求就穿破缓存,直接请求数据库,和缓存雪崩不同的是,缓存击穿指向特定的一个或几个热点数据。
防止措施:
- 设置热点数据永不过期:对于热点数据设置为永不过期,需要更新时使用缓存更新策略。
- 使用互斥锁:当缓存失效时,不是所有请求都去数据库加载数据,而是使用互斥锁或者分布式锁保证只有一个请求去数据库查询并重新加载到缓存。
这三个问题的解决方案有时候是相互交叉的,可以根据实际场景选择合适的策略或组合策略来防止。