spring boot 2.0+中整合redis 方法缓存Cache和普通缓存两种
1、加入包
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <dependency> 2 <groupId>org.springframework.boot</groupId> 3 <artifactId>spring-boot-starter-cache</artifactId> 4 </dependency> 5 <dependency> 6 <groupId>org.springframework.boot</groupId> 7 <artifactId>spring-boot-starter-data-redis</artifactId> 8 <exclusions> 9 <exclusion> 10 <groupId>redis.clients</groupId> 11 <artifactId>jedis</artifactId> 12 </exclusion> 13 <exclusion> 14 <groupId>io.lettuce</groupId> 15 <artifactId>lettuce-core</artifactId> 16 </exclusion> 17 </exclusions> 18 </dependency> 19 <dependency> 20 <groupId>redis.clients</groupId> 21 <artifactId>jedis</artifactId> 22 </dependency>
2、配置文件使用哪一个库
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
spring.redis.database=0
3、新建配置文件redis.properties
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
redis.host=xxxxx
redis.port=xxx
redis.pass=
redis.timeout=3600
redis.jedis.pool.max-idle=8
redis.jedis.pool.max-wait=-1
4、增加配置类 JedisRedisConfig
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 @Configuration 2 @PropertySource("classpath:/config/redis.properties") 3 public class JedisRedisConfig { 4 @Value("${redis.host}") 5 private String host; 6 @Value("${redis.pass}") 7 private String password; 8 @Value("${redis.port}") 9 private int port; 10 @Value("${redis.timeout}") 11 private int timeout; 12 @Value("${redis.jedis.pool.max-idle}") 13 private int maxIdle; 14 @Value("${redis.jedis.pool.max-wait}") 15 private long maxWaitMillis; 16 17 @Bean 18 public JedisConnectionFactory jedisConnectionFactory() { 19 RedisStandaloneConfiguration configuration = 20 new RedisStandaloneConfiguration(host, port); 21 return new JedisConnectionFactory(configuration); 22 } 23 @Bean 24 public JedisPool redisPoolFactory() { 25 JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); 26 jedisPoolConfig.setMaxIdle(maxIdle); 27 jedisPoolConfig.setMaxWaitMillis(maxWaitMillis); 28 29 JedisPool jedisPool = new JedisPool(jedisPoolConfig, host, port, timeout, password); 30 return jedisPool; 31 } 32 }
5、增加redis缓存配置类
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 @Configuration 2 @EnableCaching 3 public class RedisConfig extends CachingConfigurerSupport { 4 5 @Autowired 6 private JedisConnectionFactory jedisConnectionFactory; 7 8 /** 9 * @description 自定义的缓存key的生成策略 10 * 若想使用这个key 只需要讲注解上keyGenerator的值设置为keyGenerator即可</br> 11 * @return 自定义策略生成的key 12 */ 13 @Bean 14 public KeyGenerator keyGenerator() { 15 return new KeyGenerator(){ 16 @Override 17 public Object generate(Object target, Method method, Object... params) { 18 StringBuffer sb = new StringBuffer(); 19 sb.append(target.getClass().getName()); 20 sb.append(method.getName()); 21 for(Object obj:params){ 22 sb.append(obj.toString()); 23 } 24 return sb.toString(); 25 } 26 }; 27 } 28 29 //缓存管理器 30 @Bean 31 public CacheManager cacheManager(JedisConnectionFactory jedisConnectionFactory) { 32 RedisCacheConfiguration redisCacheConfiguration=RedisCacheConfiguration.defaultCacheConfig() 33 .entryTtl(Duration.ofMinutes(30)); 34 return RedisCacheManager.builder(RedisCacheWriter.nonLockingRedisCacheWriter(jedisConnectionFactory)) 35 .cacheDefaults(redisCacheConfiguration).build(); 36 } 37 38 /** 39 * RedisTemplate配置 40 * 41 * @param jedisConnectionFactory 42 * @return 43 */ 44 @Bean 45 public RedisTemplate<String, Object> redisTemplate(JedisConnectionFactory jedisConnectionFactory ) { 46 //设置序列化 47 Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); 48 ObjectMapper om = new ObjectMapper(); 49 om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); 50 om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); 51 jackson2JsonRedisSerializer.setObjectMapper(om); 52 //配置redisTemplate 53 RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>(); 54 redisTemplate.setConnectionFactory(jedisConnectionFactory); 55 RedisSerializer stringSerializer = new StringRedisSerializer(); 56 redisTemplate.setKeySerializer(stringSerializer);//key序列化 57 redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);//value序列化 58 redisTemplate.setHashKeySerializer(stringSerializer);//Hash key序列化 59 redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);//Hash value序列化 60 redisTemplate.afterPropertiesSet(); 61 return redisTemplate; 62 } 63 // public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) { 64 // RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>(); 65 // redisTemplate.setConnectionFactory(redisConnectionFactory); 66 // // 替换默认序列化 方式 67 // GenericFastJson2JsonRedisSerializer genericFastJson2JsonRedisSerializer = new GenericFastJson2JsonRedisSerializer(); 68 // redisTemplate.setValueSerializer(genericFastJson2JsonRedisSerializer); 69 // redisTemplate.setKeySerializer(genericFastJson2JsonRedisSerializer); 70 // redisTemplate.afterPropertiesSet(); 71 // return redisTemplate; 72 // } 73 }
6、redis工具类
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 public class RedisUtil { 2 3 4 @Autowired 5 private RedisTemplate redisTemplate; 6 7 //=============================common============================ 8 /** 9 * 指定缓存失效时间 10 * @param key 键 11 * @param time 时间(秒) 12 * @return 13 */ 14 public boolean expire(String key,long time){ 15 try { 16 if(time>0){ 17 redisTemplate.expire(key, time, TimeUnit.SECONDS); 18 } 19 return true; 20 } catch (Exception e) { 21 e.printStackTrace(); 22 return false; 23 } 24 } 25 26 /** 27 * 根据key 获取过期时间 28 * @param key 键 不能为null 29 * @return 时间(秒) 返回0代表为永久有效 30 */ 31 public long getExpire(String key){ 32 return redisTemplate.getExpire(key,TimeUnit.SECONDS); 33 } 34 35 /** 36 * 判断key是否存在 37 * @param key 键 38 * @return true 存在 false不存在 39 */ 40 public boolean hasKey(String key){ 41 try { 42 return redisTemplate.hasKey(key); 43 } catch (Exception e) { 44 e.printStackTrace(); 45 return false; 46 } 47 } 48 49 /** 50 * 删除缓存 51 * @param key 可以传一个值 或多个 52 */ 53 @SuppressWarnings("unchecked") 54 public void del(String ... key){ 55 if(key!=null&&key.length>0){ 56 if(key.length==1){ 57 redisTemplate.delete(key[0]); 58 }else{ 59 redisTemplate.delete(CollectionUtils.arrayToList(key)); 60 } 61 } 62 } 63 64 //============================String============================= 65 /** 66 * 普通缓存获取 67 * @param key 键 68 * @return 值 69 */ 70 public Object get(String key){ 71 return key==null?null:redisTemplate.opsForValue().get(key); 72 } 73 74 /** 75 * 普通缓存放入 76 * @param key 键 77 * @param value 值 78 * @return true成功 false失败 79 */ 80 public boolean set(String key,Object value) { 81 try { 82 redisTemplate.opsForValue().set(key, value); 83 return true; 84 } catch (Exception e) { 85 e.printStackTrace(); 86 return false; 87 } 88 89 } 90 91 /** 92 * 普通缓存放入并设置时间 93 * @param key 键 94 * @param value 值 95 * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 96 * @return true成功 false 失败 97 */ 98 public boolean set(String key,Object value,Integer time,TimeUnit timeUnit){ 99 try { 100 if(time>0){ 101 redisTemplate.opsForValue().set(key, value, time, timeUnit); 102 }else{ 103 set(key, value); 104 } 105 return true; 106 } catch (Exception e) { 107 e.printStackTrace(); 108 return false; 109 } 110 } 111 112 /** 113 * 递增 114 * @param key 键 115 * @param delta 要增加几(大于0) 116 * @return 117 */ 118 public long incr(String key, long delta){ 119 if(delta<0){ 120 throw new RuntimeException("递增因子必须大于0"); 121 } 122 return redisTemplate.opsForValue().increment(key, delta); 123 } 124 125 /** 126 * 递减 127 * @param key 键 128 * @param delta 要减少几(小于0) 129 * @return 130 */ 131 public long decr(String key, long delta){ 132 if(delta<0){ 133 throw new RuntimeException("递减因子必须大于0"); 134 } 135 return redisTemplate.opsForValue().increment(key, -delta); 136 } 137 138 //================================Map================================= 139 /** 140 * HashGet 141 * @param key 键 不能为null 142 * @param item 项 不能为null 143 * @return 值 144 */ 145 public Object hget(String key,String item){ 146 return redisTemplate.opsForHash().get(key, item); 147 } 148 149 /** 150 * 获取hashKey对应的所有键值 151 * @param key 键 152 * @return 对应的多个键值 153 */ 154 public Map<Object,Object> hmget(String key){ 155 return redisTemplate.opsForHash().entries(key); 156 } 157 158 /** 159 * HashSet 160 * @param key 键 161 * @param map 对应多个键值 162 * @return true 成功 false 失败 163 */ 164 public boolean hmset(String key, Map<String,Object> map){ 165 try { 166 redisTemplate.opsForHash().putAll(key, map); 167 return true; 168 } catch (Exception e) { 169 e.printStackTrace(); 170 return false; 171 } 172 } 173 174 /** 175 * HashSet 并设置时间 176 * @param key 键 177 * @param map 对应多个键值 178 * @param time 时间(秒) 179 * @return true成功 false失败 180 */ 181 public boolean hmset(String key, Map<String,Object> map, long time){ 182 try { 183 redisTemplate.opsForHash().putAll(key, map); 184 if(time>0){ 185 expire(key, time); 186 } 187 return true; 188 } catch (Exception e) { 189 e.printStackTrace(); 190 return false; 191 } 192 } 193 194 /** 195 * 向一张hash表中放入数据,如果不存在将创建 196 * @param key 键 197 * @param item 项 198 * @param value 值 199 * @return true 成功 false失败 200 */ 201 public boolean hset(String key,String item,Object value) { 202 try { 203 redisTemplate.opsForHash().put(key, item, value); 204 return true; 205 } catch (Exception e) { 206 e.printStackTrace(); 207 return false; 208 } 209 } 210 211 /** 212 * 向一张hash表中放入数据,如果不存在将创建 213 * @param key 键 214 * @param item 项 215 * @param value 值 216 * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 217 * @return true 成功 false失败 218 */ 219 public boolean hset(String key,String item,Object value,long time) { 220 try { 221 redisTemplate.opsForHash().put(key, item, value); 222 if(time>0){ 223 expire(key, time); 224 } 225 return true; 226 } catch (Exception e) { 227 e.printStackTrace(); 228 return false; 229 } 230 } 231 232 /** 233 * 删除hash表中的值 234 * @param key 键 不能为null 235 * @param item 项 可以使多个 不能为null 236 */ 237 public void hdel(String key, Object... item){ 238 redisTemplate.opsForHash().delete(key,item); 239 } 240 241 /** 242 * 判断hash表中是否有该项的值 243 * @param key 键 不能为null 244 * @param item 项 不能为null 245 * @return true 存在 false不存在 246 */ 247 public boolean hHasKey(String key, String item){ 248 return redisTemplate.opsForHash().hasKey(key, item); 249 } 250 251 /** 252 * hash递增 如果不存在,就会创建一个 并把新增后的值返回 253 * @param key 键 254 * @param item 项 255 * @param by 要增加几(大于0) 256 * @return 257 */ 258 public double hincr(String key, String item,double by){ 259 return redisTemplate.opsForHash().increment(key, item, by); 260 } 261 262 /** 263 * hash递减 264 * @param key 键 265 * @param item 项 266 * @param by 要减少记(小于0) 267 * @return 268 */ 269 public double hdecr(String key, String item,double by){ 270 return redisTemplate.opsForHash().increment(key, item,-by); 271 } 272 273 //============================set============================= 274 /** 275 * 根据key获取Set中的所有值 276 * @param key 键 277 * @return 278 */ 279 public Set<Object> sGet(String key){ 280 try { 281 return redisTemplate.opsForSet().members(key); 282 } catch (Exception e) { 283 e.printStackTrace(); 284 return null; 285 } 286 } 287 288 /** 289 * 根据value从一个set中查询,是否存在 290 * @param key 键 291 * @param value 值 292 * @return true 存在 false不存在 293 */ 294 public boolean sHasKey(String key,Object value){ 295 try { 296 return redisTemplate.opsForSet().isMember(key, value); 297 } catch (Exception e) { 298 e.printStackTrace(); 299 return false; 300 } 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 /** 319 * 将set数据放入缓存 320 * @param key 键 321 * @param time 时间(秒) 322 * @param values 值 可以是多个 323 * @return 成功个数 324 */ 325 public long sSetAndTime(String key,long time,Object...values) { 326 try { 327 Long count = redisTemplate.opsForSet().add(key, values); 328 if(time>0) expire(key, time); 329 return count; 330 } catch (Exception e) { 331 e.printStackTrace(); 332 return 0; 333 } 334 } 335 336 /** 337 * 获取set缓存的长度 338 * @param key 键 339 * @return 340 */ 341 public long sGetSetSize(String key){ 342 try { 343 return redisTemplate.opsForSet().size(key); 344 } catch (Exception e) { 345 e.printStackTrace(); 346 return 0; 347 } 348 } 349 350 /** 351 * 移除值为value的 352 * @param key 键 353 * @param values 值 可以是多个 354 * @return 移除的个数 355 */ 356 public long setRemove(String key, Object ...values) { 357 try { 358 Long count = redisTemplate.opsForSet().remove(key, values); 359 return count; 360 } catch (Exception e) { 361 e.printStackTrace(); 362 return 0; 363 } 364 } 365 //===============================list================================= 366 367 /** 368 * 获取list缓存的内容 369 * @param key 键 370 * @param start 开始 371 * @param end 结束 0 到 -1代表所有值 372 * @return 373 */ 374 public List<Object> lGet(String key, long start, long end){ 375 try { 376 return redisTemplate.opsForList().range(key, start, end); 377 } catch (Exception e) { 378 e.printStackTrace(); 379 return null; 380 } 381 } 382 383 /** 384 * 获取list缓存的长度 385 * @param key 键 386 * @return 387 */ 388 public long lGetListSize(String key){ 389 try { 390 return redisTemplate.opsForList().size(key); 391 } catch (Exception e) { 392 e.printStackTrace(); 393 return 0; 394 } 395 } 396 397 /** 398 * 通过索引 获取list中的值 399 * @param key 键 400 * @param index 索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推 401 * @return 402 */ 403 public Object lGetIndex(String key,long index){ 404 try { 405 return redisTemplate.opsForList().index(key, index); 406 } catch (Exception e) { 407 e.printStackTrace(); 408 return null; 409 } 410 } 411 412 /** 413 * 将list放入缓存 414 * @param key 键 415 * @param value 值 416 * @return 417 */ 418 public boolean lSet(String key, Object value) { 419 try { 420 redisTemplate.opsForList().rightPush(key, value); 421 return true; 422 } catch (Exception e) { 423 e.printStackTrace(); 424 return false; 425 } 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) expire(key, time); 439 return true; 440 } catch (Exception e) { 441 e.printStackTrace(); 442 return false; 443 } 444 } 445 446 /** 447 * 将list放入缓存 448 * @param key 键 449 * @param value 值 450 * @return 451 */ 452 public boolean lSet(String key, List<Object> value) { 453 try { 454 redisTemplate.opsForList().rightPushAll(key, value); 455 return true; 456 } catch (Exception e) { 457 e.printStackTrace(); 458 return false; 459 } 460 } 461 462 /** 463 * 将list放入缓存 464 * @param key 键 465 * @param value 值 466 * @param time 时间(秒) 467 * @return 468 */ 469 public boolean lSet(String key, List<Object> value, long time) { 470 try { 471 redisTemplate.opsForList().rightPushAll(key, value); 472 if (time > 0) expire(key, time); 473 return true; 474 } catch (Exception e) { 475 e.printStackTrace(); 476 return false; 477 } 478 } 479 480 /** 481 * 根据索引修改list中的某条数据 482 * @param key 键 483 * @param index 索引 484 * @param value 值 485 * @return 486 */ 487 public boolean lUpdateIndex(String key, long index,Object value) { 488 try { 489 redisTemplate.opsForList().set(key, index, value); 490 return true; 491 } catch (Exception e) { 492 e.printStackTrace(); 493 return false; 494 } 495 } 496 497 /** 498 * 移除N个值为value 499 * @param key 键 500 * @param count 移除多少个 501 * @param value 值 502 * @return 移除的个数 503 */ 504 public long lRemove(String key,long count,Object value) { 505 try { 506 Long remove = redisTemplate.opsForList().remove(key, count, value); 507 return remove; 508 } catch (Exception e) { 509 e.printStackTrace(); 510 return 0; 511 } 512 } 513 514 /** 515 * SETNX指令 516 * */ 517 public boolean setNx(String key,String value) 518 { 519 try { 520 Boolean flagSuc= (Boolean) redisTemplate.execute((RedisCallback) connection ->{ 521 return connection.setNX(key.getBytes(),value.getBytes()); 522 }); 523 return flagSuc; 524 }catch (Exception ex) 525 { 526 return false; 527 } 528 } 529 }
7、使用示例
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 redisUtil.set("1024","设置时间配置",1, TimeUnit.DAYS); 2 redisUtil.get("1024");
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 @Cacheable(cacheNames = "test",key = "#key") 2 public String test(String key) { 3 return UUID.randomUUID().toString(); 4 }
甘于平凡,做一个甘于平凡的人,菜米油盐,生老病死。