缓存
缓存就是将系统或者程序需要的数据存在内存中,以便快速访问,不用重新创建新的实例。减少系统开销提高系统效率。
常见的缓存场景:
- 客户端浏览器缓存 —— 减少网站的访问或者静态资源的加载
- Web服务端缓存 —— 减少应用服务器的请求
- 应用程序缓存 —— 减少数据库的访问
- 数据库缓存 —— 减少文件系统的IO
- 操作系统磁盘缓存 —— 减少磁盘机械操作
缓存的实现
- 存储方式
内存:直接使用JVM的内存,比如定义一个对象,Map map = new HashMap();
自身内存不够,第三方内存型数据库来凑:Redis - 技术方案
- Spring支持的Cache,或者EhCache
- JetCache框架
问题及解决方案
-
缓存穿透
描述:访问数据库不存在的数据,不存在的数据缓存中也没有,请求会直接打到DB,造成系统瘫痪。
方案:1、空值缓存 2、BloomFilter 在缓存前加一道屏障,缓存数据库存在的所有Key,不存在的Key直接返回null。 -
缓存雪崩
描述:如果缓存存储服务挂掉,所有请求会像雪崩一些狂涌到DB造成整个服务Down掉。
方案:保证存储服务的高可用(废话);采用熔断、降级、限流三个方面降低损失。具体实现 —— Hystrix ,预设置一个请求失败率,当某一服务失败率达到预设置的值,将该服务的请求拒绝(熔断);过一段时间,放开一部分请求(限流),重新统计失败率;将拒绝的请求返回预定义的返回值(降级)。 -
缓存击穿
描述:又叫热点数据集中失效。一般情况下会对缓存的数据加一个过期时间,数据过期之后重新更新缓存数据。当缓存数据失效的时间,有大量请求失效数据。
方案:使用互斥锁,缓存失效时,会向数据库重新读取数据,这时将这条数据上锁,当请求读完数据库更新过缓存后释放,期间所有请求该数据的线程同步等待。避免集中失效可以设置随机过期时间。 -
缓存一致性
描述:现象是数据库数据和缓存数据不一致 缓存一致性场景分析
方案: 自己实现方案思路:
- 先更新数据库,后删除缓存。
1、更新数据库
2、通过拦截器或者订阅binlog来删除缓存
3、删除失败通过MQ或者retry重试
- 先删缓存,后更新数据库
具体方案要结合业务,后失败哪个对业务影响小选择哪种方案。
网友评论