Redis4.0到來,Jedis不能用了咋整?

最近在開發(fā)一個使用Redis協(xié)議包裝HBase的Proxy服務(wù)器,一路寫的很順,客戶端使用redis-py提供的execute_command方法也輕松搞定。但是在編寫Java客戶端的時候卻遇到了難題,我們常用的Jedis不提供自定義指令,連反射這條路子都給堵死了,感覺陷入了僵局。難道需要自己改造Jedis的源代碼么,代價有點(diǎn)大。

轉(zhuǎn)念一想,Redis4.0插件化都出來了,有那么多的自定義指令,官方肯定有客戶端的解決方案,果然,Lettuce【萵筍】冒出來了,945個Star,看來很受歡迎。

看Lettuce項(xiàng)目介紹,它是基于Netty開發(fā)的,提供了同步異步兩種調(diào)用方法,支持Pipeline,也支持Redis Sentinel和Cluster,最重要的是它支持自定義指令。還在使用Java7以下的小伙伴們就要嘆息了,Lettuce只支持Java8+,趕快升級吧。

好,我們來試試Lettuce,看看它好不好用,首先引入依賴

再看看它的基本用法

好像和Jedis用法一樣簡單。Lettuce還支持異步用法,我們來看看異步怎么用。

使用也很簡單,異步的結(jié)果都使用RedisFuture對象進(jìn)行包裝。RedisFuture對象提供了大量的回調(diào)方法,任君選擇。注意關(guān)閉連接之前一定要等待一段時間,確保所有的指令都異步執(zhí)行完了,否則你的回調(diào)方法會統(tǒng)一收到NULL。

在使用Redis一般不會只使用一個連接的,我們一般會使用連接池。Jedis提供了內(nèi)置的JedisPool封裝,拿來即用,內(nèi)部使用的是Apache Commons提供的對象池來實(shí)現(xiàn)。Lettuce的連接池用起來也差不多。

接下來我們進(jìn)入最精彩的部分,也是Lettuce區(qū)別于Jedis最大的部分,Lettuce提供了自定義指令接口。實(shí)現(xiàn)自定義指令需要提供3個東西。

指令名稱

參數(shù)

結(jié)果解碼器

create指令的的參數(shù)是一個字符串列表,表名和列簇的字符串定義,返回結(jié)果就是一個bool值。在redis協(xié)議中,客戶端指令參數(shù)就是一個字符串列表,沒有復(fù)雜的結(jié)構(gòu),但是返回結(jié)果卻是可以任意嵌套的,可以具有無限的深度。對于大部分指令,Lettuce內(nèi)置提供的很多Output解碼器足以應(yīng)付,不能應(yīng)付的部分,Lettuce提供了擴(kuò)展的接口可以自定義。

我們看到所有的解碼器都是繼承了CommandOutput接口,當(dāng)我們想要自定義指令時,繼承這個接口就可以了,然后在子類里實(shí)現(xiàn)你想要的任意復(fù)雜的解碼邏輯。

繼續(xù)閱讀更多面試經(jīng)驗(yàn),關(guān)注知乎專欄【碼洞

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容