# 172. 商品详情页动态渲染系统:吞吐量优化之 redis mget 批量查询数据
优化的点也很简单,当一个操作中多次从 redis 中获取数据的时候,可以使用 mget 语法批量获取。
如下面数据聚合中的商品维度信息聚合操作
private void processProductDimDataChangeMessage(DimEvent event) {
System.out.println("商品聚合:" + event);
Long productId = event.getId();
String productKey = "product_" + productId;
String productJsonStr = redisTemplate.opsForValue().get(productKey);
if (StringUtils.isBlank(productJsonStr)) {
// 主商品数据都没有的话,就直接删除这个聚合数据
redisTemplate.delete(productKey);
} else {
JSONObject product = JSON.parseObject(productJsonStr);
String productPropertyJsonStr = redisTemplate.opsForValue().get("product_property_" + productId);
if (StringUtils.isNotBlank(productPropertyJsonStr)) {
product.put("productProperty", JSON.parseObject(productPropertyJsonStr));
}
String productSpecificationJsonStr = redisTemplate.opsForValue().get("product_specification_" + productId);
if (StringUtils.isNotBlank(productSpecificationJsonStr)) {
product.put("productSpecification", JSON.parseObject(productSpecificationJsonStr));
}
redisTemplate.opsForValue().set("dim_" + productKey, product.toJSONString());
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
上面是单个获取,如果商品存在的话,会调用 redis 3 次。使用 mget 语法优化后如下
private void processProductDimDataChangeMessageBatch(DimEvent event) {
System.out.println("商品聚合:" + event);
Long productId = event.getId();
String productKey = "product_" + productId;
String productPropertyKey = "product_property_" + productId;
String productSpecificationKey = "product_specification_" + productId;
List<String> items = redisTemplate.opsForValue().multiGet(Arrays.asList(productKey, productPropertyKey, productSpecificationKey));
String productJsonStr = items.get(0);
if (StringUtils.isBlank(productJsonStr)) {
// 主商品数据都没有的话,就直接删除这个聚合数据
redisTemplate.delete(productKey);
} else {
JSONObject product = JSON.parseObject(productJsonStr);
String productPropertyJsonStr = items.get(1);
if (StringUtils.isNotBlank(productPropertyJsonStr)) {
product.put("productProperty", JSON.parseObject(productPropertyJsonStr));
}
String productSpecificationJsonStr = items.get(2);
if (StringUtils.isNotBlank(productSpecificationJsonStr)) {
product.put("productSpecification", JSON.parseObject(productSpecificationJsonStr));
}
redisTemplate.opsForValue().set("dim_" + productKey, product.toJSONString());
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25