超简单!!!SpringBoot整合Redis

Posted 扎克伯格~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了超简单!!!SpringBoot整合Redis相关的知识,希望对你有一定的参考价值。

1.导入Pom.xml依赖

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <project xmlns="http://maven.apache.org/POM/4.0.0"
 3          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 5     <modelVersion>4.0.0</modelVersion>
 6     <groupId>com.yc</groupId>
 7     <artifactId>SpringCacheDome</artifactId>
 8     <version>1.0-SNAPSHOT</version>
 9     <dependencyManagement>
10         <dependencies>
11             <!--spring-boot-->
12             <dependency>
13                 <groupId>org.springframework.boot</groupId>
14                 <artifactId>spring-boot-dependencies</artifactId>
15                 <version>2.1.3.RELEASE</version>
16                 <type>pom</type>
17                 <scope>import</scope>
18             </dependency>
19         </dependencies>
20     </dependencyManagement>
21     <dependencies>
22         <dependency>
23             <groupId>org.springframework.boot</groupId>
24             <artifactId>spring-boot-starter-web</artifactId>
25         </dependency>
26         <dependency>
27             <groupId>org.springframework.boot</groupId>
28             <artifactId>spring-boot-starter-cache</artifactId>
29         </dependency>
30         <!--SpringBoot 整合 Redis所需依赖以下俩个-->
31         <dependency>
32             <groupId>org.springframework.boot</groupId>
33             <artifactId>spring-boot-starter-redis</artifactId>
34             <version>1.4.0.RELEASE</version>
35         </dependency>
36         <!--数据库驱动包-->
37         <dependency>
38             <groupId>mysql</groupId>
39             <artifactId>mysql-connector-java</artifactId>
40             <version>5.0.4</version>
41         </dependency>
42         <!--数据库连接池-->
43         <dependency>
44             <groupId>com.alibaba</groupId>
45             <artifactId>druid</artifactId>
46             <version>1.0.31</version>
47         </dependency>
48         <!--spring-boot和mybatis整合-->
49         <dependency>
50             <groupId>org.mybatis.spring.boot</groupId>
51             <artifactId>mybatis-spring-boot-starter</artifactId>
52             <version>1.3.0</version>
53         </dependency>
54     </dependencies>
55     <!--由于idea编译器的原因所以在配置文件中指定存放位置-->
56     <build>
57         <resources>
58             <resource>
59                 <directory>src/main/java</directory>
60                 <includes>
61                     <include>**/*.xml</include>
62                 </includes>
63             </resource>
64         </resources>
65     </build>
66 </project>

2.配置yml

 1 spring:
 2   cache:
 3     type: redis
 4     #redis
 5   redis:
 6     host: 127.0.0.1
 7     port: 6379
 8     timeout: 10
 9     password:
10     database: 0
11 
12   datasource:
13     type: com.alibaba.druid.pool.DruidDataSource #当前数据源操作类型
14     driver-class-name: org.gjt.mm.mysql.Driver  #mysql驱动包
15     url: jdbc:mysql://localhost:3306/cloudDB01  #数据库名称
16     username: root
17     password: root
18     dbcp2:
19       min-idle: 5                               #数据哭连接池的最小维持数
20       initial-size: 5                           #初始化连接数
21       max-total: 5                              #最大链接数
22       max-wait-millis: 200                      #等待链接获取的最大超时时间
23     druid:
24       stat-view-servlet.enabled: true
25       stat-view-servlet.url-pattern: /druid/*

3.配置Redis缓存自定义类

 1 @Configuration
 2 @EnableCaching
 3 public class CacheConfig {
 4     /**读取yml文件中配置*/
 5     @Value("${spring.redis.host}")
 6     private String host;
 7 
 8     @Value("${spring.redis.port}")
 9     private int port;
10 
11     @Value("${spring.redis.timeout}")
12     private int timeout;
13 
14     @Value("${spring.redis.database}")
15     private int database;
16 
17     @Bean
18     public JedisConnectionFactory jedisConnectionFactory(){
19         JedisConnectionFactory factory = new JedisConnectionFactory();
20         factory.setHostName(host);
21         factory.setPort(port);
22         factory.setTimeout(timeout);
23         factory.setDatabase(database);
24         return factory;
25     }
26     /**
27      * retemplate相关配置
28      * @param factory
29      * @return
30      */
31     @Bean
32     public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
33         RedisTemplate<String, Object> template = new RedisTemplate<>();
34         // 配置连接工厂
35         template.setConnectionFactory(factory);
36         //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式)
37         Jackson2JsonRedisSerializer jacksonSeial = new Jackson2JsonRedisSerializer(Object.class);
38         ObjectMapper om = new ObjectMapper();
39         // 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public
40         om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
41         // 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常
42         om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
43         jacksonSeial.setObjectMapper(om);
44         // 值采用json序列化
45         template.setValueSerializer(jacksonSeial);
46         //使用StringRedisSerializer来序列化和反序列化redis的key值
47         template.setKeySerializer(new StringRedisSerializer());
48         // 设置hash key 和value序列化模式
49         template.setHashKeySerializer(new StringRedisSerializer());
50         template.setHashValueSerializer(jacksonSeial);
51         template.afterPropertiesSet();
52         return template;
53     }
54 }

