自建营销型企业网站,注册公司网站多少钱,网站类型的销售,高德地图怎么看实况街景一、引入 在我们的正常项目开发过程中#xff0c;我们会通过Redis缓存数据#xff0c;来帮我们进行异步任务#xff0c;分担外部的请求压力 但是Redis缓存也有一定的限制#xff0c;因为我们在向请求过来时#xff0c;Redis客户端都要向服务端发送一次请求#xff0c;相应… 一、引入 在我们的正常项目开发过程中我们会通过Redis缓存数据来帮我们进行异步任务分担外部的请求压力 但是Redis缓存也有一定的限制因为我们在向请求过来时Redis客户端都要向服务端发送一次请求相应的Redis就必须执行一次命令并返回数据给客户端 在这之中每一次请求都会走一次网络都会产生一次网络IO同样的也就会造成一定程度上的延迟在低并发时影响并不大但是在高并发情况下就会对Redis的服务端产生巨大的压力。 二、管道 对于管道介绍大家可以看这篇文章 介绍的很详细了 Redis精通系列——Pipeline管道 三、实战 在v1版本中的列车搜索中 使用循环的方式 去获取Redis中缓存 每次的网络请求极大的消耗性能 // 单独获取列车价格信息
ListString trainStationPriceKeys seatResults.stream().map(each - String.format(cacheRedisPrefix TRAIN_STATION_PRICE, each.getTrainId(), each.getDeparture(), each.getArrival())).toList();
ListObject trainStationPriceObjs stringRedisTemplate.opsForValue().multiGet(trainStationPriceKeys);// 单独获取列车余票信息
ListString trainStationRemainingKeyList new ArrayList();
for (Object each : trainStationPriceObjs) {ListTrainStationPriceDO trainStationPriceList JSON.parseArray(each.toString(), TrainStationPriceDO.class);// ...for (TrainStationPriceDO item : trainStationPriceList) {String trainStationRemainingKey cacheRedisPrefix TRAIN_STATION_REMAINING_TICKET StrUtil.join(_, item.getTrainId(), item.getDeparture(), item.getArrival());trainStationRemainingKeyList.add(trainStationRemainingKey);}
}// 单独获取列车余票信息
ListObject TrainStationRemainingObjs new ArrayList();
for (int i 0; i trainStationRemainingKeyList.size(); i) {TrainStationPriceDO trainStationPriceDO trainStationPriceDOList.get(i);Object obj stringRedisTemplate.opsForHash().get(trainStationRemainingKeyList.get(i), trainStationPriceDO.getSeatType().toString());TrainStationRemainingObjs.add(obj);
}v2版本中stringRedisTemplate.executePipelined 方法用于创建Redis管道在管道中执行一系列Redis操作例如get和hGet操作。这些操作会一次性发送到Redis服务器并在一次网络通信中获取多个结果从而提高了效率。 // 创建管道
ListObject trainStationPriceObjs stringRedisTemplate.executePipelined((RedisCallbackString) connection - {trainStationPriceKeys.forEach(each - connection.stringCommands().get(each.getBytes()));return null;
});// 其他逻辑...// 创建管道
ListObject TrainStationRemainingObjs stringRedisTemplate.executePipelined((RedisCallbackString) connection - {for (int i 0; i trainStationRemainingKeyList.size(); i) {connection.hashCommands().hGet(trainStationRemainingKeyList.get(i).getBytes(), trainStationPriceDOList.get(i).getSeatType().toString().getBytes());}return null;
});