一、為什么要使用Pipeline?
Redis是采用基於C/S模式的請求/響應協議的TCP服務器。
性能問題一:redis客戶端發送多條請求,后面的請求需要等待前面的請求處理完后,才能進行處理,而且每個請求都存在往返時間RRT(Round Trip Time),即使redis性能極高,當數據量足夠大,也會極大影響性能,還可能會引起其他意外情況。
性能問題二:性能問題一,我們可以通過scan命令來解決,如何來設置count又是一個問題,設置不好,同樣會有大量請求存在,即使設置到1w(推薦最大值),如果掃描的數據量太大,這個問題同樣不能避免。每個請求都會經歷三次握手、四次揮手,在處理大量連接時,處理完后,揮手會產生大量time-wait,如果該服務器提供其他服務,可能對其他服務造成影響。
使用Pipeline可以解決以上問題。
二、如何在使用Pipeline?
本文使用的是RedisTemplate使用Pipeline需要調用executePipelined結果,相當簡單。
代碼實例如:
wins = redisTemplate.executePipelined(new SessionCallback<Object>() {
@Override
public <K, V> Object execute(RedisOperations<K, V> redisOperations) throws DataAccessException {
for (Order order : orderList) {
String orderManagerKey = RedisCacheUtil.buildKey(DspConstants.OM_TABLE_NAME, order.getId(), DateUtils.getCurrentDate("yyyyMMdd"));
stringRedisTemplate.opsForHash().get(orderManagerKey, DspConstants.LOG_TYPE_WIN);
}
return null;
}
});