在系统架构中,为了提升系统的性能或者响应的时效性,会将需要的数据提前加载至内存中,或者从远端的数据库加载至本地系统中。这些数据包含业务需要的热点数据(如个人爱好等)、不易修改数据(流处理数据时,需要的全网数据)、计算结果(可以重复使用到的计算结果或者中间数据)等。
一、数据如何分类
在当今的业务系统,每天都有海量的数据生成,市场上也陆续出了很多的数据处理组件。有做数据缓存的组件,例如Redis、EhCache、Mongodb、MemCached等组件。也有做数据分析的组件,例如ES、HBase、Hive、S3等。
选择需要使用的组件时,需要多方向多角度综合去考虑,下面是常规的一些考虑角度。
- 数据量。
数据最多会占多大的存储空间。并发时最大的数据访问量。
- 访问频率。
数据的访问频率也是很重要的一个角度,根据紧要程度可以把数据放入不同的组件中,或者加载到不同位置上。
- 更新频率。
- 业务属性。
- 存储周期。
二、常用的组件
1、Redis
主要是热点数据的缓存。
2、Ehcache
主要是做些数据量比较大,大量数据更新频率低。
3、Spring Data
4、Mangodb
5、Memcached
三、缓存问题
1、缓存穿透
缓存穿透是指查询一个一定不存在的数据。高流量时导致DB崩溃。
解决方案:
- 采用布隆过滤器。
- 缓存查询为空的数据,过期时间放短。
2、缓存雪崩
缓存大面积同时失效或者过期叫缓存雪崩。
解决方案:
- 在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。
- 可以通过缓存reload机制,预先去更新缓存。
- 不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。
- 做二级缓存,或者双缓存策略。
3、缓存击穿
缓存高并发访问同一个Key(key过期)导致缓存失效叫缓存击穿。
解决方案:
- 后台刷新。
- 检查更新。
- 分级缓存,两级缓存失效时间不一致,缓存更新时,需要加锁。缺点是浪费空间。
- 加锁。
四、布隆过滤器
应用场景: