Redis中Pipeline的使用
寫在前面: 我們通常是通過使用RedisTemplate每次執行一個命令,這在命令不多的情況下是可以接收的,當我們需要執行大量的命令時,如果一條一條的執行,就會因為通信次數的增加而產生延遲。因此,Redis也引入了pipeline的機制來提升性能,我們可以通過pipeline將所有需要執行的命令,一次性的提交給Redis的服務端,然后挨個執行,這樣就會大大的減少通信次數,從而提升性能。當然了,需要注意的是:輸入的所有命令中:一個命令的執行結果不影響另一個命令的輸入
1、兩種調用方式
在Spring環境下,使用Redis的Pipeline也是很簡單的:只需要調用redisTemplate的executePipelined方法就可以了,但是在參數中提供了兩種回調方式:SessionCallback、RedisCallback,兩種使用方式如下:
RedisCallback:
List list = redisTemplate.executePipelined(new RedisCallback<String>() {@Overridepublic String doInRedis(RedisConnection con) throws DataAccessException {con.set("key".getBytes(StandardCharsets.UTF_8), "value".getBytes(StandardCharsets.UTF_8));con.set("key2".getBytes(StandardCharsets.UTF_8), "value2".getBytes(StandardCharsets.UTF_8));con.set("num".getBytes(StandardCharsets.UTF_8), "0".getBytes(StandardCharsets.UTF_8));con.incr("num".getBytes(StandardCharsets.UTF_8));return null; // 切記此處要返回null,否則會拋出InvalidDataAccessApiUsageException異常}});System.out.println(Arrays.toString(list.toArray())); // [true, true, true, 1]SessionCallback:
List list = redisTemplate.executePipelined(new SessionCallback<String>() {@Overridepublic String execute(RedisOperations operations) throws DataAccessException {operations.opsForZSet().intersectAndStore(firstKey, secondKey, destKey);redisTemplate.opsForZSet().reverseRange(destKey, 0, 10);return null; // 切記此處要返回null,否則會拋出InvalidDataAccessApiUsageException異常}});區別:
SessionCallback封裝的更好一點,對程序員直接調用比較友好;RedisCallback相對而言更加的底層一點,對程序員不是很友好;開發中是推薦使用前者的,即SessionCallback。
2、注意點
需要切記的是回調中的返回值必須是null才可以,否則會拋出InvalidDataAccessApiUsageException異常,相關源碼如下:
說到這里,那就有人問了,我需要獲取命令返回的值怎么辦呢?不得不說這是一個好問題,大家注意下,這個回調的返回值是一個List集合,我們在回調里操作的命令的返回值都依次的被收集到了這個集合中反悔了,我們需要哪個命令的返回值,直接在List中拿就可以了,比如例子二中我們需要獲取第二條命令返回的Set集合,我們只需要 **(Set)list.get(1)**即可
總結
以上是生活随笔為你收集整理的Redis中Pipeline的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: topcoder srm 305 div
- 下一篇: javascript学习系列(5):数组