轉自: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++);
}
}
|
參考文章: