這段時間在研究Redis,作為緩存界的新寵,現在使用它的公司越來越多。本文使用的是最新穩定版Redis3.0.實現的具體邏輯是:
1. 用戶登錄首先判斷是否在redis緩存中,如果在redis緩存中,直接登錄成功;
2. 若用戶未在redis緩存,則訪問Mysql,判斷用戶是否存在,如果不存在,則提示用戶注冊;如果存在,則登錄成功;
3. 在mysql存在並登錄成功的同時,將改條數據用Redis Hash類型進行緩存,並設置過期時間為30分鍾;
4. 設置redis最大內存,若超出內存范圍,則使用FIFO方式進行清除。
本文實現方式為最簡單的模擬方式,有的代碼有進一步封裝得必要。
一、首先創建兩個類,一個類連接Mysql,一個類連接Redis,並復寫相關方法
1.mysql
1 public class Mysql { 2 3 public Connection conn; 4 5 { 6 7 try { 8 9 Class.forName("com.mysql.jdbc.Driver"); 10 11 conn=DriverManager.getConnection("jdbc:mysql://localhost/spring","root","root"); 12 13 } catch (ClassNotFoundException e) { 14 15 e.printStackTrace(); 16 17 } catch (SQLException e) { 18 19 e.printStackTrace(); 20 21 } 22 23 } 24 25 26 27 }
2.redis
1 public class Redis extends Jedis { 2 3 4 5 public Jedis redis; 6 7 { 8 9 redis = new Jedis("192.168.217.128", 6379); 10 11 redis.auth("root"); 12 13 } 14 15 16 17 // public static void main(String[] args) { 18 19 // System.out.println(redis.get("name")); 20 21 // System.out.println(redis.keys("*")); 22 23 // // redis.sinter(keys); 24 25 // } 26 27 28 29 public String get(String key) { 30 31 return redis.get("name"); 32 33 } 34 35 36 37 public String set(String key, String value) { 38 39 return redis.set(key, value); 40 41 } 42 43 44 45 public Long del(String... keys) { 46 47 return redis.del(keys); 48 49 } 50 51 52 53 // 鍵值增加字符 54 55 public Long append(String key, String str) { 56 57 return redis.append(key, str); 58 59 } 60 61 62 63 public Boolean exists(String key) { 64 65 return redis.exists(key); 66 67 } 68 69 70 71 // Need research 72 73 public Long setnx(String key, String value) { 74 75 return redis.setnx(key, value); 76 77 } 78 79 80 81 public String setex(String key, String value, int seconds) { 82 83 return redis.setex(key, seconds, value); 84 85 } 86 87 88 89 public Long setrange(String key, String str, int offset) { 90 91 return redis.setrange(key, offset, str); 92 93 } 94 95 96 97 public List<String> mget(String... keys) { 98 99 return redis.mget(keys); 100 101 } 102 103 104 105 public String mset(String... keys) { 106 107 return redis.mset(keys); 108 109 } 110 111 112 113 public Long msetnx(String... keysvalues) { 114 115 return redis.msetnx(keysvalues); 116 117 } 118 119 120 121 public String getset(String key, String value) { 122 123 return redis.getSet(key, value); 124 125 } 126 127 128 129 public String hmset(String key, Map<String, String> hash) { 130 131 return redis.hmset(key, hash); 132 133 } 134 135 136 137 public Map<String, String> hgetall(String key) { 138 139 return redis.hgetAll(key); 140 141 } 142 143 144 145 public String hget(final String key, final String field) { 146 147 return redis.hget(key, field); 148 149 } 150 151 152 153 public Long hset(final String key, final String field, final String value) { 154 155 return redis.hset(key, field, value); 156 157 } 158 159 160 161 public Long expire(final String key, final int seconds) { 162 163 return redis.expire(key, seconds); 164 165 } 166 167 168 169 public Boolean hexists(final String key, final String field) { 170 171 return redis.hexists(key, field); 172 173 } 174 175 176 177 }
3.二、邏輯具體實現:
1 public class Main { 2 3 Mysql mysql=new Mysql(); 4 5 Redis redis=new Redis(); 6 7 ResultSet rs=null; 8 9 10 11 //模擬登陸緩存 12 13 @Test 14 15 public void redisLogin() throws SQLException{ 16 17 //正常業務的ID是通過UI的request.getParamenter()獲取 18 19 String id="9028935b527d22cc01527d235aea0142"; 20 21 String sql="select * from user where id_='"+id+"'"; 22 23 String username; 24 25 if(redis.hexists("user_"+id, "username_")){ 26 27 username=redis.hget("user_"+id, "username_"); 28 29 System.out.println("Welcome Redis! User "+username+" login success"); 30 31 }else{ 32 33 rs=mysql.conn.createStatement().executeQuery(sql); 34 35 if(rs.next()==false){ 36 37 System.out.println("Mysql no register, Please register first"); 38 39 }else{ 40 41 username=rs.getString("username_"); 42 43 System.out.println("Welcome Mysql ! User "+username+" login success"); 44 45 redis.hset("user_"+id, "username_", username); 46 47 //30分鍾未操作就過期 48 49 redis.expire("user_"+id, 1800); 50 51 } 52 53 } 54 55 56 57 } 58 59 }