項目中有些使用的redis存儲,當對redis進行rehash的時候感受是比較麻煩的。因而寫了個簡單的讀取redis到數據庫的關鍵方法。僅供參考。html
?java
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
package
com.redis.web;
import
java.util.Date;
import
java.util.Iterator;
import
java.util.Set;
import
redis.clients.jedis.Jedis;
import
com.redis.entity.RedisTable;
public
class
RedisPersistence {
/**
* 存儲全部的redis對象方法
*/
public
static
void
saveAllRedis(
final
String redisIp,
final
int
redisPort,
final
String appCode) {
Jedis redis =
new
Jedis(redisIp, redisPort);
// 鏈接redis
// redis.auth("redis");//驗證密碼
// KEY操做
Set keys = redis.keys(
"*"
);
// 列出全部的key,查找特定的key如:redis.keys("foo")
Iterator t1 = keys.iterator();
while
(t1.hasNext()) {
Object obj1 = t1.next();
saveRedisObject(redis, obj1 +
""
, redisIp, redisPort +
""
, appCode);
}
}
/**
* 存儲單個對象
* @param redis
* @param redisKey
* @param macIp
* @param port
* @param appCode
*/
private
static
void
saveRedisObject(
final
Jedis redis,
final
String redisKey,
final
String macIp,
final
String port,
final
String appCode) {
String redisType = redis.type(redisKey);
RedisTable redisTable =
new
RedisTable();
redisTable.setAppCode(appCode);
redisTable.setCreateTime(
new
Date());
redisTable.setMacIp(macIp);
redisTable.setPort(port);
redisTable.setRedisKey(redisKey);
redisTable.setRedisType(redisType);
redisTable.setRemark(
""
);
redisTable.setUpdateTime(
new
Date());
//set集合
if
(
"set"
.equalsIgnoreCase(redisType)){
Set<string> setStrings = redis.smembers(redisKey);
//獲取key的全部set集合
if
(
null
!= setStrings && !setStrings.isEmpty()){
Iterator setIterator = setStrings.iterator() ;
while
(setIterator.hasNext()){
Object obj1 = setIterator.next();
redisTable.setRedisValue(obj1+
""
);
printRedis(redisTable);
//保存每個set記錄
}
}
//hash集合
}
else
if
(
"hash"
.equalsIgnoreCase(redisType)){
Set<string> hashSets = redis.hkeys(redisKey);
if
(
null
!= hashSets && !hashSets.isEmpty()){
Iterator setIterator = hashSets.iterator() ;
while
(setIterator.hasNext()){
String objectName = setIterator.next()+
""
;
redisTable.setObjectName(objectName);
redisTable.setRedisValue(redis.hget(redisKey, objectName));
printRedis(redisTable);
//保存每個set記錄
}
}
//list集合
}
else
if
(
"list"
.equalsIgnoreCase(redisType)){
Long listLen = redis.llen(redisKey);
for
(Long i = 0L; i < listLen; i++) {
redisTable.setRedisValue(redis.lindex(redisKey, i));
printRedis(redisTable);
}
//sortedset集合
}
else
if
(
"sortedset"
.equalsIgnoreCase(redisType)){
// Long redisLenth = redis.zcard(redisKey);
Set<string> sortedsets = redis.zrange(redisKey,
0
, -
1
);
if
(
null
!= sortedsets && !sortedsets.isEmpty()){
Iterator setIterator = sortedsets.iterator() ;
while
(setIterator.hasNext()){
String sortedMember = setIterator.next() +
""
;
redisTable.setRedisValue(sortedMember);
redisTable.setScore(
""
+redis.zscore(redisKey, sortedMember));
printRedis(redisTable);
//保存每個sortedset記錄
}
}
//string集合
}
else
if
(
"string"
.equalsIgnoreCase(redisType)){
redisTable.setRedisValue(redis.get(redisKey));
printRedis(redisTable);
//保存記錄
}
else
{
System.out.println(
"UnknowRedisType-----redisType: "
+redisType+
" objValue: "
+redis.get(redisKey));
}
}
//打印輸出
public
static
void
printRedis (RedisTable redisTable) {
System.out.println(
"redisType:"
+redisTable.getRedisType()
+
" redisKey:"
+redisTable.getRedisKey()
+
" ObjectName:"
+redisTable.getObjectName()
+
" redisValue:"
+redisTable.getRedisValue()
+
" redisScore:"
+redisTable.getScore()
);
}
public
static
void
main(String[] args) {
String redisIp =
"127.0.0.1"
;
//redis的IP地址
int
redisPort =
6379
;
//redis的端口號
String appCode =
"FUYOU"
;
//根據不一樣的應用區分的appcode
saveAllRedis(redisIp,redisPort,appCode);
}
}
</string></string></string>
|
其中的appCode是不須要的,這裏只是爲了針對於不一樣的應用,可使用同一個redis進行持久化備份而已(經過appcode來區分)。web
其中使用的RedisTable實例以下:redis
?數據庫
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
package
com.redis.entity;
import
java.util.Date;
public
class
RedisTable {
private
Long redisId;
//保存redis的主鍵ID
private
String redisType;
//redis的類型如:set/list/hash/sortedset/string
private
String redisKey;
//保存redis時使用的key
private
String objectName;
//此屬性主要用於hash數據結構時,保存member的
private
String redisValue;
//存儲的redis的值
private
String keyToken;
//保存Token時,爲區分拼接的字符串
private
String score;
//此屬性爲sortedset數據結構時,保存的score值
private
Date createTime;
//建立時間
private
Date updateTime;
//更新時間
private
String macIp;
//redis的IP地址 固然此處也能夠存儲mac地址
private
String port;
//redis使用的端口號
private
String appCode;
//應用區分碼
private
String remark;
//備註
private
String isModify;
//是否修改。此屬性能夠用於增量備份時,即在每一個redis存儲時能夠更具key多存儲一個屬性isModify。 若是有修改,則置爲 Y,不然爲N.
///////////////////////此處省略 setter and getter 方法////////////////////////
}
|
以上方法能夠擴充用於redis備份中心。數據結構
在使用redis增量備份時,請根據rediskey在數據塊中查找是否存在。根據更新值返回的0或者是1,進行更新或者新增的操做。app
固然數據庫的表結構目前只是一張表,若是數據量很大的狀況下,能夠將端口、IP、appCode信息存儲到單獨的一張表,減小數據冗餘。優化
以上的時間複雜度以及效率上並無優化。若是要求比較高,請自行優化。spa
但願各位大俠給出建議,共同進步!code