spring boot 集成redis

本文章牵涉到的技术点比较多:Spring Data JPA、Redis、Spring MVC,Spirng Cache,所以在看这篇文章的时候,需要对以上这些技术点有一定的了解或者也可以先看看这篇文章,针对文章中实际的技术点在进一步了解(注意,您需要自己下载Redis Server到您的本地,所以确保您本地的Redis可用,这里还使用了MySql数据库,当然你也可以内存数据库进行测试)。这篇文章会提供对应的Eclipse代码示例,具体大体的分如下几个步骤:

1)新建Java Maven Project;

(2)在pom.xml中添加相应的依赖包;

(3)编写Spring Boot启动类;

(4)配置application.properties;

(5)编写RedisCacheConfig配置类;

(6)编写DemoInfo测试实体类;

(7)编写DemoInfoRepository持久化类;

(8)编写DemoInfoService类;

(9)编写DemoInfoController类;

(10)测试代码是否正常运行了

(11)自定义缓存key;

1)新建Java Maven Project;

这个步骤就不细说,新建一个spring-boot-redis Java maven project;

2)在pom.xml中添加相应的依赖包;

在Maven中添加相应的依赖包,主要有:spring boot 父节点依赖;spring boot web支持;缓存服务spring-context-support;添加redis支持;JPA操作数据库;mysql 数据库驱动,具体pom.xml文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
< project  xmlns = "http://maven.apache.org/POM/4.0.0" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" >
   < modelVersion >4.0.0</ modelVersion >
  
   < groupId >com.kfit</ groupId >
   < artifactId >spring-boot-redis</ artifactId >
   < version >0.0.1-SNAPSHOT</ version >
   < packaging >jar</ packaging >
  
   < name >spring-boot-redis</ name >
   < url >http://maven.apache.org</ url >
  
   < properties >
     < project.build.sourceEncoding >UTF-8</ project.build.sourceEncoding >
     <!-- 配置JDK编译版本. -->
     < java.version >1.8</ java.version >
   </ properties >
  
   <!-- spring boot 父节点依赖,
        引入这个之后相关的引入就不需要添加version配置,
         spring boot会自动选择最合适的版本进行添加。
     -->
     < parent >
        < groupId >org.springframework.boot</ groupId >
        < artifactId >spring-boot-starter-parent</ artifactId >
        < version >1.3.3.RELEASE</ version >
     </ parent >
  
  
   < dependencies >
        
         < dependency >
            < groupId >junit</ groupId >
            < artifactId >junit</ artifactId >
            < scope >test</ scope >
        </ dependency >
  
        <!-- spring boot web支持:mvc,aop... -->
        < dependency >
            < groupId >org.springframework.boot</ groupId >
            < artifactId >spring-boot-starter-web</ artifactId >
        </ dependency >
       
        <!--
            包含支持UI模版(Velocity,FreeMarker,JasperReports),
            邮件服务,
            脚本服务(JRuby),
            缓存Cache(EHCache),
            任务计划Scheduling(uartz)。
         -->
        < dependency >
           < groupId >org.springframework</ groupId >
           < artifactId >spring-context-support</ artifactId >
         </ dependency >
  
        <!-- 添加redis支持-->
        < dependency >
             < groupId >org.springframework.boot</ groupId >
             < artifactId >spring-boot-starter-redis</ artifactId >
         </ dependency >
       
        <!-- JPA操作数据库. -->
        < dependency >
           < groupId >org.springframework.boot</ groupId >
           < artifactId >spring-boot-starter-data-jpa</ artifactId >
         </ dependency >
       
        <!-- mysql 数据库驱动. -->
        < dependency >
           < groupId >mysql</ groupId >
           < artifactId >mysql-connector-java</ artifactId >
         </ dependency >
        
         <!-- 单元测试. -->
        < dependency >
             < groupId >org.springframework.boot</ groupId >
             < artifactId >spring-boot-starter-test</ artifactId >
             < scope >test</ scope >
         </ dependency >
       
   </ dependencies >
