1.4K Star 5K Fork 1.7K

GVP红薯/J2Cache

 / 详情

关于批量获取缓存数据的一些问题

待办的
创建于  
2023-11-20 16:38

哈喽,关于批量获取缓存数据,我看这里的逻辑是:先从1级缓存取objs,如果1级缓存中查不到的keys,再去2级缓存中取objs_level2,然后 objs 和 objs_level2 组合后返回,这里result是 Map 类型;

想问下,如果批量获取数据的返回结果,是要求有顺序的 ,例如 Jedis的mget,J2Cache是如何处理的呢?

	/**
	 * 批量读取缓存中的对象(用户无需判断返回的对象是否为空)
	 * @param region Cache region name
	 * @param keys cache keys
	 * @return cache object
	 */
	public Map<String, CacheObject> get(String region, Collection<String> keys)  {

		this.assertNotClose();

		final Map<String, Object> objs = holder.getLevel1Cache(region).get(keys);
		List<String> level2Keys = keys.stream().filter(k -> !objs.containsKey(k) || objs.get(k) == null).collect(Collectors.toList());
		Map<String, CacheObject> results = objs.entrySet().stream().filter(p -> p.getValue() != null).collect(
			Collectors.toMap(
				p -> p.getKey(),
				p -> new CacheObject(region, p.getKey(), CacheObject.LEVEL_1, p.getValue())
			)
		);

		Map<String, Object> objs_level2 = holder.getLevel2Cache(region).get(level2Keys);
		objs_level2.forEach((k,v) -> {
			results.put(k, new CacheObject(region, k, CacheObject.LEVEL_2, v));
			if (v != null)
				holder.getLevel1Cache(region).put(k, v);
		});

		return results;
	}

评论 (3)

wp973 创建了任务

比如我们使用jedis的mget方法

jedis.mget(a,b,c)

values = [v(a), v(b), v(c)]

@红薯 大佬帮忙解答一下 :grinning:

因为你传入的 keys 是有序的,你按这个顺序去结果中读取对应的值就好了哈:)

登录 后才可以发表评论

状态
负责人
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
参与者(2)
9169557 love tina 1700469945 36 ld 1578913711
Java
1
https://gitee.com/ld/J2Cache.git
git@gitee.com:ld/J2Cache.git
ld
J2Cache
J2Cache

搜索帮助

Dd8185d8 1850385 E526c682 1850385