在實際的操作中,往往會發生這樣的場景,當命令 1 在時刻 T1 發送到 Redis 服務器后,服務器就很快執行完了命令 1,而命令 2 在 T2 時刻卻沒有通過網絡送達 Redis 服務器,這樣就變成了 Redis 服務器在等待命令 2 的到來,當命令 2 送達,被執行后,而命令 3 又沒有送達 Redis,Redis 又要繼續等待,依此類推,這樣 Redis 的等待時間就會很長,很多時候在空閑的狀態,而問題出在網絡的延遲中,造成了系統瓶頸。
所以在循環大量的從redis中取數據時就會因網絡延時造成查詢時間過長。
所以決定試試pipelined批處理,經過業務測試,這種方式確實很快,速度可以提升10倍以上,這里就不寫怎么測試的了,有興趣的可以自行測試,下面寫一下如何使用:
因為我用的是springboot項目所以采用的是redisTemplate操作redis,我取的是hash值,代碼如下:
/** * 批量取hash數據 * * @param key * @param hashKeys * @param db * @return */ public List<Object> hashGetBatch(String Key, List<String> hashKeys, int db) { RedisTemplate<Serializable, Object> redisTemplate = getRedisTemplateByDb(db); List list = redisTemplate.executePipelined(new RedisCallback<String>() { @Override public String doInRedis(RedisConnection connection) throws DataAccessException { for (String hashKey : hashKeys) { connection.hGet(Key.getBytes(), hashKey.getBytes()); } return null; } }); return list; }
大家用的時候可以直接使用redisTemplate,不用傳db參數,因為我們是以前老項目,一個項目中需要操作多個db,所以自己封裝了個工具類