Spring Cache的基本使用与分析 (2)

1、读取数据,未加锁

@Override protected Object lookup(Object key) { byte[] value = cacheWriter.get(name, createAndConvertCacheKey(key)); if (value == null) { return null; } return deserializeCacheValue(value); }

2、读取数据,加锁,这是 RedisCache 中唯一一个同步方法

@Override public synchronized <T> T get(Object key, Callable<T> valueLoader) { ValueWrapper result = get(key); if (result != null) { return (T) result.get(); } T value = valueFromLoader(key, valueLoader); put(key, value); return value; }

通过打断点的方式可以知道 RedisCache 默认调用的是 lookup(),因此不能应对缓存穿透,如果有相关需求,可以这样配置:@Cacheable(sync = true),开启同步模式,此配置只在 @Cacheable 中才有。

总结

Spring Cache 对于读模式下缓存失效的解决方案:

缓存穿透:cache-null-values: true,允许写入空值

缓存击穿:@Cacheable(sync = true),加锁

缓存雪崩:time-to-live:xxx,设置不同的过期时间

而对于写模式,Spring Cache 并没有相应处理,我们需要使用其它方式处理。

总的来说:

1、对于常规数据(读多写少,及时性、一致性要求不高的数据)完全可以使用 Spring Cache

2、对于特殊数据(比如要求高一致性)则需要特殊处理

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpyzdg.html