本文主要讲述高并发下缓存会出现的问题。
在高并发下,缓存会出现的问题有:缓存一致性、并发问题、穿透问题、缓存的雪崩问题。
缓存一致性
现象:
在使用缓存的时候,会要求缓存与数据库的一致性。
解决:在使用spring data JPA和spring data redis时,使用@Transcational
来保证数据库和redis中的数据一致。
缓存并发
现象:
在多个连接读取缓存数据时,存在若干个连接要写入到缓存。
解决:redis是单线程、原子性的,所以其每一个操作都是原子性的。而spring data中的redis是用过线程池来控制的。
缓存穿透
现象:
如果某一个key在高并发下被大量访问,但是缓存中此时没有这个值,那么就会去数据库中访问,从而导致对数据库造成重大的冲击。
解决:缓存特定的空对象,如id=null的对象为数据库中也没有的对象,而查询结果为null的对象没有缓存到redis中的对象。
缓存雪崩
现象:
- 由于缓存的原因,导致大量请求访问到后端数据库,从而造成数据库崩溃等。
- 在某个时间点,系统的缓存集中性的失效,也会导致系统崩溃。
解决:参见以上各种。而针对于缓存集中性的失效,可以采用redis的缓存失效策略LRU和LFU等。