</ project >

上面是完整的pom.xml文件,每个里面都进行了简单的注释。

3)编写Spring Boot启动类(com.kfit.App);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.kfit;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
  * Spring Boot启动类;
  *
  * @author
  * @version v.0.1
  */
  
@SpringBootApplication
public class App {
        /**
         * -javaagent:.\lib\springloaded-1.2.4.RELEASE.jar -noverify
         * @param args
         */
        public static void main(String[] args) {
               SpringApplication.run(App.class, args);
        }
}

4)配置application.properties;

这里主要是配置两个资源,第一就是数据库基本信息;第二就是redis配置;第三就是JPA的配置;

Src/main/resouces/application.properties:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
########################################################
###datasource  配置MySQL数据源;
########################################################
spring.datasource.url = jdbc:mysql: //localhost:3306/test
spring.datasource.username = root
spring.datasource.password = root
spring.datasource.driverClassName = com.mysql.jdbc.Driver
spring.datasource.max-active= 20
spring.datasource.max-idle= 8
spring.datasource.min-idle= 8
spring.datasource.initial-size= 10
  
  
  
########################################################
###REDIS (RedisProperties) redis基本配置;
########################################################
# database name
spring.redis.database= 0
# server host1
spring.redis.host= 127.0 . 0.1  
# server password
#spring.redis.password=
#connection port
spring.redis.port= 6379
# pool settings ...
spring.redis.pool.max-idle= 8
spring.redis.pool.min-idle= 0
spring.redis.pool.max-active= 8
spring.redis.pool.max-wait=- 1
# name of Redis server
#spring.redis.sentinel.master=
# comma-separated list of host:port pairs
#spring.redis.sentinel.nodes=
 
########################################################
### Java Persistence Api 自动进行建表
########################################################
# Specify the DBMS
spring.jpa.database = MYSQL
# Show or not log  for  each sql query
spring.jpa.show-sql =  true
# Hibernate ddl auto (create, create-drop, update)
spring.jpa.hibernate.ddl-auto = update
# Naming strategy
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy
# stripped before adding them to the entity manager)
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect

5)编写RedisCacheConfig配置类;

缓存主要有几个要实现的类:其一就是CacheManager缓存管理器;其二就是具体操作实现类;其三就是CacheManager工厂类(这个可以使用配置文件配置的进行注入,也可以通过编码的方式进行实现);其四就是缓存key生产策略(当然Spring自带生成策略,但是在Redis客户端进行查看的话是系列化的key,对于我们肉眼来说就是感觉是乱码了,这里我们先使用自带的缓存策略)。

com.kfit.config/RedisCacheConfig:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package  com.kfit.config;
  
import  org.springframework.cache.CacheManager;
import  org.springframework.cache.annotation.CachingConfigurerSupport;
import  org.springframework.cache.annotation.EnableCaching;
import  org.springframework.context.annotation.Bean;
import  org.springframework.context.annotation.Configuration;
import  org.springframework.data.redis.cache.RedisCacheManager;
import  org.springframework.data.redis.connection.RedisConnectionFactory;
import  org.springframework.data.redis.core.RedisTemplate;
  
/**
  * redis 缓存配置;
  *
  * 注意:RedisCacheConfig这里也可以不用继承:CachingConfigurerSupport,也就是直接一个普通的Class就好了;
  *
  * 这里主要我们之后要重新实现 key的生成策略,只要这里修改KeyGenerator,其它位置不用修改就生效了。
  *
  * 普通使用普通类的方式的话,那么在使用@Cacheable的时候还需要指定KeyGenerator的名称;这样编码的时候比较麻烦。
  *
 
  * @version v.0.1
  */
