# 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()); } }
Copied!
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()); } }
Copied!
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