spring boot 2.0+中整合redis 方法缓存Cache和普通缓存两种

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>
maven

2、配置文件使用哪一个库

spring.redis.database=0
application.properties

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
redis.properties

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 }
redis缓存配置类

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      * @return145      */
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 }
redis工具类

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     }
方法的缓存

猜你喜欢

转载自www.cnblogs.com/rolayblog/p/11262690.html