package org.dromara.common.redis.manager; import org.dromara.common.core.utils.SpringUtils; import org.springframework.cache.Cache; import java.util.concurrent.Callable; /** * Cache 装饰器模式(用于扩展 Caffeine 一级缓存) * * @author LionLi */ public class CaffeineCacheDecorator implements Cache { private static final com.github.benmanes.caffeine.cache.Cache CAFFEINE = SpringUtils.getBean("caffeine"); private final String name; private final Cache cache; public CaffeineCacheDecorator(String name, Cache cache) { this.name = name; this.cache = cache; } @Override public String getName() { return name; } @Override public Object getNativeCache() { return cache.getNativeCache(); } public String getUniqueKey(Object key) { return name + ":" + key; } @Override public ValueWrapper get(Object key) { Object o = CAFFEINE.get(getUniqueKey(key), k -> cache.get(key)); return (ValueWrapper) o; } @SuppressWarnings("unchecked") public T get(Object key, Class type) { Object o = CAFFEINE.get(getUniqueKey(key), k -> cache.get(key, type)); return (T) o; } @Override public void put(Object key, Object value) { CAFFEINE.invalidate(getUniqueKey(key)); cache.put(key, value); } public ValueWrapper putIfAbsent(Object key, Object value) { CAFFEINE.invalidate(getUniqueKey(key)); return cache.putIfAbsent(key, value); } @Override public void evict(Object key) { evictIfPresent(key); } public boolean evictIfPresent(Object key) { boolean b = cache.evictIfPresent(key); if (b) { CAFFEINE.invalidate(getUniqueKey(key)); } return b; } @Override public void clear() { cache.clear(); } public boolean invalidate() { return cache.invalidate(); } @SuppressWarnings("unchecked") @Override public T get(Object key, Callable valueLoader) { Object o = CAFFEINE.get(getUniqueKey(key), k -> cache.get(key, valueLoader)); return (T) o; } }