4.Redis工具类 SpringBoot

  1 /**
  2  * redisTemplate封装
  3  *
  4  *  @author yinxp@dist.com.cn
  5  */
  6 @Component
  7 public class RedisUtils {
  8 
  9     @Autowired
 10     private RedisTemplate<String, Object> redisTemplate;
 11 
 12     public RedisUtils(RedisTemplate<String, Object> redisTemplate) {
 13         this.redisTemplate = redisTemplate;
 14     }
 15 
 16     /**
 17      * 指定缓存失效时间
 18      * @param key 键
 19      * @param time 时间(秒)
 20      * @return
 21      */
 22     public boolean expire(String key,long time){
 23         try {
 24             if(time>0){
 25                 redisTemplate.expire(key, time, TimeUnit.SECONDS);
 26             }
 27             return true;
 28         } catch (Exception e) {
 29             e.printStackTrace();
 30             return false;
 31         }
 32     }
 33 
 34     /**
 35      * 根据key 获取过期时间
 36      * @param key 键 不能为null
 37      * @return 时间(秒) 返回0代表为永久有效
 38      */
 39     public long getExpire(String key){
 40         return redisTemplate.getExpire(key,TimeUnit.SECONDS);
 41     }
 42 
 43     /**
 44      * 判断key是否存在
 45      * @param key 键
 46      * @return true 存在 false不存在
 47      */
 48     public boolean hasKey(String key){
 49         try {
 50             return redisTemplate.hasKey(key);
 51         } catch (Exception e) {
 52             e.printStackTrace();
 53             return false;
 54         }
 55     }
 56 
 57     /**
 58      * 删除缓存
 59      * @param key 可以传一个值 或多个
 60      */
 61     @SuppressWarnings("unchecked")
 62     public void del(String ... key){
 63         if(key!=null&&key.length>0){
 64             if(key.length==1){
 65                 redisTemplate.delete(key[0]);
 66             }else{
 67                 redisTemplate.delete(CollectionUtils.arrayToList(key));
 68             }
 69         }
 70     }
 71 
 72     //============================String=============================
 73     /**
 74      * 普通缓存获取
 75      * @param key 键
 76      * @return 77      */
 78     public Object get(String key){
 79         return key==null?null:redisTemplate.opsForValue().get(key);
 80     }
 81 
 82     /**
 83      * 普通缓存放入
 84      * @param key 键
 85      * @param value 值
 86      * @return true成功 false失败
 87      */
 88     public boolean set(String key,Object value) {
 89         try {
 90             redisTemplate.opsForValue().set(key, value);
 91             return true;
 92         } catch (Exception e) {
 93             e.printStackTrace();
 94             return false;
 95         }
 96     }
 97 
 98     /**
 99      * 普通缓存放入并设置时间
100      * @param key 键
101      * @param value 值
102      * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期
103      * @return true成功 false 失败
104      */
105     public boolean set(String key,Object value,long time){
106         try {
107             if(time>0){
108                 redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
109             }else{
110                 set(key, value);
111             }
112             return true;
113         } catch (Exception e) {
114             e.printStackTrace();
115             return false;
116         }
117     }
118 
119     /**
120      * 递增
121      * @param key 键
122      * @param delta 要增加几(大于0)
123      * @return
124      */
125     public long incr(String key, long delta){
126         if(delta<0){
127             throw new RuntimeException("递增因子必须大于0");
128         }
129         return redisTemplate.opsForValue().increment(key, delta);
130     }
131 
132     /**
133      * 递减
134      * @param key 键
135      * @param delta 要减少几(小于0)
136      * @return
137      */
138     public long decr(String key, long delta){
139         if(delta<0){
140             throw new RuntimeException("递减因子必须大于0");
141         }
142         return redisTemplate.opsForValue().increment(key, -delta);
143     }
144 
145     //================================Map=================================
146     /**
147      * HashGet
148      * @param key 键 不能为null
149      * @param item 项 不能为null
150      * @return151      */
152     public Object hget(String key,String item){
153         return redisTemplate.opsForHash().get(key, item);
154     }
155 
156     /**
157      * 获取hashKey对应的所有键值
158      * @param key 键
159      * @return 对应的多个键值
160      */
161     public Map<Object,Object> hmget(String key){
162         return redisTemplate.opsForHash().entries(key);
163     }
164 
165     /**
166      * HashSet
167      * @param key 键
168      * @param map 对应多个键值
169      * @return true 成功 false 失败
170      */
171     public boolean hmset(String key, Map<String,Object> map){
172         try {
173             redisTemplate.opsForHash().putAll(key, map);
174             return true;
175         } catch (Exception e) {
176             e.printStackTrace();
177             return false;
178         }
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             if(time>0){
192                 expire(key, time);
193             }
194             return true;
195         } catch (Exception e) {
196             e.printStackTrace();
197             return false;
198         }
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             return false;
215         }
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     /**
240      * 删除hash表中的值
241      * @param key 键 不能为null
242      * @param item 项 可以使多个 不能为null
243      */
244     public void hdel(String key, Object... item){
245         redisTemplate.opsForHash().delete(key,item);
246     }
247 
248     /**
249      * 判断hash表中是否有该项的值
250      * @param key 键 不能为null
251      * @param item 项 不能为null
252      * @return true 存在 false不存在
253      */
254     public boolean hHasKey(String key, String item){
255         return redisTemplate.opsForHash().hasKey(key, item);
256     }
257 
258     /**
259      * hash递增 如果不存在,就会创建一个 并把新增后的值返回
260      * @param key 键
261      * @param item 项
262      * @param by 要增加几(大于0)
263      * @return
264      */
265     public double hincr(String key, String item,double by){
266         return redisTemplate.opsForHash().increment(key, item, by);
267     }
268 
269     /**
270      * hash递减
271      * @param key 键
272      * @param item 项
273      * @param by 要减少记(小于0)
274      * @return
275      */
276     public double hdecr(String key, String item,double by){
277         return redisTemplate.opsForHash().increment(key, item,-by);
278     }
279 
280     //============================set=============================
281     /**
282      * 根据key获取Set中的所有值
283      * @param key 键
284      * @return
285      */
286     public Set<Object> sGet(String key){
287         try {
288             return redisTemplate.opsForSet().members(key);
289         } catch (Exception e) {
290             e.printStackTrace();
291             return null;
292         }
293     }
294 
295     /**
296      * 根据value从一个set中查询,是否存在
297      * @param key 键
298      * @param value 值
299      * @return true 存在 false不存在
300      */
301     public boolean sHasKey(String key,Object value){
302         try {
303             return redisTemplate.opsForSet().isMember(key, value);
304         } catch (Exception e) {
305             e.printStackTrace();
306             return false;
307         }
308     }
309 
310     /**
311      * 将数据放入set缓存
312      * @param key 键
313      * @param values 值 可以是多个
314      * @return 成功个数
315      */
316     public long sSet(String key, Object...values) {
317         try {
318             return redisTemplate.opsForSet().add(key, values);
319         } catch (Exception e) {
320             e.printStackTrace();
321             return 0;
322         }
323     }
324 
325     /**
326      * 将set数据放入缓存
327      * @param key 键
328      * @param time 时间(秒)
329      * @param values 值 可以是多个
330      * @return 成功个数
331      */
332     public long sSetAndTime(String key,long time,Object...values) {
333         try {
334             Long count = redisTemplate.opsForSet().add(key, values);
335             if(time>0) {
336                 expire(key, time);
337             }
338             return count;
339         } catch (Exception e) {
340             e.printStackTrace();
341             return 0;
342         }
343     }
344 
345     /**
346      * 获取set缓存的长度
347      * @param key 键
348      * @return
349      */
350     public long sGetSetSize(String key){
351         try {
352             return redisTemplate.opsForSet().size(key);
353         } catch (Exception e) {
354             e.printStackTrace();
355             return 0;
356         }
357     }
358 
359     /**
360      * 移除值为value的
361      * @param key 键
362      * @param values 值 可以是多个
363      * @return 移除的个数
364      */
365     public long setRemove(String key, Object ...values) {
366         try {
367             Long count = redisTemplate.opsForSet().remove(key, values);
368             return count;
369         } catch (Exception e) {
370             e.printStackTrace();
371             return 0;
372         }
373     }
374     //===============================list=================================
375 
376     /**
377      * 获取list缓存的内容
378      * @param key 键
379      * @param start 开始
380      * @param end 结束  0 到 -1代表所有值
381      * @return
382      */
383     public List<Object> lGet(String key, long start, long end){
384         try {
385             return redisTemplate.opsForList().range(key, start, end);
386         } catch (Exception e) {
387             e.printStackTrace();
388             return null;
389         }
390     }
391 
392     /**
393      * 获取list缓存的长度
394      * @param key 键
395      * @return
396      */
397     public long lGetListSize(String key){
398         try {
399             return redisTemplate.opsForList().size(key);
400         } catch (Exception e) {
401             e.printStackTrace();
402             return 0;
403         }
404     }
405 
406     /**
407      * 通过索引 获取list中的值
408      * @param key 键
409      * @param index 索引  index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推
410      * @return
411      */
412     public Object lGetIndex(String key,long index){
413         try {
414             return redisTemplate.opsForList().index(key, index);
415         } catch (Exception e) {
416             e.printStackTrace();
417             return null;
418         }
419     }
420 
421     /**
422      * 将list放入缓存
423      * @param key 键
424      * @param value 值
425      * @return
426      */
427     public boolean lSet(String key, Object value) {
428         try {
429             redisTemplate.opsForList().rightPush(key, value);
430             return true;
431         } catch (Exception e) {
432             e.printStackTrace();
433             return false;
434         }
435     }
436 
437     /**
438      * 将list放入缓存
439      * @param key 键
440      * @param value 值
441      * @param time 时间(秒)
442      * @return
443      */
444     public boolean lSet(String key, Object value, long time) {
445         try {
446             redisTemplate.opsForList().rightPush(key, value);
447             if (time > 0) {
448                 expire(key, time);
449             }
450             return true;
451         } catch (Exception e) {
452             e.printStackTrace();
453             return false;
454         }
455     }
456 
457     /**
458      * 将list放入缓存
459      * @param key 键
460      * @param value 值
461      * @return
462      */
463     public boolean lSet(String key, List<Object> value) {
464         try {
465             redisTemplate.opsForList().rightPushAll(key, value);
466             return true;
467         } catch (Exception e) {
468             e.printStackTrace();
469             return false;
470         }
471     }
472 
473     /**
474      * 将list放入缓存
475      * @param key 键
476      * @param value 值
477      * @param time 时间(秒)
478      * @return
479      */
480     public boolean lSet(String key, List<Object> value, long time) {
481         try {
482             redisTemplate.opsForList().rightPushAll(key, value);
483             if (time > 0) {
484                 expire(key, time);
485             }
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 
527     /**
528      * 模糊查询获取key值
529      * @param pattern
530      * @return
531      */
532     public Set keys(String pattern){
533         return redisTemplate.keys(pattern);
534     }
535 
536     /**
537      * 使用Redis的消息队列
538      * @param channel
539      * @param message 消息内容
540      */
541     public void convertAndSend(String channel, Object message){
542         redisTemplate.convertAndSend(channel,message);
543     }
544 
545 
546     //=========BoundListOperations 用法 start============
547 
548     /*    *//**
549      *将数据添加到Redis的list中(从右边添加)
550      * @param listKey
551      * @param expireEnum 有效期的枚举类
552      * @param values 待添加的数据
553      *//*
554     public void addToListRight(String listKey, Status.ExpireEnum expireEnum, Object... values) {
555         //绑定操作
556         BoundListOperations<String, Object> boundValueOperations = redisTemplate.boundListOps(listKey);
557         //插入数据
558         boundValueOperations.rightPushAll(values);
559         //设置过期时间
560         boundValueOperations.expire(expireEnum.getTime(),expireEnum.getTimeUnit());
561     }*/
562     /**
563      * 根据起始结束序号遍历Redis中的list
564      * @param listKey
565      * @param start  起始序号
566      * @param end  结束序号
567      * @return
568      */
569     public List<Object> rangeList(String listKey, long start, long end) {
570         //绑定操作
571         BoundListOperations<String, Object> boundValueOperations = redisTemplate.boundListOps(listKey);
572         //查询数据
573         return boundValueOperations.range(start, end);
574     }
575     /**
576      * 弹出右边的值 --- 并且移除这个值
577      * @param listKey
578      */
579     public Object rifhtPop(String listKey){
580         //绑定操作
581         BoundListOperations<String, Object> boundValueOperations = redisTemplate.boundListOps(listKey);
582         return boundValueOperations.rightPop();
583     }
584 
585 }

6.使用自定义Redis工具类

@Autowired
private RedisUtils redisUtils;

完事!!!

以上是关于超简单!!!SpringBoot整合Redis的主要内容,如果未能解决你的问题,请参考以下文章

(超详解)SpringBoot初级部分-整合其他框架-04

SpringBoot整合Redis实现简单的Pub/Sub(发布/订阅)

springBoot整合thymeleaf(超简单)

springboot 整合redis 以及redis的简单使用

Vue+SpringBoot超详细!一周开发一个SpringBoot + Vue+MybatisPlus+Shiro+JWT+Redis前后端分离个人博客项目!!!项目完结

Vue+SpringBoot超详细!一周开发一个SpringBoot + Vue+MybatisPlus+Shiro+JWT+Redis前后端分离个人博客项目!!!项目完结