Java實現Redis持久化到數據庫的關鍵方法

項目中有些使用的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

相關文章
相關標籤/搜索