最近在開發(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)注知乎專欄【碼洞】