2019-12-31
为什么要进行数据缓存?
进行数据缓存的主要目的就是为了减小对数据库的访问压力,提升查询效率。
什么样的数据适合缓存?

数据访问频率高,以读为主,并且一致性要求低的数据适合做数据缓存。
缓存穿透
请求访问了一个数据库中不存在的数据,而由于数据库中不存在该数据,所以导致也无法对该数据进行缓存,所有后续的对该数据的请求都无法使用缓存而是直接访问数据库,这种现象就是缓存穿透。缓存穿透容易被用来进行恶意攻击。
解决方案:
1.采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。
2.短时间缓存该key数据,给该key一个null值或空值。
缓存雪崩
在某一时刻,缓存中出现大量的缓存数据到期失效,而此时又恰有大量的请求访问到来,请求都被转发到了数据库。
解决方案:
避免使用同一过期时间设置缓存失效时间,可以给过期时间加上一个随机数来分散失效时间。
缓存击穿
对于某一个缓存key的数据,在某一时刻该数据失效,而恰好此时有大量访问该数据的请求,引发了大量的回查数据库的请求,导致了数据库查询的压力。
解决方案:
- 在回查数据库的方法中使用同步锁或互斥锁(分布式),保证同一时刻只有一个回查数据库的请求。
- 使key永不过期。然后在后台启用刷新补偿机制。
- 采用分级缓存。一级缓存失效时一个线程加锁去查询数据然后更新一级和二级缓存,其它线程直接使用二级缓存数据,这种方式需要业务能够容忍数据短时间不一致。
网友评论