国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Jedis下的ShardedJedis(分布式)使用方法(一)

2019-11-14 14:58:33
字體:
來源:轉載
供稿:網友

原來項目中有用到Redis用作緩存服務,剛開始時只用一臺Redis就能夠滿足服務,隨著項目的慢慢進行,發現一臺滿足不了現有的項目需求,因為Redis操作都是原子性這樣的特性,造成有時同時讀寫緩存造成查詢效率的下降。但是由于我們現在用的還是2.X版本,還是沒有集群功能的(Redis作者在3.0版本中已經加入了集群功能), 因此只能使用2.x版本中自帶的一個叫做ShardedJedis的來實現分布式緩存。

ShardedJedis是通過一致性哈希來實現分布式緩存的,通過一定的策略把不同的key分配到不同的redis server上,達到橫向擴展的目的。那么ShardedJedis內部是怎么實現的呢,文章會慢慢講解。

 

 1.ShardedJedis使用方法

ShardedJedis的使用方法除了配置時有點區別,其他和Jedis基本類似,有一點要注意的是 ShardedJedis不支持多命令操作,像mget、mset、brpop等可以在redis命令后一次性操作多個key的命令,具體包括哪些,大家可以看Jedis下的 MultiKeyCommands 這個類,這里面就包含了所有的多命令操作。很貼心的是,Redis作者已經把這些命令從ShardedJedis過濾掉了,使用時也調用不了這些方法,大家知道下就行了。

好了,現在來看基本的使用

 

  //設置連接池的相關配置        JedisPoolConfig poolConfig = new JedisPoolConfig();        poolConfig.setMaxTotal(2);        poolConfig.setMaxIdle(1);        poolConfig.setMaxWaitMillis(2000);        poolConfig.setTestOnBorrow(false);        poolConfig.setTestOnReturn(false);        //設置Redis信息        String host = "127.0.0.1";        JedisShardInfo shardInfo1 = new JedisShardInfo(host, 6379, 500);        shardInfo1.setPassWord("test123");        JedisShardInfo shardInfo2 = new JedisShardInfo(host, 6380, 500);        shardInfo2.setPassword("test123");        JedisShardInfo shardInfo3 = new JedisShardInfo(host, 6381, 500);        shardInfo3.setPassword("test123");        //初始化ShardedJedisPool        List<JedisShardInfo> infoList = Arrays.asList(shardInfo1, shardInfo2, shardInfo3);        ShardedJedisPool jedisPool = new ShardedJedisPool(poolConfig, infoList);        //進行查詢等其他操作       ShardedJedis jedis = null;        try {            jedis = jedisPool.getResource();              jedis.set("test", "test");              jedis.set("test1", "test1");            String test = jedis.get("test");            System.out.PRintln(test);            ......        } finally {             //使用后一定關閉,還給連接池
   if(jedis!=null) {
    jedis.close();
    }
}

 

 

jedis獲取后一定要關閉,這和我們使用數據庫連接池是一樣的,放在finally塊中保證jedis的關閉.

ps:如果大家使用的jdk是1.7版本或者以上的話,可以使用1.7加入的try-with-resources語句

 

       try(ShardedJedis jedis = jedisPool.getResource()) {            jedis.set("test", "test");            jedis.set("test1", "test1");            String test = jedis.get("test");            System.out.println(test);        }

 

try-with-resources的效果和我們上面寫法是一樣的,只是jedis.close()語法它會幫我們調用,它會默認調用我們在try-with-resources語句中聲明的,實現了Closeable 接口的對象的close方法(像上面的ShardedJedis),我們經常用到的數據庫連接Connection和一些輸入輸出流都可以使用這種方法。

 

 從代碼上看,除了初始化ShardedJedisPool時需要加入多個Redis服務器信息,其他的和Jedis使用差不多。

在初始化ShardedJedisPool 時,我們還可以傳入ShardedJedis采用的hash算法,支持MURMUR_HASHmd5兩種算法,默認是使用MURMUR_HASH(可以查看redis.clients.util.Hashing 類查看相關的信息)

另外還可以傳入keyTagPattern來指定我們key的分布策略,所有能夠匹配keyTagPattern的key(通過正則匹配)將放在同一個redis里,默認的是直接使用key來進行判定。Redis自帶了一個Sharded.keyTagPattern,如下

 

Pattern DEFAULT_KEY_TAG_PATTERN = Pattern.compile("http://{(.+?)//}");

 

我們可以用下面的代碼來實際測試下

        ShardedJedis jedis = jedisPool.getResource();

jedis.set("cnblog", "cnblog"); jedis.set("redis", "redis"); jedis.set("test", "test"); jedis.set("123456", "1234567"); Client client1 = jedis.getShard("cnblog").getClient(); Client client2 = jedis.getShard("redis").getClient(); Client client3 = jedis.getShard("test").getClient(); Client client4 = jedis.getShard("123456").getClient(); ////打印key在哪個server中 System.out.println("cnblog in server:" + client1.getHost() + " and port is:" + client1.getPort()); System.out.println("redis in server:" + client2.getHost() + " and port is:" + client2.getPort()); System.out.println("test in server:" + client3.getHost() + " and port is:" + client3.getPort()); System.out.println("123456 in server:" + client4.getHost() + " and port is:" + client4.getPort());

 

 

看輸出內容:

可以看到我們保存的4個key,cnblog和redis在同一個redis server中,另外兩個分別在另外的redis server中。

ShardedJedis里面采用了一致性哈希的算法,來決定每個key的保存位置,具體是怎么樣計算的,在下一篇中會研究下Jedis源碼來看看。

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 通许县| 化隆| 和平区| 长阳| 静安区| 嘉义市| 买车| 驻马店市| 依兰县| 陆良县| 伽师县| 盈江县| 怀远县| 汨罗市| 东阿县| 牟定县| 寿宁县| 宜春市| 南安市| 隆昌县| 孟村| 嵊泗县| 泰来县| 天全县| 铅山县| 洛川县| 友谊县| 大冶市| 开封市| 武胜县| 黄龙县| 雷州市| 枝江市| 鲁山县| 抚顺县| 贺兰县| 于都县| 新化县| 堆龙德庆县| 云龙县| 陆川县|