缓存设计
-
缓存是如何实现高性能和高并发的?
- 减少数据库访问:缓存常用数据以避免不必要的数据库访问,从而提高性能。
- 降低延迟:缓存数据可以以比数据库更快的速度响应请求,从而降低延迟。
- 提高并发性:缓存数据可以允许多个请求同时访问,从而提高并发性。
- 减少资源消耗:缓存数据可以避免多次执行相同的查询,从而减少资源消耗。
- 缓存管理策略:使用合适的缓存管理策略,例如LRU(最近最少使用),可以确保缓存的有效性。
-
缓存数据一致性是什么?常用的方式有哪些?
缓存数据一致性是指缓存数据和数据源(通常是数据库)中的数据保持同步和一致的状态。 常用的缓存数据一致性方式有:
- 及时更新:及时将数据源中的数据更新到缓存中,以保证数据一致性。
- 使用版本号:为缓存数据附加版本号,当数据源中的数据更新时,版本号也会随之更新。
- 引入事务:使用事务保证数据更新的原子性,从而保证数据一致性。
- 使用预热:预先加载数据到缓存中,以避免读取数据源中的数据时的不一致。
- 使用双缓存:在缓存和数据源之间引入另一个缓存,以保证缓存数据的一致性。
-
缓存数据的淘汰策略有哪些?
- LRU(Least Recently Used):最近最少使用,淘汰最早未使用的数据。
- FIFO(First In First Out):先进先出,淘汰最先进入缓存的数据。
- LFU(Least Frequently Used):最近最不常使用,淘汰使用频率最低的数据。
- RR(Random Replacement):随机替换,随机淘汰缓存中的数据。
- TTL(Time To Live):生存时间,根据数据的生存时间来淘汰数据。
-
缓存的“穿透”,“击穿”和“雪崩”分别是什么,要如何解决。
- 缓存穿透:指当请求查询的数据不存在时,请求仍然会到达数据源,造成大量的无效请求。 解决方法: 对不存在的数据设置空值缓存,避免请求到达数据源。 使用布隆过滤器进行预处理,识别不存在的数据。
- 缓存击穿:指当请求查询的数据突然失效在一个很短的时间内被大量请求。 解决方法: 使用分布式锁进行同步,避免数据在缓存失效时被大量请求。 使用读写分离,读请求走缓存,写请求走数据源。
- 缓存雪崩:指当缓存失效很多时,大量的请求同时到达数据源,造成数据源压力过大,无法正常服务。 解决方法: 对缓存失效的数据设置过期时间,避免缓存失效时的瞬时请求峰值。 使用分布式锁进行同步,避免缓存失效时的瞬时请求峰值。 使用动态扩容技术,适时增加数据源的容量。
-
什么是缓存预热?要如何实现预热?
缓存预热是指在网站更新之前,先将新版本的缓存数据加载到缓存服务器,以保证在更新后用户访问网站时能够快速获取缓存内容,从而提高网站访问速度和用户体验。
实现预热的方法有以下几种:
1.手动预热:手动通过浏览器或爬虫工具访问需要预热的页面,加载缓存数据。
2.自动预热:使用脚本或工具自动批量访问需要预热的页面,加载缓存数据。
3.CDN 预热:利用 CDN 的缓存服务器自动预热缓存数据。
4.可视化预热:使用可视化工具对网站页面进行预热,可以方便的查看预热进度和结果。