基於jedis 2.2.0-SNAPSHOT redis
首先是對輸入輸出Stream進行了包裝生成出兩個類redis.clients.util.RedisOutputStream 和 redis.clients.util.RedisInputStream。這兩個類極大的簡化了IO操做的操做。
redis.clients.util.RedisInputStream
根據redis協議的特色提供了
1. 按位讀 public byte readByte()
2. 按行讀 public String readLine()
3. 按偏移量讀 public int read(byte[] b, int off, int len)
以上操做基本知足了對流的解析工做。
redis.clients.util.RedisOutputStream
根據redis協議的特色提供了
1. 將一個整型轉化爲對應的ascii流輸出,並加入換行回車。其實對應的就是按行寫入 public void writeIntCrLf(int value)
2. 寫入一位 public void write(final byte b)
3. 寫入一個數組 public void write(final byte[] b)
4. 按照偏移量寫入 public void write(final byte b[], final int off, final int len)
5. 寫入換行和回車,即一行結束,要與上面的命令結合起來就無敵了。public void writeCrLf()
針對Redis的協議有一個通用的工具類
redis.clients.jedis.Protocol,包括髮送命令的方法,和接受命令的方法。
最基礎的客戶端 redis.clients.jedis.Connection
一個Connection已經就是一個最最基礎的客戶端,包括三個基本元素,一個Socket, 和一個RedisOutputStream和一個RedisInputStream。
其中Socket主要與服務端創建真正的網絡連接,得到InputStream和OutputStream
RedisOutputStream和RedisInputStream主要對InputStream和OutputStream進行包裝,提供基本的讀寫操做。
另外增長各類協議層次的發送命令和收取結果的方法,都是經過Protocol類的操做RedisOutputStream和RedisInputStream完成的。 數組
最基本的客戶端Connection 要發送什麼命令給服務器,還須要本身根據枚舉類型本身傳遞,天然想到能夠把自定義封裝成方法,而且增長了對byte數組形式的支持,從而出現瞭如下命令。
Connection ---- BinaryClient ---- Client
最基本的客戶端 二進制版 普通字符串版
基本可用的客戶端有了,又在這個基礎上造成了最經常使用的類BinaryJedis 和 Jedis。
可是一個客戶端是單線程,當Jedis被不少實例調用時天然就不夠用,此時就須要考慮使用池子。Jedis這裏使用Apache 的Pool。實現起來也是很簡單。其內部就是 GenericObjectPool 對象,將jedis保存在其中。另外就是須要有個Factory來生成Jedis對象。這個Factory是JedisPoll類的一個內部類JedisFactory繼承自BasePoolableObjectFactory。重寫了makeObject(),destroyObject(final Object obj),validateObject(final Object obj)三個方法。 服務器