@Configuration
@EnableCaching //启用缓存,这个注解很重要;
publicclass RedisCacheConfig  extends  CachingConfigurerSupport {
    
    
     /**
      * 缓存管理器.
      * @param redisTemplate
      * @return
      */
     @Bean
     public  CacheManager cacheManager(RedisTemplate<?,?> redisTemplate) {
        CacheManager cacheManager =  new  RedisCacheManager(redisTemplate);
        returncacheManager;
     }
  
    
     /**
      * redis模板操作类,类似于jdbcTemplate的一个类;
      *
      * 虽然CacheManager也能获取到Cache对象,但是操作起来没有那么灵活;
      *
      * 这里在扩展下:RedisTemplate这个类不见得很好操作,我们可以在进行扩展一个我们
      *
      * 自己的缓存类,比如:RedisStorage类;
      *
      * @param factory : 通过Spring进行注入,参数在application.properties进行配置;
      * @return
      */
     @Bean
     public  RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, String> redisTemplate =  new  RedisTemplate<String, String>();
        redisTemplate.setConnectionFactory(factory);
       
        //key序列化方式;(不然会出现乱码;),但是如果方法上有Long等非String类型的话,会报类型转换错误;
        //所以在没有自己定义key生成策略的时候,以下这个代码建议不要这么写,可以不配置或者自己实现ObjectRedisSerializer
        //或者JdkSerializationRedisSerializer序列化方式;
//     RedisSerializer<String> redisSerializer = new StringRedisSerializer();//Long类型不可以会出现异常信息;
//     redisTemplate.setKeySerializer(redisSerializer);
//     redisTemplate.setHashKeySerializer(redisSerializer);
       
        returnredisTemplate;
     }
  
}

在以上代码有很详细的注释,在这里还是在简单的提下:

RedisCacheConfig这里也可以不用继承:CachingConfigurerSupport,也就是直接一个普通的Class就好了;这里主要我们之后要重新实现 key的生成策略,只要这里修改KeyGenerator,其它位置不用修改就生效了。普通使用普通类的方式的话,那么在使用@Cacheable的时候还需要指定KeyGenerator的名称;这样编码的时候比较麻烦。


6)编写DemoInfo测试实体类;

编写一个测试实体类:com.kfit.bean.DemoInfo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package  com.kfit.bean;
  
import  java.io.Serializable;
import  javax.persistence.Entity;
import  javax.persistence.GeneratedValue;
import  javax.persistence.Id;
/**
  * 测试实体类,这个随便;
  *
  * @version v.0.1
  */
 
@Entity
 
public  class  DemoInfo   implements  Serializable{
     privatestaticfinallongserialVersionUID = 1L;
     @Id @GeneratedValue
     privatelongid;
     private  String name;
     private  String pwd;
     publiclong getId() {
        returnid;
     }
     publicvoid setId(longid) {
        this .id = id;
     }
     public  String getName() {
         returnname;
     }
     publicvoid setName(String name) {
        this .name = name;
     }
     public  String getPwd() {
        returnpwd;
     }
     publicvoid setPwd(String pwd) {
        this .pwd = pwd;
     }
    
     @Override
     public  String toString() {
        return "DemoInfo [id="  + id +  ", name="  + name +  ", pwd="  + pwd +  "]" ;
     }
}


(7)编写DemoInfoRepository持久化类;

 DemoInfoRepository使用Spirng Data JPA实现:

com.kfit.repository.DemoInfoRepository:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package  com.kfit.repository;
  
import  org.springframework.data.repository.CrudRepository;
  
import  com.kfit.bean.DemoInfo;
  
/**
  * DemoInfo持久化类
 
  * @version v.0.1
  */
publicinterface DemoInfoRepository  extends  CrudRepository<DemoInfo,Long> {
  
}


8)编写DemoInfoService类;

  编写DemoInfoService,这里有两个技术方面,第一就是使用Spring @Cacheable注解方式和RedisTemplate对象进行操作,具体代码如下:

com.kfit.service.DemoInfoService:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package  com.kfit.service;
  
import  com.kfit.bean.DemoInfo;
  
/**
  * demoInfo 服务接口
 
  * @version v.0.1
  */
