jedis的源碼理解-基礎篇

基於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)三個方法。 服務器

相關文章
相關標籤/搜索