项目需要支持缓存,要求轻量级,个人选择相比其他缓存库(如 Ehcache, Guava Cache, Redis, Memcached 等)具有几个显著的优势,尤其是在内存效率、性能和灵活性方面
caffeine优势:
1.极致的性能和低内存开销。
2.丰富且灵活的 缓存过期和刷新策略。
3.高效的并发性能和线程安全。
4.简单易用的集成方式,尤其与 Spring 集成非常方便。
下面是个人引入的坐标;
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <dependency> <groupId>com.github.ben-manes.caffeine</groupId> <artifactId>caffeine</artifactId> <version>2.9.1</version> </dependency>
CacheConfig
@Configuration
@EnableCaching
public class CacheConfig {
@Bean
public CacheManager cacheManager() {
CaffeineCacheManager cacheManager = new CaffeineCacheManager() {
protected Cache<Object, Object> createNativeCache(String name) {
return Caffeine.newBuilder()
.expireAfterAccess(10, TimeUnit.MINUTES)// 设置缓存数据在30分钟没有访问就过期
.refreshAfterWrite(6, TimeUnit.MINUTES)// 每15分钟强制更新一次缓存
//.expireAfterWrite(10, TimeUnit.MINUTES)//缓存项在被写入后,10分钟后自动过期
.maximumSize(100)// 设置缓存的最大大小
.build(new CacheLoader<Object, Object>() {
@Override
public Object load(Object key) throws Exception {
// 这里可以加载数据,例如调用数据库或者其他服务
return null; // 返回加载的数据
}
});
}
};
//设置缓存名称,有需要可以放开注解
//cacheManager.setCacheNames(Arrays.asList("userCache", "sensorCache"));
return cacheManager;
}
}
@Cacheable 注解启用缓存。 @CachePut 强制更新缓存 @CacheEvict 清除缓存。
注解放入缓存、注解查询
//注解存入
@CachePut(value = "sensorCache", key = "'SENSOR' + #sensorInfo.mac")
@Override
public SensorInfo saveSensorInfo_annotate(SensorInfo sensorInfo) {
return sensorInfo;
}
// 使用 @Cacheable 注解,自动从缓存中获取数据
@Cacheable(value = "sensorCache", key = "'SENSOR' + #terminalCode")
@Override
public SensorInfo querySensorInfo_annotate(String terminalCode) {
// 如果缓存中没有数据,下面加查询方法
return null;
}
手动放入
#更新版
//手动添加
@Override
public void saveSensorInfo(SensorInfo sensorInfo) {
cacheManager.getCache("sensorCache").put("SENSOR" + sensorInfo.getMac(), sensorInfo);
}
//手动查询
@Override
public SensorInfo querySensorInfo(String terminalCode) {
Cache<String, SensorInfo> cache = (Cache<String, SensorInfo>) cacheManager.getCache("sensorCache").getNativeCache();
// 使用 Caffeine 缓存的 getIfPresent 方法获取缓存
SensorInfo sensorInfo = cache.getIfPresent("SENSOR" + terminalCode);
if (sensorInfo != null) {
return sensorInfo;
} else {
return null;
}
}
#原版
String cacheKey = companyCode + "-" + deptId;
// 从缓存中获取数据
List<SuitBorrowCountConfigDTO> cachedResult = (List<SuitBorrowCountConfigDTO>) cacheManager.getCache("borrowConfigCache").get(cacheKey);
if (cachedResult != null) {
return cachedResult; // 如果缓存中存在数据,直接返回
}
// 将结果放入缓存
cacheManager.getCache("borrowConfigCache").put(cacheKey, dtos);
查看缓存项
@Autowired
private CacheManager cacheManager;
public void printJCache() {
Iterable<String> cacheNames = cacheManager.getCacheNames();
for (String cacheName : cacheNames) {
Cache cache = cacheManager.getCache(cacheName);
System.out.println("Cache Name: " + cacheName);
// 打印缓存内容
System.out.println("Cache Contents: " + cache);
}
}
查看缓存项---对象值
public class CaffeineCacheController {
@Autowired
private CacheManager cacheManager;
@GetMapping
public void printJCache() {
Iterable<String> cacheNames = cacheManager.getCacheNames();
for (String cacheName : cacheNames) {
Cache cache = cacheManager.getCache(cacheName);
System.out.println("Cache Name: " + cacheName);
// 获取缓存中的某个对象,假设你知道 key
String cacheKey = "SENSOR04EEE810090B"; // 根据需要的 key 修改
// 获取缓存内容
SensorInfo sensorInfo = (SensorInfo) cache.get(cacheKey).get();
if (sensorInfo != null) {
// 如果缓存中有数据,打印出其详细信息
System.out.println("Cache Contents for " + cacheKey + ": " + sensorInfo);
} else {
System.out.println("Cache does not contain data for key: " + cacheKey);
}
}
}
}