publicinterface DemoInfoService {
    
     public  DemoInfo findById(longid);
    
     publicvoid deleteFromCache(longid);
  
     void  test();
}

com.kfit.service.impl.DemoInfoServiceImpl:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package  com.kfit.service.impl;
  
import  javax.annotation.Resource;
  
import  org.springframework.cache.annotation.CacheEvict;
import  org.springframework.cache.annotation.Cacheable;
import  org.springframework.data.redis.core.RedisTemplate;
import  org.springframework.data.redis.core.ValueOperations;
import  org.springframework.stereotype.Service;
  
import  com.kfit.bean.DemoInfo;
import  com.kfit.repository.DemoInfoRepository;
import  com.kfit.service.DemoInfoService;
  
/**
  *
  *DemoInfo数据处理类
  *
  * )
  * @version v.0.1
  */
@Service
publicclass DemoInfoServiceImpl  implements  DemoInfoService {
    
     @Resource
     private  DemoInfoRepository demoInfoRepository;
    
     @Resource
     private  RedisTemplate<String,String> redisTemplate;
    
     @Override
     publicvoid test(){
        ValueOperations<String,String> valueOperations = redisTemplate.opsForValue();
        valueOperations.set( "mykey4" "random1=" +Math.random());
        System.out.println(valueOperations.get( "mykey4" ));
     }
    
     //keyGenerator="myKeyGenerator"
     @Cacheable (value= "demoInfo" //缓存,这里没有指定key.
     @Override
     public  DemoInfo findById(longid) {
        System.err.println( "DemoInfoServiceImpl.findById()=========从数据库中进行获取的....id=" +id);
        returndemoInfoRepository.findOne(id);
     }
    
     @CacheEvict (value= "demoInfo" )
     @Override
     publicvoid deleteFromCache(longid) {
        System.out.println( "DemoInfoServiceImpl.delete().从缓存中删除." );
     }
    
}


9)编写DemoInfoController类;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package  com.kfit.controller;
  
import  org.springframework.beans.factory.annotation.Autowired;
import  org.springframework.stereotype.Controller;
import  org.springframework.web.bind.annotation.RequestMapping;
import  org.springframework.web.bind.annotation.ResponseBody;
  
import  com.kfit.bean.DemoInfo;
import  com.kfit.service.DemoInfoService;
  
/**
  * 测试类.
 
  * @version v.0.1
  */
@Controller
publicclass DemoInfoController {
    
     @Autowired
      DemoInfoService demoInfoService;
      
    
     @RequestMapping ( "/test" )
     public @ResponseBody  String test(){
         DemoInfo loaded = demoInfoService.findById( 1 );
System.out.println( "loaded=" +loaded);
DemoInfo cached = demoInfoService.findById( 1 );
         System.out.println( "cached=" +cached);
         loaded = demoInfoService.findById( 2 );
         System.out.println( "loaded2=" +loaded);
         return "ok" ;
     }
    
    
     @RequestMapping ( "/delete" )
     public @ResponseBody  String delete(longid){
         demoInfoService.deleteFromCache(id);
         return "ok" ;
     }
    
     @RequestMapping ( "/test1" )
     public @ResponseBody  String test1(){
         demoInfoService.test();
         System.out.println( "DemoInfoController.test1()" );
         return "ok" ;
     }
    
}


10)测试代码是否正常运行了

启动应用程序,访问地址:http://127.0.0.1:8080/test

查看控制台可以查看:

1
2
3
4
5
DemoInfoServiceImpl.findById()=========从数据库中进行获取的....id= 1
loaded=DemoInfo [id= 1 , name=张三, pwd= 123456 ]
cached=DemoInfo [id= 1 , name=张三, pwd= 123456 ]
DemoInfoServiceImpl.findById()=========从数据库中进行获取的....id= 2
loaded2=DemoInfo [id= 2 , name=张三, pwd= 123456 ]

如果你看到以上的打印信息的话,那么说明缓存成功了

访问地址:http://127.0.0.1:8080/test1

