1、缓存穿透: 要重视,尤其是@Cacheable、返回值可能为null的场景下
import org.springframework.cache.interceptor.CacheAspectSupport; import org.springframework.cache.interceptor.CacheOperationInvoker; import java.io.Serializable; import java.lang.reflect.Method; import java.util.NoSuchElementException; import java.util.Objects; import java.util.Optional; public final class OptionalWrapUtilimplements Serializable { private static final long serialVersionUID = 1L; private static final OptionalWrapUtil> EMPTY = new OptionalWrapUtil<>(); private final T value; private OptionalWrapUtil() { this.value = null; } private OptionalWrapUtil(T value) { this.value = Objects.requireNonNull(value); } public static OptionalWrapUtil empty() { @SuppressWarnings("unchecked") OptionalWrapUtil t = (OptionalWrapUtil ) EMPTY; return t; } public static OptionalWrapUtil of(T value) { return new OptionalWrapUtil<>(value); } public static OptionalWrapUtil ofNullable(T value) { return value == null ? empty() : of(value); } public T get() { if (value == null) { throw new NoSuchElementException("No value present"); } return value; } public boolean isPresent() { return value != null; } public T orElse(T other) { return value != null ? value : other; } }
2、缓存异步set: 遇到这样一种场景,缓存未命中而去查库,然后将查出来的对象set进缓存里,后续代码又对该对象进行了修改,发现缓存中存储的是修改后的值,从而导致逻辑错乱
典型场景: 数据库存储的HTTP链接是相对链接(不带域名),因此返回给前端时需要拼接域名,这时候如果在持久层加缓存,那么业务逻辑层的"域名拼接",便有可能影响到缓存,从而导致链接返回给前段时,拼接了两个域名:https://domain/https://domain/relative_url
异步set: 例如Spring的RedisTemplate
3、缓存的:



