一,redis安裝
首先我們需要下載Windows版本的redis壓縮包地址如下:
https://github.com/MicrosoftArchive/redis/releases
連接打開后如下圖所示
我們選擇64位的壓縮包,下載后需要解壓,我們解壓至D盤,如下圖所示:
接下來我們需要執行一些安裝命令
1,在如上圖的目錄中,直接鍵入“cmd“
2,在打開的cmd命令窗口中輸入 “redis-server.exe redis.windows.conf” 用於啟動redis服務
(注意采用這個命令相當於啟動一個臨時服務,如果當前窗口被關閉,則服務也會被關閉)
3,我們再打開一個同樣的cmd命令窗口,在其中鍵入 “redis-cli” ,這個命令的作用是啟動一個redis客戶端。客戶端默認的端口號是6379 如果我們要修改端口號,需要打開我們前面執行的命令中的conf文件redis.windows.conf 找到port 修改其后的端口號
4,在啟動的客戶端中檢查redis服務是否正常,我們可以進行數據的設置和讀取等操作,比如我們可以執行一個命令 “set redis jj”,然后我們再執行一個命令“get redis” 就可以將前面設置的123 查詢出來 ,如下圖所示
5,將redis服務注冊到我們的Windows,我們繼續新打開一個cmd窗口,執行命令 “redis-server --service-install redis.windows.conf” 這個時候呢,提示:Redis successfully installed as a service. 表示加入服務成功!
6,啟動注冊到Windows的redis服務。鍵入命令“redis-server.exe --service-start” 可能會報錯,如下圖。原因是我們已經在這個端口綁定了一個服務,就是我們前面啟動的那個所謂的臨時服務,這個時候我們需要關閉剛才啟動的臨時服務的窗口。
7,再啟動如果還是報上面的錯誤,那可能需要我們調整注冊到Windows的服務為本地系統服務,而不是網絡服務,如下圖所示。除此之外可能還會有防火牆等問題導致redis服務啟動失敗。
8,如下圖所示,服務啟動ok,這個時候我們在繼續操作redis客戶端是沒有問題的。
二,springboot 集成redis
1,新建springboot工程,如果有不清楚如何新建的,請移步 https://www.cnblogs.com/JJJ1990/p/8384386.html
2,在pom文件中加入redis jar包的引用
我的整個工程的pom文件如下,注意第34-38行,即為引入的redis jar包
1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 2 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 3 <modelVersion>4.0.0</modelVersion> 4 5 <groupId>com</groupId> 6 <artifactId>redis</artifactId> 7 <version>0.0.1-SNAPSHOT</version> 8 <packaging>jar</packaging> 9 10 <name>redis</name> 11 <url>http://maven.apache.org</url> 12 13 <properties> 14 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 15 </properties> 16 17 <parent> 18 <groupId>org.springframework.boot</groupId> 19 <artifactId>spring-boot-starter-parent</artifactId> 20 <version>1.5.8.RELEASE</version> 21 </parent> 22 23 <dependencies> 24 <dependency> 25 <groupId>junit</groupId> 26 <artifactId>junit</artifactId> 27 <version>3.8.1</version> 28 <scope>test</scope> 29 </dependency> 30 <dependency> 31 <groupId>org.springframework.boot</groupId> 32 <artifactId>spring-boot-starter-web</artifactId> 33 </dependency> 34 <dependency> 35 <groupId>org.springframework.boot</groupId> 36 <artifactId>spring-boot-starter-data-redis</artifactId> 37 </dependency> 38 </dependencies> 39 </project>
3,編寫RedisConfig 類代碼
1 package com.redis; 2 3 import org.springframework.beans.factory.annotation.Value; 4 import org.springframework.context.annotation.Bean; 5 import org.springframework.context.annotation.Configuration; 6 import org.springframework.context.annotation.PropertySource; 7 import org.springframework.data.redis.connection.RedisConnectionFactory; 8 import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; 9 import org.springframework.data.redis.core.RedisTemplate; 10 import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; 11 import org.springframework.data.redis.serializer.StringRedisSerializer; 12 13 import redis.clients.jedis.JedisPoolConfig; 14 15 @Configuration 16 @PropertySource("classpath:config/redis.properties") 17 public class RedisConfig { 18 19 @Value("${redis.maxIdle}") 20 private Integer maxIdle; 21 22 @Value("${redis.maxTotal}") 23 private Integer maxTotal; 24 25 @Value("${redis.maxWaitMillis}") 26 private Integer maxWaitMillis; 27 28 @Value("${redis.minEvictableIdleTimeMillis}") 29 private Integer minEvictableIdleTimeMillis; 30 31 @Value("${redis.numTestsPerEvictionRun}") 32 private Integer numTestsPerEvictionRun; 33 34 @Value("${redis.timeBetweenEvictionRunsMillis}") 35 private long timeBetweenEvictionRunsMillis; 36 37 @Value("${redis.testOnBorrow}") 38 private boolean testOnBorrow; 39 40 @Value("${redis.testWhileIdle}") 41 private boolean testWhileIdle; 42 43 44 @Value("${spring.redis.cluster.nodes}") 45 private String clusterNodes; 46 47 @Value("${spring.redis.cluster.max-redirects}") 48 private Integer mmaxRedirectsac; 49 50 /** 51 * JedisPoolConfig 連接池 52 * @return 53 */ 54 @Bean 55 public JedisPoolConfig jedisPoolConfig() { 56 JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); 57 // 最大空閑數 58 jedisPoolConfig.setMaxIdle(maxIdle); 59 // 連接池的最大數據庫連接數 60 jedisPoolConfig.setMaxTotal(maxTotal); 61 // 最大建立連接等待時間 62 jedisPoolConfig.setMaxWaitMillis(maxWaitMillis); 63 // 逐出連接的最小空閑時間 默認1800000毫秒(30分鍾) 64 jedisPoolConfig.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis); 65 // 每次逐出檢查時 逐出的最大數目 如果為負數就是 : 1/abs(n), 默認3 66 jedisPoolConfig.setNumTestsPerEvictionRun(numTestsPerEvictionRun); 67 // 逐出掃描的時間間隔(毫秒) 如果為負數,則不運行逐出線程, 默認-1 68 jedisPoolConfig.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis); 69 // 是否在從池中取出連接前進行檢驗,如果檢驗失敗,則從池中去除連接並嘗試取出另一個 70 jedisPoolConfig.setTestOnBorrow(testOnBorrow); 71 // 在空閑時檢查有效性, 默認false 72 jedisPoolConfig.setTestWhileIdle(testWhileIdle); 73 System.out.println("redis 連接池配置完成!"); 74 return jedisPoolConfig; 75 } 76 /** 77 * 單機版配置 78 * @throws 79 */ 80 @Bean 81 public JedisConnectionFactory JedisConnectionFactory(JedisPoolConfig jedisPoolConfig){ 82 JedisConnectionFactory JedisConnectionFactory = new JedisConnectionFactory(jedisPoolConfig); 83 //連接池 84 JedisConnectionFactory.setPoolConfig(jedisPoolConfig); 85 //IP地址 86 JedisConnectionFactory.setHostName("127.0.0.1"); 87 //端口號 88 JedisConnectionFactory.setPort(6379); 89 //如果Redis設置有密碼 90 //JedisConnectionFactory.setPassword(password); 91 //客戶端超時時間單位是毫秒 92 JedisConnectionFactory.setTimeout(5000); 93 System.out.println("jedis 連接工廠配置完成!"); 94 return JedisConnectionFactory; 95 } 96 97 /** 98 * 實例化 RedisTemplate 對象 99 * @return 100 */ 101 @Bean 102 public RedisTemplate<String, Object> functionDomainRedisTemplate(JedisConnectionFactory redisConnectionFactory) { 103 RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>(); 104 initDomainRedisTemplate(redisTemplate, redisConnectionFactory); 105 System.out.println("functionDomainRedisTemplates 配置完成!"); 106 return redisTemplate; 107 } 108 /** 109 * 設置數據存入 redis 的序列化方式,並開啟事務 110 * @param redisTemplate 111 * @param factory 112 */ 113 private void initDomainRedisTemplate(RedisTemplate<String, Object> redisTemplate, RedisConnectionFactory factory) { 114 //如果不配置Serializer,那么存儲的時候缺省使用String,如果用User類型存儲,那么會提示錯誤User can't cast to String! 115 redisTemplate.setKeySerializer(new StringRedisSerializer()); 116 redisTemplate.setHashKeySerializer(new StringRedisSerializer()); 117 redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer()); 118 redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer()); 119 // 開啟事務 120 redisTemplate.setEnableTransactionSupport(true); 121 redisTemplate.setConnectionFactory(factory); 122 } 123 /** 124 * 注入封裝RedisTemplate 125 * @Title: redisUtil 126 * @return RedisUtil 127 * @throws 128 */ 129 @Bean(name = "redisUtil") 130 public RedisUtil redisUtil(RedisTemplate<String, Object> redisTemplate) { 131 RedisUtil redisUtil = new RedisUtil(); 132 redisUtil.setRedisTemplate(redisTemplate); 133 System.out.println("redisUtil 配置完成!"); 134 return redisUtil; 135 } 136 }
4,編寫RedisUtil類,用於操作redis數據庫
1 package com.redis; 2 3 import java.util.List; 4 import java.util.Map; 5 import java.util.Set; 6 import java.util.concurrent.TimeUnit; 7 8 import org.springframework.data.redis.core.RedisTemplate; 9 import org.springframework.util.CollectionUtils; 10 11 public class RedisUtil { 12 13 private RedisTemplate<String, Object> redisTemplate; 14 15 public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) { 16 this.redisTemplate = redisTemplate; 17 } 18 19 /** 20 * 指定緩存失效時間 21 * @param key 鍵 22 * @param time 時間(秒) 23 * @return 24 */ 25 public boolean expire(String key,long time){ 26 try { 27 if(time>0){ 28 redisTemplate.expire(key, time, TimeUnit.SECONDS); 29 } 30 return true; 31 } catch (Exception e) { 32 e.printStackTrace(); 33 return false; 34 } 35 } 36 37 /** 38 * 根據key 獲取過期時間 39 * @param key 鍵 不能為null 40 * @return 時間(秒) 返回0代表為永久有效 41 */ 42 public long getExpire(String key){ 43 return redisTemplate.getExpire(key,TimeUnit.SECONDS); 44 } 45 46 /** 47 * 判斷key是否存在 48 * @param key 鍵 49 * @return true 存在 false不存在 50 */ 51 public boolean hasKey(String key){ 52 try { 53 return redisTemplate.hasKey(key); 54 } catch (Exception e) { 55 e.printStackTrace(); 56 return false; 57 } 58 } 59 60 /** 61 * 刪除緩存 62 * @param key 可以傳一個值 或多個 63 */ 64 @SuppressWarnings("unchecked") 65 public void del(String ... key){ 66 if(key!=null&&key.length>0){ 67 if(key.length==1){ 68 redisTemplate.delete(key[0]); 69 }else{ 70 redisTemplate.delete(CollectionUtils.arrayToList(key)); 71 } 72 } 73 } 74 75 //============================String============================= 76 /** 77 * 普通緩存獲取 78 * @param key 鍵 79 * @return 值 80 */ 81 public Object get(String key){ 82 return key==null?null:redisTemplate.opsForValue().get(key); 83 } 84 85 /** 86 * 普通緩存放入 87 * @param key 鍵 88 * @param value 值 89 * @return true成功 false失敗 90 */ 91 public boolean set(String key,Object value) { 92 try { 93 redisTemplate.opsForValue().set(key, value); 94 return true; 95 } catch (Exception e) { 96 e.printStackTrace(); 97 return false; 98 } 99 100 } 101 102 /** 103 * 普通緩存放入並設置時間 104 * @param key 鍵 105 * @param value 值 106 * @param time 時間(秒) time要大於0 如果time小於等於0 將設置無限期 107 * @return true成功 false 失敗 108 */ 109 public boolean set(String key,Object value,long time){ 110 try { 111 if(time>0){ 112 redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); 113 }else{ 114 set(key, value); 115 } 116 return true; 117 } catch (Exception e) { 118 e.printStackTrace(); 119 return false; 120 } 121 } 122 123 /** 124 * 遞增 125 * @param key 鍵 126 * @param by 要增加幾(大於0) 127 * @return 128 */ 129 public long incr(String key, long delta){ 130 if(delta<0){ 131 throw new RuntimeException("遞增因子必須大於0"); 132 } 133 return redisTemplate.opsForValue().increment(key, delta); 134 } 135 136 /** 137 * 遞減 138 * @param key 鍵 139 * @param by 要減少幾(小於0) 140 * @return 141 */ 142 public long decr(String key, long delta){ 143 if(delta<0){ 144 throw new RuntimeException("遞減因子必須大於0"); 145 } 146 return redisTemplate.opsForValue().increment(key, -delta); 147 } 148 149 //================================Map================================= 150 /** 151 * HashGet 152 * @param key 鍵 不能為null 153 * @param item 項 不能為null 154 * @return 值 155 */ 156 public Object hget(String key,String item){ 157 return redisTemplate.opsForHash().get(key, item); 158 } 159 160 /** 161 * 獲取hashKey對應的所有鍵值 162 * @param key 鍵 163 * @return 對應的多個鍵值 164 */ 165 public Map<Object,Object> hmget(String key){ 166 return redisTemplate.opsForHash().entries(key); 167 } 168 169 /** 170 * HashSet 171 * @param key 鍵 172 * @param map 對應多個鍵值 173 * @return true 成功 false 失敗 174 */ 175 public boolean hmset(String key, Map<String,Object> map){ 176 try { 177 redisTemplate.opsForHash().putAll(key, map); 178 return true; 179 } catch (Exception e) { 180 e.printStackTrace(); 181 return false; 182 } 183 } 184 185 /** 186 * HashSet 並設置時間 187 * @param key 鍵 188 * @param map 對應多個鍵值 189 * @param time 時間(秒) 190 * @return true成功 false失敗 191 */ 192 public boolean hmset(String key, Map<String,Object> map, long time){ 193 try { 194 redisTemplate.opsForHash().putAll(key, map); 195 if(time>0){ 196 expire(key, time); 197 } 198 return true; 199 } catch (Exception e) { 200 e.printStackTrace(); 201 return false; 202 } 203 } 204 205 /** 206 * 向一張hash表中放入數據,如果不存在將創建 207 * @param key 鍵 208 * @param item 項 209 * @param value 值 210 * @return true 成功 false失敗 211 */ 212 public boolean hset(String key,String item,Object value) { 213 try { 214 redisTemplate.opsForHash().put(key, item, value); 215 return true; 216 } catch (Exception e) { 217 e.printStackTrace(); 218 return false; 219 } 220 } 221 222 /** 223 * 向一張hash表中放入數據,如果不存在將創建 224 * @param key 鍵 225 * @param item 項 226 * @param value 值 227 * @param time 時間(秒) 注意:如果已存在的hash表有時間,這里將會替換原有的時間 228 * @return true 成功 false失敗 229 */ 230 public boolean hset(String key,String item,Object value,long time) { 231 try { 232 redisTemplate.opsForHash().put(key, item, value); 233 if(time>0){ 234 expire(key, time); 235 } 236 return true; 237 } catch (Exception e) { 238 e.printStackTrace(); 239 return false; 240 } 241 } 242 243 /** 244 * 刪除hash表中的值 245 * @param key 鍵 不能為null 246 * @param item 項 可以使多個 不能為null 247 */ 248 public void hdel(String key, Object... item){ 249 redisTemplate.opsForHash().delete(key,item); 250 } 251 252 /** 253 * 判斷hash表中是否有該項的值 254 * @param key 鍵 不能為null 255 * @param item 項 不能為null 256 * @return true 存在 false不存在 257 */ 258 public boolean hHasKey(String key, String item){ 259 return redisTemplate.opsForHash().hasKey(key, item); 260 } 261 262 /** 263 * hash遞增 如果不存在,就會創建一個 並把新增后的值返回 264 * @param key 鍵 265 * @param item 項 266 * @param by 要增加幾(大於0) 267 * @return 268 */ 269 public double hincr(String key, String item,double by){ 270 return redisTemplate.opsForHash().increment(key, item, by); 271 } 272 273 /** 274 * hash遞減 275 * @param key 鍵 276 * @param item 項 277 * @param by 要減少記(小於0) 278 * @return 279 */ 280 public double hdecr(String key, String item,double by){ 281 return redisTemplate.opsForHash().increment(key, item,-by); 282 } 283 284 //============================set============================= 285 /** 286 * 根據key獲取Set中的所有值 287 * @param key 鍵 288 * @return 289 */ 290 public Set<Object> sGet(String key){ 291 try { 292 return redisTemplate.opsForSet().members(key); 293 } catch (Exception e) { 294 e.printStackTrace(); 295 return null; 296 } 297 } 298 299 /** 300 * 根據value從一個set中查詢,是否存在 301 * @param key 鍵 302 * @param value 值 303 * @return true 存在 false不存在 304 */ 305 public boolean sHasKey(String key,Object value){ 306 try { 307 return redisTemplate.opsForSet().isMember(key, value); 308 } catch (Exception e) { 309 e.printStackTrace(); 310 return false; 311 } 312 } 313 314 /** 315 * 將數據放入set緩存 316 * @param key 鍵 317 * @param values 值 可以是多個 318 * @return 成功個數 319 */ 320 public long sSet(String key, Object...values) { 321 try { 322 return redisTemplate.opsForSet().add(key, values); 323 } catch (Exception e) { 324 e.printStackTrace(); 325 return 0; 326 } 327 } 328 329 /** 330 * 將set數據放入緩存 331 * @param key 鍵 332 * @param time 時間(秒) 333 * @param values 值 可以是多個 334 * @return 成功個數 335 */ 336 public long sSetAndTime(String key,long time,Object...values) { 337 try { 338 Long count = redisTemplate.opsForSet().add(key, values); 339 if(time>0) expire(key, time); 340 return count; 341 } catch (Exception e) { 342 e.printStackTrace(); 343 return 0; 344 } 345 } 346 347 /** 348 * 獲取set緩存的長度 349 * @param key 鍵 350 * @return 351 */ 352 public long sGetSetSize(String key){ 353 try { 354 return redisTemplate.opsForSet().size(key); 355 } catch (Exception e) { 356 e.printStackTrace(); 357 return 0; 358 } 359 } 360 361 /** 362 * 移除值為value的 363 * @param key 鍵 364 * @param values 值 可以是多個 365 * @return 移除的個數 366 */ 367 public long setRemove(String key, Object ...values) { 368 try { 369 Long count = redisTemplate.opsForSet().remove(key, values); 370 return count; 371 } catch (Exception e) { 372 e.printStackTrace(); 373 return 0; 374 } 375 } 376 //===============================list================================= 377 378 /** 379 * 獲取list緩存的內容 380 * @param key 鍵 381 * @param start 開始 382 * @param end 結束 0 到 -1代表所有值 383 * @return 384 */ 385 public List<Object> lGet(String key,long start, long end){ 386 try { 387 return redisTemplate.opsForList().range(key, start, end); 388 } catch (Exception e) { 389 e.printStackTrace(); 390 return null; 391 } 392 } 393 394 /** 395 * 獲取list緩存的長度 396 * @param key 鍵 397 * @return 398 */ 399 public long lGetListSize(String key){ 400 try { 401 return redisTemplate.opsForList().size(key); 402 } catch (Exception e) { 403 e.printStackTrace(); 404 return 0; 405 } 406 } 407 408 /** 409 * 通過索引 獲取list中的值 410 * @param key 鍵 411 * @param index 索引 index>=0時, 0 表頭,1 第二個元素,依次類推;index<0時,-1,表尾,-2倒數第二個元素,依次類推 412 * @return 413 */ 414 public Object lGetIndex(String key,long index){ 415 try { 416 return redisTemplate.opsForList().index(key, index); 417 } catch (Exception e) { 418 e.printStackTrace(); 419 return null; 420 } 421 } 422 423 /** 424 * 將list放入緩存 425 * @param key 鍵 426 * @param value 值 427 * @param time 時間(秒) 428 * @return 429 */ 430 public boolean lSet(String key, Object value) { 431 try { 432 redisTemplate.opsForList().rightPush(key, value); 433 return true; 434 } catch (Exception e) { 435 e.printStackTrace(); 436 return false; 437 } 438 } 439 440 /** 441 * 將list放入緩存 442 * @param key 鍵 443 * @param value 值 444 * @param time 時間(秒) 445 * @return 446 */ 447 public boolean lSet(String key, Object value, long time) { 448 try { 449 redisTemplate.opsForList().rightPush(key, value); 450 if (time > 0) expire(key, time); 451 return true; 452 } catch (Exception e) { 453 e.printStackTrace(); 454 return false; 455 } 456 } 457 458 /** 459 * 將list放入緩存 460 * @param key 鍵 461 * @param value 值 462 * @param time 時間(秒) 463 * @return 464 */ 465 public boolean lSet(String key, List<Object> value) { 466 try { 467 redisTemplate.opsForList().rightPushAll(key, value); 468 return true; 469 } catch (Exception e) { 470 e.printStackTrace(); 471 return false; 472 } 473 } 474 475 /** 476 * 將list放入緩存 477 * @param key 鍵 478 * @param value 值 479 * @param time 時間(秒) 480 * @return 481 */ 482 public boolean lSet(String key, List<Object> value, long time) { 483 try { 484 redisTemplate.opsForList().rightPushAll(key, value); 485 if (time > 0) expire(key, time); 486 return true; 487 } catch (Exception e) { 488 e.printStackTrace(); 489 return false; 490 } 491 } 492 493 /** 494 * 根據索引修改list中的某條數據 495 * @param key 鍵 496 * @param index 索引 497 * @param value 值 498 * @return 499 */ 500 public boolean lUpdateIndex(String key, long index,Object value) { 501 try { 502 redisTemplate.opsForList().set(key, index, value); 503 return true; 504 } catch (Exception e) { 505 e.printStackTrace(); 506 return false; 507 } 508 } 509 510 /** 511 * 移除N個值為value 512 * @param key 鍵 513 * @param count 移除多少個 514 * @param value 值 515 * @return 移除的個數 516 */ 517 public long lRemove(String key,long count,Object value) { 518 try { 519 Long remove = redisTemplate.opsForList().remove(key, count, value); 520 return remove; 521 } catch (Exception e) { 522 e.printStackTrace(); 523 return 0; 524 } 525 } 526 }
5,新建 redis.properties 文件
注意文件位置,在我們新建RedisConfig 的時候有指定 為config/redis.properties ,所以我們的redis.properties 文件位置如下圖所示
6,編寫redis.properties 文件內容
1 #Matser的ip地址 2 redis.hostName=172.0.0.1 3 #端口號 4 redis.port=6379 5 #如果有密碼 6 redis.password= 7 #客戶端超時時間單位是毫秒 默認是2000 8 redis.timeout=10000 9 10 #最大空閑數 11 redis.maxIdle=300 12 #連接池的最大數據庫連接數。設為0表示無限制,如果是jedis 2.4以后用redis.maxTotal 13 #redis.maxActive=600 14 #控制一個pool可分配多少個jedis實例,用來替換上面的redis.maxActive,如果是jedis 2.4以后用該屬性 15 redis.maxTotal=1000 16 #最大建立連接等待時間。如果超過此時間將接到異常。設為-1表示無限制。 17 redis.maxWaitMillis=1000 18 #連接的最小空閑時間 默認1800000毫秒(30分鍾) 19 redis.minEvictableIdleTimeMillis=300000 20 #每次釋放連接的最大數目,默認3 21 redis.numTestsPerEvictionRun=1024 22 #逐出掃描的時間間隔(毫秒) 如果為負數,則不運行逐出線程, 默認-1 23 redis.timeBetweenEvictionRunsMillis=30000 24 #是否在從池中取出連接前進行檢驗,如果檢驗失敗,則從池中去除連接並嘗試取出另一個 25 redis.testOnBorrow=true 26 #在空閑時檢查有效性, 默認false 27 redis.testWhileIdle=true 28 29 #redis集群配置 30 spring.redis.cluster.nodes=192.168.177.128:7001,192.168.177.128:7002,192.168.177.128:7003,192.168.177.128:7004,192.168.177.128:7005,192.168.177.128:7006 31 spring.redis.cluster.max-redirects=3
7,編寫測試controller
1 package com.redis; 2 3 import org.springframework.beans.factory.annotation.Autowired; 4 import org.springframework.stereotype.Controller; 5 import org.springframework.web.bind.annotation.PathVariable; 6 import org.springframework.web.bind.annotation.RequestMapping; 7 import org.springframework.web.bind.annotation.RequestMethod; 8 import org.springframework.web.bind.annotation.ResponseBody; 9 10 @Controller 11 public class Firstblood { 12 13 @Autowired 14 RedisUtil redisUtil; 15 16 @RequestMapping(value="/FristBlood/{name}",method= RequestMethod.GET) 17 @ResponseBody 18 public String hello(@PathVariable("name") String name) { 19 return "查詢結果:" + redisUtil.get(name) ; 20 } 21 }
8,測試驗證
打開瀏覽器,輸入 “http://localhost:8080/FristBlood/redis” 這個url中的redis就等於是我們本次請求要查詢的key ,
但是這塊有一個問題是,我們使用了@ResponseBody 注解,但是我們在redis數據庫中,之前存入的時候,我們執行了一個命令"set redis jj" ,
雖然我們認為存入的是一個字符串但是在我們代碼中執行獲取這個key的value的時候不會這么認為,會導致解析出錯。
這個時候我們從新set一下,如下圖
然后在瀏覽器中我們繼續輸入上面的url,返回的結果頁面如下,則說明整個工程ok
如果輸入的key不存在 則返回null,如下圖所示: