双缓存机制的简单应用

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 "";
    }
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值