Redis中Pipeline的使用
寫在前面: 我們通常是通過使用RedisTemplate每次執(zhí)行一個命令,這在命令不多的情況下是可以接收的,當(dāng)我們需要執(zhí)行大量的命令時,如果一條一條的執(zhí)行,就會因?yàn)橥ㄐ糯螖?shù)的增加而產(chǎn)生延遲。因此,Redis也引入了pipeline的機(jī)制來提升性能,我們可以通過pipeline將所有需要執(zhí)行的命令,一次性的提交給Redis的服務(wù)端,然后挨個執(zhí)行,這樣就會大大的減少通信次數(shù),從而提升性能。當(dāng)然了,需要注意的是:輸入的所有命令中:一個命令的執(zhí)行結(jié)果不影響另一個命令的輸入
1、兩種調(diào)用方式
在Spring環(huán)境下,使用Redis的Pipeline也是很簡單的:只需要調(diào)用redisTemplate的executePipelined方法就可以了,但是在參數(shù)中提供了兩種回調(diào)方式: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異常}});區(qū)別:
SessionCallback封裝的更好一點(diǎn),對程序員直接調(diào)用比較友好;RedisCallback相對而言更加的底層一點(diǎn),對程序員不是很友好;開發(fā)中是推薦使用前者的,即SessionCallback。
2、注意點(diǎn)
需要切記的是回調(diào)中的返回值必須是null才可以,否則會拋出InvalidDataAccessApiUsageException異常,相關(guān)源碼如下:
說到這里,那就有人問了,我需要獲取命令返回的值怎么辦呢?不得不說這是一個好問題,大家注意下,這個回調(diào)的返回值是一個List集合,我們在回調(diào)里操作的命令的返回值都依次的被收集到了這個集合中反悔了,我們需要哪個命令的返回值,直接在List中拿就可以了,比如例子二中我們需要獲取第二條命令返回的Set集合,我們只需要 **(Set)list.get(1)**即可
總結(jié)
以上是生活随笔為你收集整理的Redis中Pipeline的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: topcoder srm 305 div
- 下一篇: redis数据库实例