cache數據緩存到Redis


直接代碼,這里沒有使用bean類

項目結構:

  1.引入maven依賴

<properties>
        <java.version>1.8</java.version>
        <mybatis.version>2.1.0</mybatis.version>
        <artifactId>springboot-redis</artifactId>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>net.sf.json-lib</groupId>
            <artifactId>json-lib</artifactId>
            <version>2.4</version>
            <classifier>jdk15</classifier>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.39</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>${mybatis.version}</version>
        </dependency>
        <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>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-cache</artifactId>
        </dependency>
    </dependencies>

  2.配置文件 application.properties(也可配置到文件  application.yml

#數據庫的連接
spring.datasource.url=jdbc:mysql://localhost:3306/work?serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# Redis數據庫索引(默認為0)
spring.redis.database=0
# Redis服務器地址
spring.redis.host=127.0.0.1
# Redis服務器連接端口
spring.redis.port=6379
# Redis服務器連接密碼(默認為空)
spring.redis.password=
# 連接池最大連接數(使用負值表示沒有限制)
spring.redis.jedis.pool.max-active=8
# 連接池最大阻塞等待時間(使用負值表示沒有限制)
spring.redis.jedis.pool.max-wait=-1ms
# 連接池中的最大空閑連接
spring.redis.jedis.pool.max-idle=8
# 連接池中的最小空閑連接
spring.redis.jedis.pool.min-idle=0
# 連接超時時間(毫秒)
spring.redis.timeout=10000ms

logging.level.com.lh.springboot.mapper=debug

  3.配置文件application.yml   (也可配置到文件  application.properties

mybatis:
  config-location: classpath:/mybatis/mybatis-config.xml     # mybatis-config.xml 的文件地址
  mapper-locations: classpath:/mybatis/mapper/*.xml      # 所有以.xml 結尾的文件

  4.配置主程序的運行類  (Springbootweb02Application)

    

 

 

     1).  @MapperScan(value = "com.lh.springboot.mapper")

        該注解的意思是:指定要變成實現類的接口所在的包,然后包下面的所有接口在編譯之后都會生成相應的實現類

    2). @EnableCaching

        該注解的意思是:開啟緩存管理功能

     3). @SpringBootApplication

       該注解的意思是:這個類是主程序類

  5.配置config包下的類

//配置文件 RedisConfig
package com.lh.springboot.config;

import org.springframework.cache.CacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
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.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import java.time.Duration;

@Configuration //用於定義配置類,可替換xml配置文件,被注解的類內部包含有一個或多個被@Bean注解的方法
public class RedisConfig {

@Bean
public RedisTemplate<Object, Object> empRedisTemplate(RedisConnectionFactory redisConnectionFactory)throws Exception {
RedisTemplate<Object,Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
// Json序列化配置
Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<Object>(Object.class);
template.setDefaultSerializer(serializer);
return template;
}

@Bean
public CacheManager cacheManager(RedisConnectionFactory factory){
RedisCacheConfiguration cacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofSeconds(600)) //存入Redis的時間設置600秒
//.entryTtl(Duration.ofDays(1))
.disableCachingNullValues()
.serializeKeysWith(RedisSerializationContext.SerializationPair
.fromSerializer(new StringRedisSerializer()))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));
return RedisCacheManager.builder(factory).cacheDefaults(cacheConfiguration).build();}
}

 

  

//配置文件 Myconfig 
package com.lh.springboot.config; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; /** * @program: springbootweb01 * @description: 配置類 * @author: li hui * @create: 2020-12-18 19:52 */ //@EnableWebMvc 全面接管mvc @Configuration public class MyConfig extends WebMvcConfigurationSupport {
  //該類可不寫 }

 

  

 

  6.創建 mapper(包)下的UsersDao接口

   

 

//UserDao的接口
package com.lh.springboot.mapper; import org.apache.ibatis.annotations.Mapper; import java.util.List; import java.util.Map; @Mapper //該注解是在編譯之后會生成相應的接口實現類 (在主程序類注解了 @MapperScan() 在此處就可以省略) public interface UsersDao{ Object test(Map map); Integer updTest(Map map); Integer delTest(Map map); List<?> queryTest(); }

 7.配置 mybatis包下的文件

  

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--mybatis-config.xml 文件--> <!--<settings> <!– 打印查詢語句 –> <setting name="logImpl" value="STDOUT_LOGGING" /> </settings>--> <!--mybatis的插件配置--> </configuration>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lh.springboot.mapper.UsersDao">  <!--UserDao接口的全路徑-->
  <!--UsersMapper.xml文件-->
    <select id="test" parameterType="map" resultType="map">
        select * from users where id=#{id};
    </select>

    <update id="updTest" parameterType="map">
        update users  set username=#{username},password=#{password},phone=#{phone},IDnumber=#{IDnumber} where id=#{id}
    </update>

    <delete id="delTest" parameterType="map">
        delete from users where id=#{id}
    </delete>
    <select id="queryTest" resultType="map">
        select username,password,phone,IDnumber,id from users
    </select>
</mapper>

 8.創建service包下的接口和  impl包下的實現類

         

//UserService 的接口
package com.lh.springboot.service; import java.util.List; import java.util.Map; public interface UsersService{ Object test(Map map); Map updTest(Map map); Integer delTest(Map map); List<?> queryTest(); }
//UsersServiceImpl (實現UsersService接口) 緩存注解也在本類來執行
package com.lh.springboot.service.impl; import com.lh.springboot.mapper.UsersDao; import com.lh.springboot.service.UsersService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.CachePut; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import java.util.List; import java.util.Map; @Service("usersService") public class UsersServiceImpl implements UsersService { private final UsersDao usersDao; @Autowired public UsersServiceImpl(UsersDao usersDao) { this.usersDao = usersDao; } @Override @Cacheable(cacheNames = {"test"}, key = "'user_'+#map.get('id')",unless="#result==null") public Object test(Map map) { System.out.println("測試query"); return usersDao.test(map); } @Override @CachePut(cacheNames = {"test"}, key = "'user_'+#map.get('id')",unless="#result==null") public Map updTest(Map map) { System.out.println("測試upd"); Integer integer = usersDao.updTest(map); if(integer==1){ return map; }else { return null; } } @Override @CacheEvict(cacheNames = "test", key = "'user_'+#map.get('id')",allEntries=false,beforeInvocation=false) public Integer delTest(Map map) { System.out.println("測試del"); return usersDao.delTest(map); } @Override @Cacheable(cacheNames = {"queryTest"},unless="#result==null") public List<?> queryTest() {
     System.out.println("測試query全查") List<?> objects = usersDao.queryTest(); if(objects.size()<=0){ return null; }else { return objects; } }
  /*  @Cacheable
        將方法的運行結果進行緩存 @Cacheable
        以后再要相同的數據
        直接從緩存中獲取
        就不用在執行方法了

        幾個屬性
                value/cacheNames 指定緩存的名字
                key 緩存數據使用的key,默認使用方法參數的值
                keyGenerator:key的生成器,可以自己指定key的生成器的組件id
                        key/keyGenerator: 二選一
                cacheManager:指定緩存管理器 或者cacheResolver指定緩存解析器  二選一
                condition:指定符合條件的情況下才緩存
                unless:否定緩存,當unless指定的條件是true,我們的方法返回值就不會被緩存 可以獲取到結果進行判斷
                sync:是否使用異步模式
     */

     /*
        @CachePut    緩存更新 
        @CacheEvict   清楚緩存
      */
}

  9.創建controller包下的類

       

package com.lh.springboot.controller;

import com.alibaba.fastjson.JSON;
import com.lh.springboot.service.UsersService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

@Controller
@Scope("prototype")
public class UsersController{


    private final UsersService usersService;

    @Autowired
    public UsersController(UsersService usersService) {
        this.usersService = usersService;
    }


    @GetMapping(value = "/aa")
    @ResponseBody
    public Object aa(@RequestParam Map map){
        return usersService.test(map);
    }


    @GetMapping(value = "/bb")
    @ResponseBody
    public Map bb(@RequestParam Map map){
        return usersService.updTest(map);
    }

    @GetMapping(value = "/cc")
    @ResponseBody
    public Integer cc(@RequestParam Map map){
        return usersService.delTest(map);
    }

    @GetMapping(value = "/dd")
    @ResponseBody
    public String dd(){
        List<?> objects = usersService.queryTest();
        return JSON.toJSONString(objects);
    }
}

  10.啟動主程序類

 

 

  

 

 

   11,打開網頁進行測試

 

      1.mysql數據庫的值為

        

 

 

       2.啟動Redis數據庫  (此時無數據)

        

 

 

       3.訪問   http://127.0.0.1:8080/aa?id=1     返回id為1的數據 

        

      1)查看Redis的數據 此時數據存到了Redis里有效時間600秒

      

 

       2)查看控制台上的輸出

      

 

       可以看出,程序訪問了mysql數據表

      3)刷新頁面  再次查看控制台輸出

 

        

 

       4)修改數據(修改緩存) 查看控制台輸出     http://127.0.0.1:8080/bb?username=00&password=00&phone=00&IDnumber=00&id=1

        

 

         

 

         

          可以看出 我修改一條數據控制台也有打印,Redis的值也隨着發生變化
       5)再次查詢id為1的數據    http://127.0.0.1:8080/aa?id=1

        

 

            再次查看控制台

        

 

         當我們修改結束,再次查看數據,沒有輸出   就是直接查的是Redis的緩存數據沒有查詢mysql的表數據

      6)清除緩存  http://127.0.0.1:8080/cc?id=1     (刪除id為1的數據)

        

 

         刪除成功

        

 

         

 

         Redis數據也確實刪除了

        我們再次查詢刪除的id為1的數據

        

 

         緩存也清除成功!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM