mirror of
https://gitee.com/san-bing/JChargePointProtocol
synced 2026-05-06 02:49:57 +08:00
87 lines
2.9 KiB
Java
87 lines
2.9 KiB
Java
|
|
/**
|
|||
|
|
* 抖音关注:程序员三丙
|
|||
|
|
* 知识星球:https://t.zsxq.com/j9b21
|
|||
|
|
*/
|
|||
|
|
package sanbing.jcpp.infrastructure.cache;
|
|||
|
|
|
|||
|
|
import java.io.Serializable;
|
|||
|
|
import java.util.Collection;
|
|||
|
|
import java.util.List;
|
|||
|
|
import java.util.function.Function;
|
|||
|
|
import java.util.function.Supplier;
|
|||
|
|
|
|||
|
|
public interface TransactionalCache<K extends Serializable, V extends Serializable> {
|
|||
|
|
|
|||
|
|
String getCacheName();
|
|||
|
|
|
|||
|
|
CacheValueWrapper<V> get(K key);
|
|||
|
|
|
|||
|
|
void put(K key, V value);
|
|||
|
|
|
|||
|
|
void putIfAbsent(K key, V value);
|
|||
|
|
|
|||
|
|
void evict(K key);
|
|||
|
|
|
|||
|
|
void evict(Collection<K> keys);
|
|||
|
|
|
|||
|
|
void evictOrPut(K key, V value);
|
|||
|
|
|
|||
|
|
CacheTransaction<K, V> newTransactionForKey(K key);
|
|||
|
|
|
|||
|
|
|
|||
|
|
CacheTransaction<K, V> newTransactionForKeys(List<K> keys);
|
|||
|
|
|
|||
|
|
default V getOrFetchFromDB(K key, Supplier<V> dbCall, boolean cacheNullValue, boolean putToCache) {
|
|||
|
|
if (putToCache) {
|
|||
|
|
return getAndPutInTransaction(key, dbCall, cacheNullValue);
|
|||
|
|
} else {
|
|||
|
|
CacheValueWrapper<V> cacheValueWrapper = get(key);
|
|||
|
|
if (cacheValueWrapper != null) {
|
|||
|
|
return cacheValueWrapper.get();
|
|||
|
|
}
|
|||
|
|
return dbCall.get();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
default V getAndPutInTransaction(K key, Supplier<V> dbCall, boolean cacheNullValue) {
|
|||
|
|
return getAndPutInTransaction(key, dbCall, Function.identity(), Function.identity(), cacheNullValue);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
default <R> R getAndPutInTransaction(K key, Supplier<R> dbCall, Function<V, R> cacheValueToResult, Function<R, V> dbValueToCacheValue, boolean cacheNullValue) {
|
|||
|
|
CacheValueWrapper<V> cacheValueWrapper = get(key);
|
|||
|
|
if (cacheValueWrapper != null) {
|
|||
|
|
V cacheValue = cacheValueWrapper.get();
|
|||
|
|
return cacheValue != null ? cacheValueToResult.apply(cacheValue) : null;
|
|||
|
|
}
|
|||
|
|
var cacheTransaction = newTransactionForKey(key);
|
|||
|
|
try {
|
|||
|
|
R dbValue = dbCall.get();
|
|||
|
|
if (dbValue != null || cacheNullValue) {
|
|||
|
|
cacheTransaction.put(key, dbValueToCacheValue.apply(dbValue));
|
|||
|
|
cacheTransaction.commit();
|
|||
|
|
return dbValue;
|
|||
|
|
} else {
|
|||
|
|
cacheTransaction.rollback();
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
} catch (Throwable e) {
|
|||
|
|
cacheTransaction.rollback();
|
|||
|
|
throw e;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
default <R> R getOrFetchFromDB(K key, Supplier<R> dbCall, Function<V, R> cacheValueToResult, Function<R, V> dbValueToCacheValue, boolean cacheNullValue, boolean putToCache) {
|
|||
|
|
if (putToCache) {
|
|||
|
|
return getAndPutInTransaction(key, dbCall, cacheValueToResult, dbValueToCacheValue, cacheNullValue);
|
|||
|
|
} else {
|
|||
|
|
CacheValueWrapper<V> cacheValueWrapper = get(key);
|
|||
|
|
if (cacheValueWrapper != null) {
|
|||
|
|
var cacheValue = cacheValueWrapper.get();
|
|||
|
|
return cacheValue == null ? null : cacheValueToResult.apply(cacheValue);
|
|||
|
|
}
|
|||
|
|
return dbCall.get();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|