Redis 客戶端Jedis使用(一)

Jedis 是Redis 的Java客戶端,經過一段時間的使用,jedis基本實現redis的全部功能,而且jedis在客戶端實現redis數據分片功能,Redis自己是沒有數據分佈功能。css

1、下載jedis 代碼

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

再次感覺到開源的強大。呵呵,你們有時間能夠看看源碼。nginx

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

如今你們都喜歡用maven做爲項目管理利器,那我只說明一下Maven如何使用jedis,只須要添加如下依賴就能夠。c++

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

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

3、創建一個簡單的鏈接

 

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方法設置密碼。
固然,簡單鏈接不適合真實的環境使用,須要有鏈接池支持 。
 

4、創建Jedis鏈接池

 

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

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);
    }

}

5、Jedis 實現分片

Jedis分片採用Hash算法和基於的Key模式匹配。Jedis定義一個Hash接口,若是以爲自帶的不爽,能夠本身實現一個Hash算法。Jedis自帶的Hash的算法是MurmurHash 2.0 。redis

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

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

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 ,不過功能還不夠強大。

相關文章
相關標籤/搜索