application.properties 文件內容
1 #Redis數據庫索引(默認爲0) 2 spring.redis.database=0 3 #Redis服務器地址 4 spring.redis.host=localhost 5 #Redis服務器連接端口 6 spring.redis.port=6379 7 #Redis服務器連接密碼(默認爲空) 8 spring.redis.password= 9 #連接池最大連接數(使用負值表示沒有限制) 10 spring.redis.jedis.pool.max-active=200 11 #連接池最大阻塞等待時間(使用負值表示沒有限制) 12 spring.redis.lettuce.pool.max-wait=-1 13 #連接池中的最大空閒連接 14 spring.redis.jedis.pool.max-idle=10 15 #連接池中的最小空閒連接 16 spring.redis.jedis.pool.min-idle=0 17 #連接超時時間(毫秒) 18 spring.redis.timeout=1000
接下來我們自己創建一個RedisTemplate實例,不用SpringBoot自動爲我們創建的那個
1 import com.fasterxml.jackson.annotation.JsonAutoDetect; 2 import com.fasterxml.jackson.annotation.PropertyAccessor; 3 import com.fasterxml.jackson.databind.ObjectMapper; 4 import org.springframework.context.annotation.Bean; 5 import org.springframework.context.annotation.Configuration; 6 import org.springframework.data.redis.connection.RedisConnectionFactory; 7 import org.springframework.data.redis.core.RedisTemplate; 8 import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; 9 import org.springframework.data.redis.serializer.StringRedisSerializer; 10 11 @Configuration 12 public class RedisConfig { 13 @Bean 14 @SuppressWarnings("all") 15 public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { 16 RedisTemplate<String, Object> template = new RedisTemplate<String, Object>(); 17 template.setConnectionFactory(factory); 18 Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); 19 ObjectMapper om = new ObjectMapper(); 20 om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); 21 om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); 22 jackson2JsonRedisSerializer.setObjectMapper(om); 23 StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); 24 // key採用String的序列化方式 25 template.setKeySerializer(stringRedisSerializer); 26 // hash的key也採用String的序列化方式 27 template.setHashKeySerializer(stringRedisSerializer); 28 // value序列化方式採用jackson 29 template.setValueSerializer(jackson2JsonRedisSerializer); 30 // hash的value序列化方式採用jackson 31 template.setHashValueSerializer(jackson2JsonRedisSerializer); 32 template.afterPropertiesSet(); 33 return template; 34 } 35 }
1 import org.springframework.beans.factory.annotation.Autowired; 2 import org.springframework.data.redis.core.RedisTemplate; 3 import org.springframework.stereotype.Component; 4 import org.springframework.util.CollectionUtils; 5 import java.util.List; 6 import java.util.Map; 7 import java.util.Set; 8 import java.util.concurrent.TimeUnit; 9 10 @Component 11 public class RedisUtil { 12 /** 13 * Redis工具類 14 * @author ZENG.XIAO.YAN 15 * @date 年6月7日 16 */ 17 @Autowired 18 private RedisTemplate<String, Object> redisTemplate; 19 // =============================common============================ 20 /** 21 * 指定緩存失效時間 22 * 23 * @param key 鍵 24 * @param time 時間(秒) 25 * @return 26 */ 27 public boolean expire(String key, long time) { 28 try { 29 if (time > 0) { 30 redisTemplate.expire(key, time, TimeUnit.SECONDS); 31 } 32 return true; 33 } catch (Exception e) { 34 e.printStackTrace(); 35 return false; 36 } 37 } 38 39 /** 40 * 根據key 獲取過期時間 41 * @param key 鍵 不能爲null 42 * @return 時間(秒) 返回0代表爲永久有效 43 */ 44 public long getExpire(String key) { 45 return redisTemplate.getExpire(key, TimeUnit.SECONDS); 46 } 47 48 /** 49 * 判斷key是否存在 50 * @param key 鍵 51 * @return true 存在 false不存在 52 */ 53 public boolean hasKey(String key) { 54 try { 55 return redisTemplate.hasKey(key); 56 } catch (Exception e) { 57 e.printStackTrace(); 58 return false; 59 } 60 } 61 /** 62 * 刪除緩存 63 * @param key 可以傳一個值 或多個 64 */ 65 @SuppressWarnings("unchecked") 66 public void del(String... key) { 67 if ((key != null) && (key.length > 0)) { 68 if (key.length == 1) { 69 redisTemplate.delete(key[0]); 70 } else { 71 redisTemplate.delete(CollectionUtils.arrayToList(key)); 72 } 73 } 74 } 75 // ============================String============================= 76 77 /** 78 * 普通緩存獲取 79 * @param key 鍵 80 * @return 值 81 */ 82 public Object get(String key) { 83 return (key == null) ? null : redisTemplate.opsForValue().get(key); 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 95 return true; 96 } catch (Exception e) { 97 e.printStackTrace(); 98 return false; 99 } 100 } 101 /** 102 * 普通緩存放入並設置時間 103 * @param key 鍵 104 * @param value 值 105 * @param time 時間(秒) time要大於0 如果time小於等於0 將設置無限期 106 * @return true成功 false 失敗 107 */ 108 public boolean set(String key, Object value, long time) { 109 try { 110 if (time > 0) { 111 redisTemplate.opsForValue() 112 .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 * @param key 鍵 125 * @param delta 要增加幾(大於0) 126 * @return 127 */ 128 public long incr(String key, long delta) { 129 if (delta < 0) { 130 throw new RuntimeException("遞增因子必須大於0"); 131 } 132 return redisTemplate.opsForValue().increment(key, delta); 133 } 134 /** 135 * 遞減 136 * @param key 鍵 137 * @param delta 要減少幾(小於0) 138 * @return 139 */ 140 public long decr(String key, long delta) { 141 if (delta < 0) { 142 throw new RuntimeException("遞減因子必須大於0"); 143 } 144 return redisTemplate.opsForValue().increment(key, -delta); 145 } 146 // ================================Map================================= 147 /** 148 * HashGet 149 * @param key 鍵 不能爲null 150 * @param item 項 不能爲null 151 * @return 值 152 */ 153 public Object hget(String key, String item) { 154 return redisTemplate.opsForHash().get(key, item); 155 } 156 /** 157 * 獲取hashKey對應的所有鍵值 158 * 159 * @param key 鍵 160 * @return 對應的多個鍵值 161 */ 162 public Map<Object, Object> hmget(String key) { 163 return redisTemplate.opsForHash().entries(key); 164 } 165 166 /** 167 * HashSet 168 * @param key 鍵 169 * @param map 對應多個鍵值 170 * @return true 成功 false 失敗 171 */ 172 public boolean hmset(String key, Map<String, Object> map) { 173 try { 174 redisTemplate.opsForHash().putAll(key, map); 175 return true; 176 } catch (Exception e) { 177 e.printStackTrace(); 178 return false; 179 } 180 } 181 /** 182 * HashSet 並設置時間 183 * @param key 鍵 184 * @param map 對應多個鍵值 185 * @param time 時間(秒) 186 * @return true成功 false失敗 187 */ 188 public boolean hmset(String key, Map<String, Object> map, long time) { 189 try { 190 redisTemplate.opsForHash().putAll(key, map); 191 192 if (time > 0) { 193 expire(key, time); 194 } 195 return true; 196 } catch (Exception e) { 197 e.printStackTrace(); 198 return false; 199 } 200 } 201 /** 202 * 向一張hash表中放入數據,如果不存在將創建 203 * @param key 鍵 204 * @param item 項 205 * @param value 值 206 * @return true 成功 false失敗 207 */ 208 public boolean hset(String key, String item, Object value) { 209 try { 210 redisTemplate.opsForHash().put(key, item, value); 211 return true; 212 } catch (Exception e) { 213 e.printStackTrace(); 214 215 return false; 216 } 217 } 218 /** 219 * 向一張hash表中放入數據,如果不存在將創建 220 * @param key 鍵 221 * @param item 項 222 * @param value 值 223 * @param time 時間(秒) 注意:如果已存在的hash表有時間,這裏將會替換原有的時間 224 * @return true 成功 false失敗 225 */ 226 public boolean hset(String key, String item, Object value, long time) { 227 try { 228 redisTemplate.opsForHash().put(key, item, value); 229 if (time > 0) { 230 expire(key, time); 231 } 232 return true; 233 } catch (Exception e) { 234 e.printStackTrace(); 235 return false; 236 } 237 } 238 /** 239 * 刪除hash表中的值 240 * @param key 鍵 不能爲null 241 * @param item 項 可以使多個 不能爲null 242 */ 243 public void hdel(String key, Object... item) { 244 redisTemplate.opsForHash().delete(key, item); 245 } 246 /** 247 * 判斷hash表中是否有該項的值 248 * @param key 鍵 不能爲null 249 * @param item 項 不能爲null 250 * @return true 存在 false不存在 251 */ 252 public boolean hHasKey(String key, String item) { 253 return redisTemplate.opsForHash().hasKey(key, item); 254 } 255 /** 256 * hash遞增 如果不存在,就會創建一個 並把新增後的值返回 257 * @param key 鍵 258 * @param item 項 259 * @param by 要增加幾(大於0) 260 * @return 261 */ 262 public double hincr(String key, String item, double by) { 263 return redisTemplate.opsForHash().increment(key, item, by); 264 } 265 /** 266 * hash遞減 267 * @param key 鍵 268 * @param item 項 269 * @param by 要減少記(小於0) 270 * @return 271 */ 272 public double hdecr(String key, String item, double by) { 273 return redisTemplate.opsForHash().increment(key, item, -by); 274 } 275 // ============================set============================= 276 /** 277 * 根據key獲取Set中的所有值 278 * @param key 鍵 279 * @return 280 */ 281 public Set<Object> sGet(String key) { 282 try { 283 return redisTemplate.opsForSet().members(key); 284 } catch (Exception e) { 285 e.printStackTrace(); 286 return null; 287 } 288 } 289 /** 290 * 根據value從一個set中查詢,是否存在 291 * @param key 鍵 292 * @param value 值 293 * @return true 存在 false不存在 294 */ 295 public boolean sHasKey(String key, Object value) { 296 try { 297 return redisTemplate.opsForSet().isMember(key, value); 298 } catch (Exception e) { 299 e.printStackTrace(); 300 return false; 301 } 302 } 303 /** 304 * 將數據放入set緩存 305 * @param key 鍵 306 * @param values 值 可以是多個 307 * @return 成功個數 308 */ 309 public long sSet(String key, Object... values) { 310 try { 311 return redisTemplate.opsForSet().add(key, values); 312 } catch (Exception e) { 313 e.printStackTrace(); 314 return 0; 315 } 316 } 317 /** 318 * 將set數據放入緩存 319 * @param key 鍵 320 * @param time 時間(秒) 321 * @param values 值 可以是多個 322 * @return 成功個數 323 */ 324 public long sSetAndTime(String key, long time, Object... values) { 325 try { 326 Long count = redisTemplate.opsForSet().add(key, values); 327 328 if (time > 0) { 329 expire(key, time); 330 } 331 return count; 332 } catch (Exception e) { 333 e.printStackTrace(); 334 return 0; 335 } 336 } 337 /** 338 * 獲取set緩存的長度 339 * 340 * @param key 鍵 341 * @return 342 */ 343 public long sGetSetSize(String key) { 344 try { 345 return redisTemplate.opsForSet().size(key); 346 } catch (Exception e) { 347 e.printStackTrace(); 348 return 0; 349 } 350 } 351 /** 352 * 移除值爲value的 353 * @param key 鍵 354 * @param values 值 可以是多個 355 * @return 移除的個數 356 */ 357 public long setRemove(String key, Object... values) { 358 try { 359 Long count = redisTemplate.opsForSet().remove(key, values); 360 361 return count; 362 } catch (Exception e) { 363 e.printStackTrace(); 364 return 0; 365 } 366 } 367 // ===============================list================================= 368 369 /** 370 * 獲取list緩存的內容 371 * @param key 鍵 372 * @param start 開始 373 * @param end 結束 0 到 -1代表所有值 374 * @return 375 */ 376 public List<Object> lGet(String key, long start, long end) { 377 try { 378 return redisTemplate.opsForList().range(key, start, end); 379 } catch (Exception e) { 380 e.printStackTrace(); 381 return null; 382 } 383 } 384 /** 385 * 獲取list緩存的長度 386 * 387 * @param key 鍵 388 * @return 389 */ 390 public long lGetListSize(String key) { 391 try { 392 return redisTemplate.opsForList().size(key); 393 } catch (Exception e) { 394 e.printStackTrace(); 395 return 0; 396 } 397 } 398 /** 399 * 通過索引 獲取list中的值 400 * @param key 鍵 401 * @param index 索引 index>=0時, 0 表頭,1 第二個元素,依次類推;index<0時,-1,表尾,-2倒數第二個元素,依次類推 402 * @return 403 */ 404 public Object lGetIndex(String key, long index) { 405 try { 406 return redisTemplate.opsForList().index(key, index); 407 } catch (Exception e) { 408 e.printStackTrace(); 409 return null; 410 } 411 } 412 /** 413 * 將list放入緩存 414 * @param key 鍵 415 * @param value 值 416 * @param time 時間(秒) 417 * @return 418 */ 419 public boolean lSet(String key, Object value) { 420 try { 421 redisTemplate.opsForList().rightPush(key, value); 422 return true; 423 } catch (Exception e) { 424 e.printStackTrace(); 425 return false; 426 } 427 } 428 /** 429 * 將list放入緩存 430 * @param key 鍵 431 * @param value 值 432 * @param time 時間(秒) 433 * @return 434 */ 435 public boolean lSet(String key, Object value, long time) { 436 try { 437 redisTemplate.opsForList().rightPush(key, value); 438 if (time > 0) { 439 expire(key, time); 440 } 441 return true; 442 } catch (Exception e) { 443 e.printStackTrace(); 444 return false; 445 } 446 } 447 /** 448 * 將list放入緩存 449 * 450 * @param key 鍵 451 * @param value 值 452 * @param time 時間(秒) 453 * @return 454 */ 455 public boolean lSet(String key, List<Object> value) { 456 try { 457 redisTemplate.opsForList().rightPushAll(key, value); 458 return true; 459 } catch (Exception e) { 460 e.printStackTrace(); 461 return false; 462 } 463 } 464 465 /** 466 * 將list放入緩存 467 * @param key 鍵 468 * @param value 值 469 * @param time 時間(秒) 470 * @return 471 */ 472 public boolean lSet(String key, List<Object> value, long time) { 473 try { 474 redisTemplate.opsForList().rightPushAll(key, value); 475 if (time > 0) { 476 expire(key, time); 477 } 478 return true; 479 } catch (Exception e) { 480 e.printStackTrace(); 481 return false; 482 } 483 } 484 /** 485 * 根據索引修改list中的某條數據 486 * @param key 鍵 487 * @param index 索引 488 * @param value 值 489 * @return 490 */ 491 public boolean lUpdateIndex(String key, long index, Object value) { 492 try { 493 redisTemplate.opsForList().set(key, index, value); 494 return true; 495 } catch (Exception e) { 496 e.printStackTrace(); 497 498 return false; 499 } 500 } 501 /** 502 * 移除N個值爲value 503 * @param key 鍵 504 * @param count 移除多少個 505 * @param value 值 506 * @return 移除的個數 507 */ 508 public long lRemove(String key, long count, Object value) { 509 try { 510 Long remove = redisTemplate.opsForList().remove(key, count, value); 511 512 return remove; 513 } catch (Exception e) { 514 e.printStackTrace(); 515 return 0; 516 } 517 } 518 }