Redis 客戶端Jedis使用(一)

Jedis 是Redis 的Java客戶端,通過一段時間的使用,jedis基本實現redis的所有功能,並且jedis在客戶端實現redis數據分片功能,Redis本身是沒有數據分佈功能。

一、下載jedis 代碼

jedis 代碼地址:https://github.com/xetorthio/jedis

再次感受到開源的強大。呵呵,大家有時間可以看看源碼。

二、項目中如何使用Jedis使用

現在大家都喜歡用maven作爲項目管理利器,那我只說明一下Maven如何使用jedis,只需要添加以下依賴就可以。

    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>2.1.0</version>
    </dependency>

OK, 用maven管理jar包依賴真的很方便。建議大家都採用maven管理項目。

三、建立一個簡單的連接

 

public class JedisUtil {

    public static Jedis createJedis() {
        Jedis jedis = new Jedis("127.0.0.1");
        return jedis;
    }

    public static Jedis createJedis(String host, int port) {
        Jedis jedis = new Jedis(host, port);

        return jedis;
    }

    public static Jedis createJedis(String host, int port, String passwrod) {
        Jedis jedis = new Jedis(host, port);

        if (!StringUtils.isNotBlank(passwrod))
            jedis.auth(passwrod);
        
        return jedis;
    }
}
 
創建一個簡單Jedis對象就是這樣,告訴它的IP地址和端口號就可以,如果redis有密碼,那需要在建立連接時,需要調用auth方法設置密碼。
當然,簡單連接不適合真實的環境使用,需要有連接池支持 。
 

四、建立Jedis連接池

 

創建連接jedis 連接池,jedis 提供JedisPool對象,使用比較方便。jedis pool 是基於apache common pool 實現。

package cn.opensv.example.redis;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

public class JedisPoolUtils {

    private static JedisPool pool;

    /**
     * 建立連接池 真實環境,一般把配置參數缺抽取出來。
     * 
     */
    private static void createJedisPool() {

        // 建立連接池配置參數
        JedisPoolConfig config = new JedisPoolConfig();

        // 設置最大連接數
        config.setMaxActive(100);

        // 設置最大阻塞時間,記住是毫秒數milliseconds
        config.setMaxWait(1000);

        // 設置空間連接
        config.setMaxIdle(10);

        // 創建連接池
        pool = new JedisPool(config, "127.0.0.1", 6379);

    }

    /**
     * 在多線程環境同步初始化
     */
    private static synchronized void poolInit() {
        if (pool == null)
            createJedisPool();
    }

    /**
     * 獲取一個jedis 對象
     * 
     * @return
     */
    public static Jedis getJedis() {

        if (pool == null)
            poolInit();
        return pool.getResource();
    }

    /**
     * 歸還一個連接
     * 
     * @param jedis
     */
    public static void returnRes(Jedis jedis) {
        pool.returnResource(jedis);
    }

}

五、Jedis 實現分片

Jedis分片採用Hash算法和基於的Key模式匹配。Jedis定義一個Hash接口,如果覺得自帶的不爽,可以自己實現一個Hash算法。Jedis自帶的Hash的算法是MurmurHash 2.0 。

MurmurHash算法:高運算性能,低碰撞率,由Austin Appleby創建於2008年,現已應用到Hadoop、libstdc++、nginx、libmemcached等開源系統。2011年Appleby被Google僱傭,隨後Google推出其變種的CityHash算法。

官方網站:https://sites.google.com/site/murmurhash/

MurmurHash算法,自稱超級快的hash算法,是FNV的4-5倍。

 

    
    /**
     * 創建分片對象
     * @return
     */
    public static ShardedJedis createShardJedis() {
        
        //建立服務器列表
        List<JedisShardInfo> shards = new ArrayList<JedisShardInfo>();
        
        //添加第一臺服務器信息
        JedisShardInfo si = new JedisShardInfo("localhost", 6379);
        si.setPassword("123");
        shards.add(si);
        
        //添加第二臺服務器信息
        si = new JedisShardInfo("localhost", 6399);
        si.setPassword("123");
        shards.add(si);
        //建立分片連接對象
        ShardedJedis jedis = new ShardedJedis(shards);        
        
        //建立分片連接對象,並指定Hash算法
        //ShardedJedis jedis = new ShardedJedis(shards,selfHash);
        return jedis;
    }

分片也可以支持連接池,具體如下:

    private static void createPool() {
        List<JedisShardInfo> shards = new ArrayList<JedisShardInfo>();
        JedisShardInfo si = new JedisShardInfo("localhost", 6379);
        si.setPassword("123");
        shards.add(si);
        si = new JedisShardInfo("localhost", 6399);
        si.setPassword("123");
        shards.add(si);
        pool = new ShardedJedisPool(new JedisPoolConfig(), shards);
    }

其它與普通的連接池沒有區別。

除Jedis是redis的Java客戶端實現,還有其他的一些開源庫,如:Spring Redis Data ,不過功能還不夠強大。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章