怎么把自己做的網(wǎng)站百度競(jìng)價(jià)推廣開戶內(nèi)容
一、引入
????????在我們的正常項(xiàng)目開發(fā)過(guò)程中,我們會(huì)通過(guò)Redis緩存數(shù)據(jù),來(lái)幫我們進(jìn)行異步任務(wù),分擔(dān)外部的請(qǐng)求壓力
????????但是Redis緩存也有一定的限制,因?yàn)槲覀冊(cè)谙蛘?qǐng)求過(guò)來(lái)時(shí),Redis客戶端都要向服務(wù)端發(fā)送一次請(qǐng)求,相應(yīng)的Redis就必須執(zhí)行一次命令并返回?cái)?shù)據(jù)給客戶端
????????在這之中,每一次請(qǐng)求都會(huì)走一次網(wǎng)絡(luò),都會(huì)產(chǎn)生一次網(wǎng)絡(luò)IO,同樣的也就會(huì)造成一定程度上的延遲,在低并發(fā)時(shí),影響并不大,但是在高并發(fā)情況下,就會(huì)對(duì)Redis的服務(wù)端產(chǎn)生巨大的壓力。
二、管道
? ? ? ? ? ? ?對(duì)于管道介紹大家可以看這篇文章 介紹的很詳細(xì)了??
????????????????Redis精通系列——Pipeline(管道)
三、實(shí)戰(zhàn)
? ? ? ? ? ? 在v1版本中的列車搜索中? 使用循環(huán)的方式 去獲取Redis中緩存? 每次的網(wǎng)絡(luò)請(qǐng)求極大的消耗性能
// 單獨(dú)獲取列車價(jià)格信息
List<String> trainStationPriceKeys = seatResults.stream().map(each -> String.format(cacheRedisPrefix + TRAIN_STATION_PRICE, each.getTrainId(), each.getDeparture(), each.getArrival())).toList();
List<Object> trainStationPriceObjs = stringRedisTemplate.opsForValue().multiGet(trainStationPriceKeys);// 單獨(dú)獲取列車余票信息
List<String> trainStationRemainingKeyList = new ArrayList<>();
for (Object each : trainStationPriceObjs) {List<TrainStationPriceDO> 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);}
}// 單獨(dú)獲取列車余票信息
List<Object> 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
方法用于創(chuàng)建Redis管道,在管道中執(zhí)行一系列Redis操作,例如get
和hGet
操作。這些操作會(huì)一次性發(fā)送到Redis服務(wù)器,并在一次網(wǎng)絡(luò)通信中獲取多個(gè)結(jié)果,從而提高了效率。
// 創(chuàng)建管道
List<Object> trainStationPriceObjs = stringRedisTemplate.executePipelined((RedisCallback<String>) connection -> {trainStationPriceKeys.forEach(each -> connection.stringCommands().get(each.getBytes()));return null;
});// 其他邏輯...// 創(chuàng)建管道
List<Object> TrainStationRemainingObjs = stringRedisTemplate.executePipelined((RedisCallback<String>) connection -> {for (int i = 0; i < trainStationRemainingKeyList.size(); i++) {connection.hashCommands().hGet(trainStationRemainingKeyList.get(i).getBytes(), trainStationPriceDOList.get(i).getSeatType().toString().getBytes());}return null;
});