1
2
random1= 0.9985031320746356
DemoInfoController.test1()


二次访问:http://127.0.0.1:8080/test

1
2
3
loaded=DemoInfo [id= 1 , name=张三, pwd= 123456 ]
cached=DemoInfo [id= 1 , name=张三, pwd= 123456 ]
loaded2=DemoInfo [id= 2 , name=张三, pwd= 123456 ]

这时候所有的数据都是执行缓存的。

这时候执行删除动作:http://127.0.0.1:8080/delete?id=1

然后在访问:http://127.0.0.1:8080/test

1
2
3
4
DemoInfoServiceImpl.findById()=========从数据库中进行获取的....id= 1
loaded=DemoInfo [id= 1 , name=张三, pwd= 123456 ]
cached=DemoInfo [id= 1 , name=张三, pwd= 123456 ]
loaded2=DemoInfo [id= 2 , name=张三, pwd= 123456 ]


(11)自定义缓存key;

在com.kfit.config.RedisCacheConfig类中重写CachingConfigurerSupport中的keyGenerator ,具体实现代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
      * 自定义key.
      * 此方法将会根据类名+方法名+所有参数的值生成唯一的一个key,即使@Cacheable中的value属性一样,key也会不一样。
      */
     @Override
     public  KeyGenerator keyGenerator() {
        System.out.println( "RedisCacheConfig.keyGenerator()" );
        returnnew KeyGenerator() {
            @Override
            public  Object generate(Object o, Method method, Object... objects) {
               // This will generate a unique key of the class name, the method name
               //and all method parameters appended.
               StringBuilder sb =  new  StringBuilder();
               sb.append(o.getClass().getName());
               sb.append(method.getName());
               for  (Object obj : objects) {
                   sb.append(obj.toString());
               }
               System.out.println( "keyGenerator="  + sb.toString());
               returnsb.toString();
            }
        };
     }

这时候在redis的客户端查看key的话还是序列化的肉眼看到就是乱码了,那么我改变key的序列方式,这个很简单,redis底层已经有具体的实现类了,我们只需要配置下:

1
2
3
4
5
6
/key序列化方式;(不然会出现乱码;),但是如果方法上有Long等非String类型的话,会报类型转换错误;
//所以在没有自己定义key生成策略的时候,以下这个代码建议不要这么写,可以不配置或者自己实现ObjectRedisSerializer
//或者JdkSerializationRedisSerializer序列化方式;
        RedisSerializer<String> redisSerializer =  new  StringRedisSerializer(); //Long类型不可以会出现异常信息;
        redisTemplate.setKeySerializer(redisSerializer);
        redisTemplate.setHashKeySerializer(redisSerializer);

综上以上分析:RedisCacheConfig类的方法调整为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package  com.kfit.config;
  
import  java.lang.reflect.Method;
  
import  org.springframework.cache.CacheManager;
import  org.springframework.cache.annotation.CachingConfigurerSupport;
import  org.springframework.cache.annotation.EnableCaching;
import  org.springframework.cache.interceptor.KeyGenerator;
import  org.springframework.context.annotation.Bean;
import  org.springframework.context.annotation.Configuration;
import  org.springframework.data.redis.cache.RedisCacheManager;
import  org.springframework.data.redis.connection.RedisConnectionFactory;
import  org.springframework.data.redis.core.RedisTemplate;
import  org.springframework.data.redis.serializer.RedisSerializer;
import  org.springframework.data.redis.serializer.StringRedisSerializer;
  
/**
  * redis 缓存配置;
  *
  * 注意:RedisCacheConfig这里也可以不用继承:CachingConfigurerSupport,也就是直接一个普通的Class就好了;
  *
  * 这里主要我们之后要重新实现 key的生成策略,只要这里修改KeyGenerator,其它位置不用修改就生效了。
  *
  * 普通使用普通类的方式的话,那么在使用@Cacheable的时候还需要指定KeyGenerator的名称;这样编码的时候比较麻烦。
  *
 
  * @version v.0.1
  */
