RUOYI-geek/ruoyi-common/src/main/java/com/ruoyi/common/utils/CacheUtils.java

202 lines
6.2 KiB
Java
Raw Normal View History

package com.ruoyi.common.utils;
import java.lang.reflect.Field;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import org.ehcache.core.EhcacheBase;
import org.ehcache.impl.internal.concurrent.ConcurrentHashMap;
import org.ehcache.impl.internal.store.heap.OnHeapStore;
import org.springframework.cache.Cache;
import org.springframework.cache.CacheManager;
import org.springframework.cache.jcache.JCacheCache;
import org.springframework.cache.transaction.TransactionAwareCacheDecorator;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.lang.Nullable;
import org.springframework.util.ObjectUtils;
import com.ruoyi.common.utils.spring.SpringUtils;
public class CacheUtils {
/**
* 使用redis时对redis进行单独特殊操作需要使用
*
* @param <K>
* @param <V>
* @return
*/
public static <K, V> RedisTemplate<K, V> getRedisTemplate() {
return SpringUtils.getBean("redisTemplate");
}
/**
* 获取CacheManager
*
* @return
*/
public static CacheManager getCacheManager() {
return SpringUtils.getBean(CacheManager.class);
}
/**
* 根据cacheName从CacheManager中获取cache
*
* @param cacheName
* @return
*/
public static Cache getCache(String cacheName) {
return getCacheManager().getCache(cacheName);
}
/**
* 获取缓存的所有key值(由于springcache不支持获取所有key,只能根据cache类型来单独获取)
*
* @param cacheName
* @return
*/
@SuppressWarnings(value = { "unchecked", "rawtypes" })
public static Set<String> getkeys(String cacheName) {
Cache cache = getCacheManager().getCache(cacheName);
Set<String> keyset = new HashSet<>();
if (cache instanceof JCacheCache) {
try {
JCacheCache jehcache = (JCacheCache) cache;
// org.ehcache.jsr107.Eh107Cache 不公开
Object nativeCache = jehcache.getNativeCache();
Class<?> nativeCacheClass = nativeCache.getClass();
Field ehCacheField = nativeCacheClass.getDeclaredField("ehCache");
ehCacheField.setAccessible(true);
EhcacheBase ehcache = (EhcacheBase) ehCacheField.get(nativeCache);
Field storeField = EhcacheBase.class.getDeclaredField("store");
storeField.setAccessible(true);
OnHeapStore store = (OnHeapStore) storeField.get(ehcache);
Field mapField = OnHeapStore.class.getDeclaredField("map");
mapField.setAccessible(true);
// org.ehcache.impl.internal.store.heap.Backend 不公开
Object map = mapField.get(store);
Class<?> mapClass = map.getClass();
Field realMapField = mapClass.getDeclaredField("realMap");
realMapField.setAccessible(true);
ConcurrentHashMap<String, ?> realMap = (ConcurrentHashMap<String, ?>) realMapField.get(map);
keyset = realMap.keySet();
} catch (Exception e) {
}
} else if (cache instanceof TransactionAwareCacheDecorator) {
Set<Object> keysets = getRedisTemplate().keys(cache.getName() + "*");
for (Object s : keysets) {
keyset.add(StringUtils.replace(s.toString(), cache.getName() + ":", ""));
}
}
return keyset;
}
/**
* 根据cacheName,key缓存数据
*
* @param cacheName
* @param key
* @param value
* @param <T>
*/
public static <T> void put(String cacheName, String key, T value) {
put(cacheName, key, value, 0, null);
}
/**
* 如果没有则进行缓存,根据cacheName,key缓存数据
*
* @param cacheName
* @param key
* @param value
* @param <T>
*/
public static <T> void putIfAbsent(String cacheName, String key, T value) {
if (ObjectUtils.isEmpty(get(cacheName, key))) {
put(cacheName, key, value, 0, null);
}
}
/**
* 根据cacheName,key和缓存过期时间进行缓存数据,使用各种不同缓存可以单独进行操作
*
* @param cacheName
* @param key
* @param value
* @param timeout
* @param unit
* @param <T>
*/
public static <T> void put(String cacheName, String key, T value, long timeout, TimeUnit unit) {
Cache cache = getCacheManager().getCache(cacheName);
if (cache instanceof JCacheCache) {
JCacheCache ehcache = (JCacheCache) cache;
ehcache.put(key, value);
} else if (cache instanceof TransactionAwareCacheDecorator) {
if (timeout != 0 && unit != null) {
getRedisTemplate().opsForValue().set(cacheName + ":" + key, value, timeout, unit);
} else {
getRedisTemplate().opsForValue().set(cacheName + ":" + key, value);
}
} else {
cache.put(key, value);
}
}
/**
* 获取数据
*
* @param cacheName
* @param key
* @return
*/
public static Cache.ValueWrapper get(String cacheName, String key) {
return getCacheManager().getCache(cacheName).get(key);
}
/**
* 根据类型获取数据
*
* @param cacheName
* @param key
* @param type
* @param <T>
* @return
*/
public static <T> T get(String cacheName, String key, @Nullable Class<T> type) {
return getCacheManager().getCache(cacheName).get(key, type);
}
/**
* 移除缓存数据
*
* @param cacheName
* @param key
*/
public static void remove(String cacheName, String key) {
getCacheManager().getCache(cacheName).evict(key);
}
/**
* 如果存在则移除缓存数据
*
* @param cacheName
* @param key
* @return
*/
public static boolean removeIfPresent(String cacheName, String key) {
remove(cacheName, key);
return false;
}
/**
* 清除缓存名称为cacheName的所有缓存数据
*
* @param cacheName
*/
public static void clear(String cacheName) {
getCacheManager().getCache(cacheName).clear();
}
}