1、加入包
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、配置文件使用哪一个库
spring.redis.database=0
3、新建配置文件redis.properties
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
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缓存配置类
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工具类
1 @Component 2 public class RedisUtil { 3 4 5 @Autowired 6 private RedisTemplate redisTemplate; 7 8 //=============================common============================ 9 /** 10 * 指定缓存失效时间 11 * @param key 键 12 * @param time 时间(秒) 13 * @return 14 */ 15 public boolean expire(String key,long time){ 16 try { 17 if(time>0){ 18 redisTemplate.expire(key, time, TimeUnit.SECONDS); 19 } 20 return true; 21 } catch (Exception e) { 22 e.printStackTrace(); 23 return false; 24 } 25 } 26 27 /** 28 * 根据key 获取过期时间 29 * @param key 键 不能为null 30 * @return 时间(秒) 返回0代表为永久有效 31 */ 32 public long getExpire(String key){ 33 return redisTemplate.getExpire(key,TimeUnit.SECONDS); 34 } 35 36 /** 37 * 判断key是否存在 38 * @param key 键 39 * @return true 存在 false不存在 40 */ 41 public boolean hasKey(String key){ 42 try { 43 return redisTemplate.hasKey(key); 44 } catch (Exception e) { 45 e.printStackTrace(); 46 return false; 47 } 48 } 49 50 /** 51 * 删除缓存 52 * @param key 可以传一个值 或多个 53 */ 54 @SuppressWarnings("unchecked") 55 public void del(String ... key){ 56 if(key!=null&&key.length>0){ 57 if(key.length==1){ 58 redisTemplate.delete(key[0]); 59 }else{ 60 redisTemplate.delete(CollectionUtils.arrayToList(key)); 61 } 62 } 63 } 64 65 //============================String============================= 66 /** 67 * 普通缓存获取 68 * @param key 键 69 * @return 值 70 */ 71 public Object get(String key){ 72 return key==null?null:redisTemplate.opsForValue().get(key); 73 } 74 75 /** 76 * 普通缓存放入 77 * @param key 键 78 * @param value 值 79 * @return true成功 false失败 80 */ 81 public boolean set(String key,Object value) { 82 try { 83 redisTemplate.opsForValue().set(key, value); 84 return true; 85 } catch (Exception e) { 86 e.printStackTrace(); 87 return false; 88 } 89 90 } 91 92 /** 93 * 普通缓存放入并设置时间 94 * @param key 键 95 * @param value 值 96 * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 97 * @return true成功 false 失败 98 */ 99 public boolean set(String key,Object value,Integer time,TimeUnit timeUnit){ 100 try { 101 if(time>0){ 102 redisTemplate.opsForValue().set(key, value, time, timeUnit); 103 }else{ 104 set(key, value); 105 } 106 return true; 107 } catch (Exception e) { 108 e.printStackTrace(); 109 return false; 110 } 111 } 112 113 /** 114 * 递增 115 * @param key 键 116 * @param by 要增加几(大于0) 117 * @return 118 */ 119 public long incr(String key, long delta){ 120 if(delta<0){ 121 throw new RuntimeException("递增因子必须大于0"); 122 } 123 return redisTemplate.opsForValue().increment(key, delta); 124 } 125 126 /** 127 * 递减 128 * @param key 键 129 * @param by 要减少几(小于0) 130 * @return 131 */ 132 public long decr(String key, long delta){ 133 if(delta<0){ 134 throw new RuntimeException("递减因子必须大于0"); 135 } 136 return redisTemplate.opsForValue().increment(key, -delta); 137 } 138 139 //================================Map================================= 140 /** 141 * HashGet 142 * @param key 键 不能为null 143 * @param item 项 不能为null 144 * @return 值 145 */ 146 public Object hget(String key,String item){ 147 return redisTemplate.opsForHash().get(key, item); 148 } 149 150 /** 151 * 获取hashKey对应的所有键值 152 * @param key 键 153 * @return 对应的多个键值 154 */ 155 public Map<Object,Object> hmget(String key){ 156 return redisTemplate.opsForHash().entries(key); 157 } 158 159 /** 160 * HashSet 161 * @param key 键 162 * @param map 对应多个键值 163 * @return true 成功 false 失败 164 */ 165 public boolean hmset(String key, Map<String,Object> map){ 166 try { 167 redisTemplate.opsForHash().putAll(key, map); 168 return true; 169 } catch (Exception e) { 170 e.printStackTrace(); 171 return false; 172 } 173 } 174 175 /** 176 * HashSet 并设置时间 177 * @param key 键 178 * @param map 对应多个键值 179 * @param time 时间(秒) 180 * @return true成功 false失败 181 */ 182 public boolean hmset(String key, Map<String,Object> map, long time){ 183 try { 184 redisTemplate.opsForHash().putAll(key, map); 185 if(time>0){ 186 expire(key, time); 187 } 188 return true; 189 } catch (Exception e) { 190 e.printStackTrace(); 191 return false; 192 } 193 } 194 195 /** 196 * 向一张hash表中放入数据,如果不存在将创建 197 * @param key 键 198 * @param item 项 199 * @param value 值 200 * @return true 成功 false失败 201 */ 202 public boolean hset(String key,String item,Object value) { 203 try { 204 redisTemplate.opsForHash().put(key, item, value); 205 return true; 206 } catch (Exception e) { 207 e.printStackTrace(); 208 return false; 209 } 210 } 211 212 /** 213 * 向一张hash表中放入数据,如果不存在将创建 214 * @param key 键 215 * @param item 项 216 * @param value 值 217 * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 218 * @return true 成功 false失败 219 */ 220 public boolean hset(String key,String item,Object value,long time) { 221 try { 222 redisTemplate.opsForHash().put(key, item, value); 223 if(time>0){ 224 expire(key, time); 225 } 226 return true; 227 } catch (Exception e) { 228 e.printStackTrace(); 229 return false; 230 } 231 } 232 233 /** 234 * 删除hash表中的值 235 * @param key 键 不能为null 236 * @param item 项 可以使多个 不能为null 237 */ 238 public void hdel(String key, Object... item){ 239 redisTemplate.opsForHash().delete(key,item); 240 } 241 242 /** 243 * 判断hash表中是否有该项的值 244 * @param key 键 不能为null 245 * @param item 项 不能为null 246 * @return true 存在 false不存在 247 */ 248 public boolean hHasKey(String key, String item){ 249 return redisTemplate.opsForHash().hasKey(key, item); 250 } 251 252 /** 253 * hash递增 如果不存在,就会创建一个 并把新增后的值返回 254 * @param key 键 255 * @param item 项 256 * @param by 要增加几(大于0) 257 * @return 258 */ 259 public double hincr(String key, String item,double by){ 260 return redisTemplate.opsForHash().increment(key, item, by); 261 } 262 263 /** 264 * hash递减 265 * @param key 键 266 * @param item 项 267 * @param by 要减少记(小于0) 268 * @return 269 */ 270 public double hdecr(String key, String item,double by){ 271 return redisTemplate.opsForHash().increment(key, item,-by); 272 } 273 274 //============================set============================= 275 /** 276 * 根据key获取Set中的所有值 277 * @param key 键 278 * @return 279 */ 280 public Set<Object> sGet(String key){ 281 try { 282 return redisTemplate.opsForSet().members(key); 283 } catch (Exception e) { 284 e.printStackTrace(); 285 return null; 286 } 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 /** 305 * 将数据放入set缓存 306 * @param key 键 307 * @param values 值 可以是多个 308 * @return 成功个数 309 */ 310 public long sSet(String key, Object...values) { 311 try { 312 return redisTemplate.opsForSet().add(key, values); 313 } catch (Exception e) { 314 e.printStackTrace(); 315 return 0; 316 } 317 } 318 319 /** 320 * 将set数据放入缓存 321 * @param key 键 322 * @param time 时间(秒) 323 * @param values 值 可以是多个 324 * @return 成功个数 325 */ 326 public long sSetAndTime(String key,long time,Object...values) { 327 try { 328 Long count = redisTemplate.opsForSet().add(key, values); 329 if(time>0) expire(key, time); 330 return count; 331 } catch (Exception e) { 332 e.printStackTrace(); 333 return 0; 334 } 335 } 336 337 /** 338 * 获取set缓存的长度 339 * @param key 键 340 * @return 341 */ 342 public long sGetSetSize(String key){ 343 try { 344 return redisTemplate.opsForSet().size(key); 345 } catch (Exception e) { 346 e.printStackTrace(); 347 return 0; 348 } 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 return count; 361 } catch (Exception e) { 362 e.printStackTrace(); 363 return 0; 364 } 365 } 366 //===============================list================================= 367 368 /** 369 * 获取list缓存的内容 370 * @param key 键 371 * @param start 开始 372 * @param end 结束 0 到 -1代表所有值 373 * @return 374 */ 375 public List<Object> lGet(String key, long start, long end){ 376 try { 377 return redisTemplate.opsForList().range(key, start, end); 378 } catch (Exception e) { 379 e.printStackTrace(); 380 return null; 381 } 382 } 383 384 /** 385 * 获取list缓存的长度 386 * @param key 键 387 * @return 388 */ 389 public long lGetListSize(String key){ 390 try { 391 return redisTemplate.opsForList().size(key); 392 } catch (Exception e) { 393 e.printStackTrace(); 394 return 0; 395 } 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 /** 414 * 将list放入缓存 415 * @param key 键 416 * @param value 值 417 * @param time 时间(秒) 418 * @return 419 */ 420 public boolean lSet(String key, Object value) { 421 try { 422 redisTemplate.opsForList().rightPush(key, value); 423 return true; 424 } catch (Exception e) { 425 e.printStackTrace(); 426 return false; 427 } 428 } 429 430 /** 431 * 将list放入缓存 432 * @param key 键 433 * @param value 值 434 * @param time 时间(秒) 435 * @return 436 */ 437 public boolean lSet(String key, Object value, long time) { 438 try { 439 redisTemplate.opsForList().rightPush(key, value); 440 if (time > 0) expire(key, time); 441 return true; 442 } catch (Exception e) { 443 e.printStackTrace(); 444 return false; 445 } 446 } 447 448 /** 449 * 将list放入缓存 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) expire(key, time); 476 return true; 477 } catch (Exception e) { 478 e.printStackTrace(); 479 return false; 480 } 481 } 482 483 /** 484 * 根据索引修改list中的某条数据 485 * @param key 键 486 * @param index 索引 487 * @param value 值 488 * @return 489 */ 490 public boolean lUpdateIndex(String key, long index,Object value) { 491 try { 492 redisTemplate.opsForList().set(key, index, value); 493 return true; 494 } catch (Exception e) { 495 e.printStackTrace(); 496 return false; 497 } 498 } 499 500 /** 501 * 移除N个值为value 502 * @param key 键 503 * @param count 移除多少个 504 * @param value 值 505 * @return 移除的个数 506 */ 507 public long lRemove(String key,long count,Object value) { 508 try { 509 Long remove = redisTemplate.opsForList().remove(key, count, value); 510 return remove; 511 } catch (Exception e) { 512 e.printStackTrace(); 513 return 0; 514 } 515 } 516 }
7、使用示例
1 redisUtil.set("1024","设置时间配置",1, TimeUnit.DAYS); 2 redisUtil.get("1024");
1 @Cacheable(cacheNames = "test",key = "#key") 2 public String test(String key) { 3 return UUID.randomUUID().toString(); 4 }