# 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

上面是单个获取,如果商品存在的话,会调用 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