Redis集羣(八):Redis Sharding集羣

1、Redis目前的集羣方案主要有兩種:Redis Sharding和Redis Cluster
一、 Redis Sharding:3.0之前基本上使用分片實現集羣,目前主流方案,客戶端實現
二、 Redis Cluster:3.0後官方提供了集羣方案,2015年4月發佈,目前大型應用驗證較少,服務端實現
上面兩種方案的區別請見:

2、下面只說明使用Jedis實現Redis Sharding的方案
Redis Sharding特色:
  1. 客戶端實現
  2. 各個Redis節點獨立,之間無關係
  3. 某個Redis節點掛了,整個集羣不可用,因此須要對每一個節點作主從備份
  4. 主從備份方案通常經過讀寫分離設置,每一個master至少兩個slaver,只有這樣master掛掉後,才能選舉其中一個Slaver成爲新的master,原來master節點加入集羣后成爲新master的slaver節點
  5. redis主從切換對客戶端jedis使用時透明的,即redis發生了主從切換並不影響jedis的使用
缺點:
  1. 節點擴展和收縮不友好

3、Redis服務集羣的搭建
  1. Redis集羣的搭建可參考文章:搭建3個master-slaver的主從配置
    http://www.cnblogs.com/gossip/p/5992716.html
    http://www.cnblogs.com/gossip/p/5992821.html
  2. 注意:通常會搭建3個master節點,每一個master掛2個slaver,各個master之間並沒有聯繫。Redis Cluster的方案是全部master有聯繫並進行心跳通訊,和Redis Sharding不同

4、Jedis客戶端的使用
  1. 版本:2.9.0
  2. 實現代碼
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
import redis.clients.jedis.*;
import redis.clients.util.JedisClusterCRC16;
 
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
 
public class ShardingTest {
 
     private static String ip = "127.0.0.1" ;
     private static int timeout = 10000 ;
 
     public static void main(String[] args) {
         JedisPoolConfig poolConfig = getPoolConfig();
 
         List<JedisShardInfo> listRedis = getListSherdInfo();
 
         ShardedJedisPool jedisPool = new ShardedJedisPool(poolConfig, listRedis);
 
         ShardedJedis jedis = jedisPool.getResource();
 
         testData(jedis);
         //initString(jedis);
         //initHash(jedis);                    //17秒
         //initHashPipeline(jedis);              //0秒(是的,0秒)
         System.out.println(jedis.get( "k1" ));
         System.out.println(jedis.hgetAll( "product2" ));
         //initHashPipeline100000(jedis);    //100000 總時間  63秒
 
         jedis.close();
         jedisPool.destroy();
 
     }
 
     private static JedisPoolConfig getPoolConfig() {
         JedisPoolConfig poolConfig = new JedisPoolConfig();
         poolConfig.setMaxTotal( 200 );
         poolConfig.setMaxIdle( 30 );
 
         //就是在進行borrowObject進行處理時,對拿到的connection進行validateObject校驗
         //poolConfig.setTestOnBorrow(true);
         //就是在進行returnObject對返回的connection進行validateObject校驗,我的以爲對數據庫鏈接池的管理意義不大
         //poolConfig.setTestOnReturn(true);
         //GenericObjectPool中針對pool管理,起了一個Evict的TimerTask定時線程進行控制(可經過設置參數
         //poolConfig.setTestWhileIdle(true);
         return poolConfig;
     }
 
     private static List<JedisShardInfo> getListSherdInfo() {
         JedisShardInfo redis1 = new JedisShardInfo(ip, 9111 );
         redis1.setConnectionTimeout(timeout);
 
         JedisShardInfo redis2 = new JedisShardInfo(ip, 9112 );
         redis2.setConnectionTimeout(timeout);
 
         JedisShardInfo redis3 = new JedisShardInfo(ip, 9113 );
         redis3.setConnectionTimeout(timeout);
 
         List<JedisShardInfo> listRedis = new ArrayList<JedisShardInfo>();
         listRedis.add(redis1);
         listRedis.add(redis2);
         listRedis.add(redis3);
 
         return listRedis;
     }
 
     private static void testData(ShardedJedis jedis) {
         String key = "k5" ;
         String value = "v5" ;
         jedis.set(key, value);
 
         System.out.println( "key:" + jedis.get(key));
         System.out.println( "key:" + JedisClusterCRC16.getSlot(key));
         System.out.println(jedis.type(key));
     }
     }
相關文章
相關標籤/搜索