Share的应用:
https://blog.csdn.net/qq_37148232/article/details/138655980?spm=1001.2014.3001.5501
// 如果单个接口的数据达到几行几千行。那么单个接口如里循环访问redis还不如在代码循环外查出缓存目标,再循环设置。为了解决这一弊端,使用了Share双缓存机制,使用可以直接在循环内调用静态方法,还可以解决空值反复调用问题,代码如下:
如下图:循环构建Vo对象会有性能问题,获取Name方法大量重复访问redis。页类似方法使用范围太广,不能可一处处去修改。
public ChooseUserVo(User user) {
this.id = user.getId();
this.officeName = ZYNameCacheUser.OFFICE.getName(this.officeId);
this.areaName = NameCacheArea.AREA.getName(this.areaId);
}
双缓存解决办法:
public static String getName(String key, String prefix, Function<String, String> nameFunction) {
if (ZYStrUtils.isAnyNull(key, support)) {
return "";
}
String hashKey = toHashKey(prefix);
// 先从Share中找(同一个request生命周期内共享对象)
String shareKey = hashKey + key;
String shareName = Share.get(shareKey, String.class);
if (null != shareName) {
return shareName;
}
// 再从redis找
Object value = redisTemplate.opsForHash().get(hashKey, key);
if (ZYStrUtils.isNotNull(value)) {
// 存Share
Share.set(shareKey, value);
return String.valueOf(value);
}
// 最后从数据库找
String name = nameFunction.apply(key);
if (ZYStrUtils.isNotNull(name)) {
// 存Share
Share.set(shareKey, name);
// 存redis
redisTemplate.opsForHash().put(hashKey, key, name);
return name;
}
Share.set(shareKey, "");
return "";
}