? ? ? ? ?基本每个web项目都少不了缓存,通常很时候都会选择redis作缓存,或者自己用map轻松实现,但上面这两种缓存有时满足不了需求,有时觉得redis作缓存有点重,而map手功实现又太轻或功能不足时(缓存时过期实现),此时选googleCache是一个不错的选择,它不仅使用简单而且功能也丰富。
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>18.0</version>
</dependency>
? 代码实现很简单,参数根据自己的项目情况调整 如下:?
/**
* MemCacheServiceImpl用于提供内存缓存服务的实现类
* 使用Google Guava库中的CacheBuilder创建缓存对象
*/
@Service
public class MemCacheServiceImpl {
// 内存缓存对象,使用Google Guava的CacheBuilder进行配置和构建
private static Cache<String, Object> cache = CacheBuilder.newBuilder()
.initialCapacity(500) // 初始容量
.maximumSize(2000) // 最大容量,超过时按LRU(最近最少使用)算法清除缓存项
.concurrencyLevel(8) // 并发级别,用于并发访问控制
.expireAfterWrite(2, TimeUnit.MINUTES) // 写入后过期时间,单位为分钟
.build();
/**
* 将键值对存入缓存
*
* @param key 缓存键
* @param value 缓存值
*/
public void put(String key, Object value) {
cache.put(key, value);
}
/**
* 根据键获取缓存值
*
* @param key 缓存键
* @return 对应的缓存值,如果不存在则返回null
*/
public Object get(String key) {
return cache.getIfPresent(key);
}
}
? ? ? 在项目本身项目已使用redis做了全局缓存了,但redis做缓存对于小的数据量反应很快,大一点的数据会相对慢一些,如果拿来来的数据还要做处理,如还原对象,这本般也浪费时间,在这过程再加多一个内存缓存就更完美了,如以下代码:
/**
* 获取所有充电桩枪关系列表
*
* @return ChargePoleRelationGun对象列表
*/
public List<ChargePoleRelationGun> getGunList() {
// 定义缓存键
String cacheKey = "All_GNG";
List<ChargePoleRelationGun> list;
// 从缓存中获取对象
Object obj = MemCacheServiceImpl.getObj(cacheKey);
// 如果缓存中有对象并且不为空,则直接返回
if (obj != null && !(list = (List<ChargePoleRelationGun>) obj).isEmpty()) {
return list;
}
// 从Redis中获取所有符合模式的key
Set<String> keys = stringRedisTemplate.keys("t_chargePoleRelationGun:*");
// 如果Redis中没有符合模式的key,则返回空列表
if (keys.isEmpty()) {
return Collections.emptyList();
}
// 将获取的key集合转为列表,然后通过Redis模板批量获取对应的值列表
List<String> keyList = new ArrayList<>(keys);
List<String> values = stringRedisTemplate.opsForValue().multiGet(keyList);
// 初始化结果列表
list = new ArrayList<>();
// 记录开始时间,用于性能统计
long xStart = System.currentTimeMillis();
// 遍历获取的值列表,解析为ChargePoleRelationGun对象并加入结果列表
for (int i = 0; i < keyList.size(); i++) {
//String key = keyList.get(i);
String storedValue = values.get(i);
// 解析JSON字符串为ChargePoleRelationGun对象
ChargePoleRelationGun value = JSONObject.parseObject(storedValue, ChargePoleRelationGun.class);
// 如果解析成功且枪号不为空,则将对象加入结果列表
if (value != null) {
if (StringUtil.isNotNull(value.getGunNo())) {
list.add(value);
}
}
}
// 打印性能统计信息
System.out.println("time -> " + (System.currentTimeMillis() - xStart));
// 根据充电桩ID排序结果列表
list.sort(Comparator.comparing(ChargePoleRelationGun::getPoleId));
// 将结果列表放入缓存
MemCacheServiceImpl.putObj(cacheKey, list);
// 返回结果列表
return list;
}
? ? ? ? ?Guava 是一个 Google 开发的开源 Java 库,包含了大量工具类和常用功能,可以帮助开发人员提高开发效率和代码质量。Guava 的工具类可以分为以下几类:
Guava 工具类的一些常用用例:
Guava 工具类可以帮助开发人员提高开发效率和代码质量,是 Java 开发人员必备的工具。
?