@Configuration
@EnableCaching //启用缓存,这个注解很重要;
publicclass RedisCacheConfig  extends  CachingConfigurerSupport {
    
     /**
      * 缓存管理器.
      * @param redisTemplate
      * @return
      */
     @Bean
     public  CacheManager cacheManager(RedisTemplate<?,?> redisTemplate) {
        CacheManager cacheManager =  new  RedisCacheManager(redisTemplate);
        returncacheManager;
     }
  
    
     /**
      * RedisTemplate缓存操作类,类似于jdbcTemplate的一个类;
      *
      * 虽然CacheManager也能获取到Cache对象,但是操作起来没有那么灵活;
      *
      * 这里在扩展下:RedisTemplate这个类不见得很好操作,我们可以在进行扩展一个我们
      *
      * 自己的缓存类,比如:RedisStorage类;
      *
      * @param factory : 通过Spring进行注入,参数在application.properties进行配置;
      * @return
      */
     @Bean
     public  RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, String> redisTemplate =  new  RedisTemplate<String, String>();
        redisTemplate.setConnectionFactory(factory);
       
        //key序列化方式;(不然会出现乱码;),但是如果方法上有Long等非String类型的话,会报类型转换错误;
        //所以在没有自己定义key生成策略的时候,以下这个代码建议不要这么写,可以不配置或者自己实现ObjectRedisSerializer
        //或者JdkSerializationRedisSerializer序列化方式;
        RedisSerializer<String> redisSerializer =  new  StringRedisSerializer(); //Long类型不可以会出现异常信息;
        redisTemplate.setKeySerializer(redisSerializer);
        redisTemplate.setHashKeySerializer(redisSerializer);
       
        returnredisTemplate;
     }
    
     /**
      * 自定义key.
      * 此方法将会根据类名+方法名+所有参数的值生成唯一的一个key,即使@Cacheable中的value属性一样,key也会不一样。
      */
     @Override
     public  KeyGenerator keyGenerator() {
        System.out.println( "RedisCacheConfig.keyGenerator()" );
        returnnew KeyGenerator() {
            @Override
            public  Object generate(Object o, Method method, Object... objects) {
               // This will generate a unique key of the class name, the method name
               //and all method parameters appended.
               StringBuilder sb =  new  StringBuilder();
               sb.append(o.getClass().getName());
               sb.append(method.getName());
               for  (Object obj : objects) {
                   sb.append(obj.toString());
               }
               System.out.println( "keyGenerator="  + sb.toString());
               returnsb.toString();
            }
        };
     }
  
}

这时候在访问地址:http://127.0.0.1:8080/test

这时候看到的Key就是:com.kfit.service.impl.DemoInfoServiceImplfindById1

在控制台打印信息是:

1
2
3
4
5
6
7
8
9
10
1 )keyGenerator=com.kfit.service.impl.DemoInfoServiceImplfindById1
2 )DemoInfoServiceImpl.findById()=========从数据库中进行获取的....id= 1
3 )keyGenerator=com.kfit.service.impl.DemoInfoServiceImplfindById1
4 )loaded=DemoInfo [id= 1 , name=张三, pwd= 123456 ]
5 )keyGenerator=com.kfit.service.impl.DemoInfoServiceImplfindById1
6 )cached=DemoInfo [id= 1 , name=张三, pwd= 123456 ]
7 )keyGenerator=com.kfit.service.impl.DemoInfoServiceImplfindById2
8 )keyGenerator=com.kfit.service.impl.DemoInfoServiceImplfindById2
10 )DemoInfoServiceImpl.findById()=========从数据库中进行获取的....id= 2
11 )loaded2=DemoInfo [id= 2 , name=张三, pwd= 123456 ]

其中@Cacheable,@CacheEvict下节进行简单的介绍,这节的东西实在是太多了,到这里就打住吧,剩下的就需要靠你们自己进行扩展了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值