jedis鏈接池詳解(Redis)

轉自:http://tianxingzhe.blog.51cto.com/3390077/1684306html

原子性(atomicity):java

一個事務是一個不可分割的最小工做單位,事務中包括的諸操做要麼都作,要麼都不作。redis

Redis全部單個命令的執行都是原子性的,這與它的單線程機制有關;算法

Redis命令的原子性使得咱們不用考慮併發問題,能夠方便的利用原子性自增操做INCR實現簡單計數器功能;服務器

單機模式併發

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
package  com.ljq.utils;
import  redis.clients.jedis.Jedis;
import  redis.clients.jedis.JedisPool;
import  redis.clients.jedis.JedisPoolConfig;
/**   
  * Redis操做接口
  *
  * @author 林計欽
  * @version 1.0 2013-6-14 上午08:54:14   
  */
public  class  RedisAPI {
     private  static  JedisPool pool =  null ;
     
     /**
      * 構建redis鏈接池
     
      * @param ip
      * @param port
      * @return JedisPool
      */
     public  static  JedisPool getPool() {
         if  (pool ==  null ) {
             JedisPoolConfig config =  new  JedisPoolConfig();
             //控制一個pool可分配多少個jedis實例,經過pool.getResource()來獲取;
             //若是賦值爲-1,則表示不限制;若是pool已經分配了maxActive個jedis實例,則此時pool的狀態爲exhausted(耗盡)。
             config.setMaxActive( 500 );
             //控制一個pool最多有多少個狀態爲idle(空閒的)的jedis實例。
             config.setMaxIdle( 5 );
             //表示當borrow(引入)一個jedis實例時,最大的等待時間,若是超過等待時間,則直接拋出JedisConnectionException;
             config.setMaxWait( 1000  100 );
             //在borrow一個jedis實例時,是否提早進行validate操做;若是爲true,則獲得的jedis實例均是可用的;
             config.setTestOnBorrow( true );
             pool =  new  JedisPool(config,  "192.168.2.191" 8888 );
         }
         return  pool;
     }
     
     /**
      * 返還到鏈接池
     
      * @param pool 
      * @param redis
      */
     public  static  void  returnResource(JedisPool pool, Jedis redis) {
         if  (redis !=  null ) {
             pool.returnResourceObject(redis);
         }
     }
     
     /**
      * 獲取數據
     
      * @param key
      * @return
      */
     public  static  String get(String key){
         String value =  null ;
         
         JedisPool pool =  null ;
         Jedis jedis =  null ;
         try  {
             pool = getPool();
             jedis = pool.getResource();
             value = jedis.get(key);
         catch  (Exception e) {
             //釋放redis對象
             pool.returnBrokenResource(jedis);
             e.printStackTrace();
         finally  {
             //返還到鏈接池
             returnResource(pool, jedis);
         }
         
         return  value;
     }
}

參考文章:分佈式

http://www.cnblogs.com/linjiqin/archive/2013/06/14/3135248.htmlatom

 

分佈式模式 spa

 

ShardedJedis是基於一致性哈希算法實現的分佈式Redis集羣客戶端.net

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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package  com.jd.redis.client;
  
import  java.util.ArrayList;
import  java.util.List;
  
import  redis.clients.jedis.JedisPoolConfig;
import  redis.clients.jedis.JedisShardInfo;
import  redis.clients.jedis.ShardedJedis;
import  redis.clients.jedis.ShardedJedisPool;
import  redis.clients.util.Hashing;
import  redis.clients.util.Sharded;
  
publicclass RedisShardPoolTest {
     
static  ShardedJedisPoolpool;
     
static {
         
JedisPoolConfig config = new  JedisPoolConfig(); //Jedis池配置
         
config.setMaxActive( 500 ); //最大活動的對象個數
         
   config.setMaxIdle( 1000  60 ); //對象最大空閒時間
        
    config.setMaxWait( 1000  10 ); //獲取對象時最大等待時間
       
     config.setTestOnBorrow( true );
         
String hostA =  "10.10.224.44" ;
        
    int  portA =  6379 ;
        
    String hostB =  "10.10.224.48" ;
        
    int  portB =  6379 ;
         
List<JedisShardInfo> jdsInfoList = new  ArrayList<JedisShardInfo>( 2 );
         
JedisShardInfo infoA =  new  JedisShardInfo(hostA, portA);
         
infoA.setPassword( "redis.360buy" );
         
JedisShardInfo infoB =  new  JedisShardInfo(hostB, portB);
         
infoB.setPassword( "redis.360buy" );
         
jdsInfoList.add(infoA);
         
jdsInfoList.add(infoB);
         
         
pool = new  ShardedJedisPool(config, jdsInfoList, Hashing.MURMUR_HASH,
Sharded.DEFAULT_KEY_TAG_PATTERN);
     //傳入鏈接池配置、分佈式redis服務器主機信息、分片規則(存儲到哪臺redis服務器)
}
     
     
/**
     
  * @param args
     
  */
     
publicstaticvoid main(String[] args) {
         
for ( int  i= 0 ; i< 100 ; i++){
            String key =generateKey();
            //key += "{aaa}";
            ShardedJedis jds = null ;
            try  {
                jds =pool.getResource();
                System.out.println(key+ ":" +jds.getShard(key).getClient().getHost());
                System.out.println(jds.set(key, "1111111111111111111111111111111" ));
            } catch  (Exception e) {
                e.printStackTrace();
            }
            finally {
                pool.returnResourceObject(jds);
            }
         
}
     
}
  
     
privatestaticintindex =  1 ;
     
publicstatic String generateKey(){
         
return  String.valueOf(Thread.currentThread().getId())+ "_" +(index++);
     
}
}

參考文章:

http://blog.csdn.net/lang_man_xing/article/details/38405269

相關文章
相關標籤/搜索