[重大更新] 新增 PlusCacheWrapper装饰器 为SpringCache增加本地缓存减少redis查询提高性能(尝试性更新问题未知 请勿轻易更新尝试)
parent
25012e518e
commit
bf01d0fd49
|
|
@ -32,6 +32,11 @@
|
||||||
<groupId>com.baomidou</groupId>
|
<groupId>com.baomidou</groupId>
|
||||||
<artifactId>lock4j-redisson-spring-boot-starter</artifactId>
|
<artifactId>lock4j-redisson-spring-boot-starter</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.github.ben-manes.caffeine</groupId>
|
||||||
|
<artifactId>caffeine</artifactId>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,96 @@
|
||||||
|
package org.dromara.common.redis.manager;
|
||||||
|
|
||||||
|
import cn.hutool.core.lang.Console;
|
||||||
|
import com.github.benmanes.caffeine.cache.Caffeine;
|
||||||
|
import org.springframework.cache.Cache;
|
||||||
|
|
||||||
|
import java.util.concurrent.Callable;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cache 装饰器(用于扩展一级缓存)
|
||||||
|
*
|
||||||
|
* @author LionLi
|
||||||
|
*/
|
||||||
|
public class PlusCacheWrapper implements Cache {
|
||||||
|
|
||||||
|
private static final com.github.benmanes.caffeine.cache.Cache<Object, Object> CAFFEINE = Caffeine.newBuilder()
|
||||||
|
// 设置最后一次写入或访问后经过固定时间过期
|
||||||
|
.expireAfterWrite(30, TimeUnit.SECONDS)
|
||||||
|
// 初始的缓存空间大小
|
||||||
|
.initialCapacity(100)
|
||||||
|
// 缓存的最大条数
|
||||||
|
.maximumSize(1000)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
private final Cache cache;
|
||||||
|
|
||||||
|
public PlusCacheWrapper(Cache cache) {
|
||||||
|
this.cache = cache;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return cache.getName();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object getNativeCache() {
|
||||||
|
return cache.getNativeCache();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ValueWrapper get(Object key) {
|
||||||
|
Object o = CAFFEINE.get(key, k -> cache.get(key));
|
||||||
|
Console.log("redisson caffeine -> key: " + key + ",value:" + o);
|
||||||
|
return (ValueWrapper) o;
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public <T> T get(Object key, Class<T> type) {
|
||||||
|
Object o = CAFFEINE.get(key, k -> cache.get(key, type));
|
||||||
|
Console.log("redisson caffeine -> key: " + key + ",value:" + o);
|
||||||
|
return (T) o;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void put(Object key, Object value) {
|
||||||
|
cache.put(key, value);
|
||||||
|
CAFFEINE.put(key, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ValueWrapper putIfAbsent(Object key, Object value) {
|
||||||
|
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(key);
|
||||||
|
}
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void clear() {
|
||||||
|
cache.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean invalidate() {
|
||||||
|
return cache.invalidate();
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
@Override
|
||||||
|
public <T> T get(Object key, Callable<T> valueLoader) {
|
||||||
|
Object o = CAFFEINE.get(key, k -> cache.get(key, valueLoader));
|
||||||
|
Console.log("redisson caffeine -> key: " + key + ",value:" + o);
|
||||||
|
return (T) o;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -33,7 +33,7 @@ import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.concurrent.ConcurrentMap;
|
import java.util.concurrent.ConcurrentMap;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A {@link CacheManager} implementation
|
* A {@link org.springframework.cache.CacheManager} implementation
|
||||||
* backed by Redisson instance.
|
* backed by Redisson instance.
|
||||||
* <p>
|
* <p>
|
||||||
* 修改 RedissonSpringCacheManager 源码
|
* 修改 RedissonSpringCacheManager 源码
|
||||||
|
|
@ -156,7 +156,7 @@ public class PlusSpringCacheManager implements CacheManager {
|
||||||
private Cache createMap(String name, CacheConfig config) {
|
private Cache createMap(String name, CacheConfig config) {
|
||||||
RMap<Object, Object> map = RedisUtils.getClient().getMap(name);
|
RMap<Object, Object> map = RedisUtils.getClient().getMap(name);
|
||||||
|
|
||||||
Cache cache = new RedissonCache(map, allowNullValues);
|
Cache cache = new PlusCacheWrapper(new RedissonCache(map, allowNullValues));
|
||||||
if (transactionAware) {
|
if (transactionAware) {
|
||||||
cache = new TransactionAwareCacheDecorator(cache);
|
cache = new TransactionAwareCacheDecorator(cache);
|
||||||
}
|
}
|
||||||
|
|
@ -170,7 +170,7 @@ public class PlusSpringCacheManager implements CacheManager {
|
||||||
private Cache createMapCache(String name, CacheConfig config) {
|
private Cache createMapCache(String name, CacheConfig config) {
|
||||||
RMapCache<Object, Object> map = RedisUtils.getClient().getMapCache(name);
|
RMapCache<Object, Object> map = RedisUtils.getClient().getMapCache(name);
|
||||||
|
|
||||||
Cache cache = new RedissonCache(map, config, allowNullValues);
|
Cache cache = new PlusCacheWrapper(new RedissonCache(map, config, allowNullValues));
|
||||||
if (transactionAware) {
|
if (transactionAware) {
|
||||||
cache = new TransactionAwareCacheDecorator(cache);
|
cache = new TransactionAwareCacheDecorator(cache);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,8 @@ import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sa-Token持久层接口(使用框架自带RedisUtils实现 协议统一)
|
* Sa-Token持久层接口(使用框架自带RedisUtils实现 协议统一)
|
||||||
|
* <p>
|
||||||
|
* 采用 caffeine + redis 多级缓存 优化并发查询效率
|
||||||
*
|
*
|
||||||
* @author Lion Li
|
* @author Lion Li
|
||||||
*/
|
*/
|
||||||
|
|
@ -22,7 +24,7 @@ public class PlusSaTokenDao implements SaTokenDao {
|
||||||
|
|
||||||
private static final Cache<String, Object> CAFFEINE = Caffeine.newBuilder()
|
private static final Cache<String, Object> CAFFEINE = Caffeine.newBuilder()
|
||||||
// 设置最后一次写入或访问后经过固定时间过期
|
// 设置最后一次写入或访问后经过固定时间过期
|
||||||
.expireAfterWrite(10, TimeUnit.SECONDS)
|
.expireAfterWrite(5, TimeUnit.SECONDS)
|
||||||
// 初始的缓存空间大小
|
// 初始的缓存空间大小
|
||||||
.initialCapacity(100)
|
.initialCapacity(100)
|
||||||
// 缓存的最大条数
|
// 缓存的最大条数
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue