双缓存机制的简单应用

发布于:2024-05-20 ⋅ 阅读:(165) ⋅ 点赞:(0)

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 "";
    }

网站公告

今日签到

点亮在社区的每一天
去签到