zoukankan      html  css  js  c++  java
  • Spring Boot学习笔记——Spring Boot与Redis的集成

    一.添加Redis缓存

    1.添加Redis起步依赖

    在pom.xml中添加Spring Boot支持Redis的依赖配置,具体如下:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-redis</artifactId>
        <version>1.4.7.RELEASE</version>
    </dependency>
    

    https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-redis/1.4.7.RELEASE

    2.添加缓存注解

    (1) 在引导类DemoApplication.java中,添加@EnableCaching注解开启缓存,添加后的代码:
    DemoApplication.java:

    package com.zifeiy.demo;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cache.annotation.EnableCaching;
    
    @SpringBootApplication
    @EnableCaching
    public class DemoApplication {
    
    	public static void main(String[] args) {
    		SpringApplication.run(DemoApplication.class, args);
    	}
    }
    

    (2)在业务逻辑类UserServiceImpl的getAllUsers()方法上添加@Cacheable注解来支持缓存,添加后的实现代码如下:
    UserServiceImpl.java:

    	// 查询所有用户
    	@Override
    	@Cacheable(value="UserCache",key="'user.getAllUsers'")
    	public List<User> getAllUsers() {
    		return this.UserMapper.getAllUsers();
    	}
    

    需要注意的是,@Cacheable注解中的key属性除了需要被英文双引号引用外,还需要加入英文单引号,否则系统在执行缓存操作时将出错。
    如果忘了加单引号,最后运行起来可能就会报这样的错误:

    EL1008E: Property or field 'user' cannot be found on object of type 'org.springframework.cache.interceptor.CacheExpressionRootObject' - maybe not public or not valid?] with root cause
    

    3.使实体类实现可序列化接口

    为了便于数据的传输,需要将实体类User实现序列化接口Serializable,具体代码如下:

    public class User implements Serializable {
        private Integer id;
        private String username;
        private String address;
        ...
    

    4.制定Redis缓存主机地址

    通常情况下,Redis缓存与Web应用并非部署在一台机器上,此时就需要远程调用Redis。在application.properties中添加指定Redis所在主机及其端口号的配置,具体如下:

    spring.redis.host=127.0.0.1
    spring.redis.port=6379
    

    5.启动项目,测试缓存使用

    启动Redis服务,并启动本地项目,在浏览器地址栏中输入访问地址http://localhost:8080/user.html,Eclipse控制台中的显示信息如下:

    2018-05-20 11:10:03.486 DEBUG 9369 --- [nio-8080-exec-8] c.z.demo.mapper.UserMapper.getAllUsers   : ==>  Preparing: select * from tb_user 
    2018-05-20 11:10:03.519 DEBUG 9369 --- [nio-8080-exec-8] c.z.demo.mapper.UserMapper.getAllUsers   : ==> Parameters: 
    2018-05-20 11:10:03.574 DEBUG 9369 --- [nio-8080-exec-8] c.z.demo.mapper.UserMapper.getAllUsers   : <==      Total: 3
    

    可以看到,程序已经执行了SELECT语句,并查询出3条数据。此时如果刷新浏览器,系统将会再次执行查询操作。在没有使用Redis缓存之前,每刷新一次页面,都会执行一次查询数据库的操作,添加缓存后,会发现控制台中只出现了一次查询语句(我这里好像什么都没有出现),这也就说明所配置的Redis缓存已经生效。

    二、删除Redis缓存

    Redis中的数据不会一直存在,当执行添加、更新和删除操作后,数据库中的数据会发生变化,而Redis缓存中的数据同样也需要进行相应的变化。为了保证Redis缓存中的数据与数据库中的一致,通常需要在执行添加、更新和删除操作之前清除缓存,然后在下一次执行查询操作时,将新的数据存储到Redis缓存中。
    要实现清楚缓存的功能很简单,只需在相应方法中使用@CacheEvict注解即可。以删除用户为例,在用户业务逻辑类的deleteUser()方法上添加@CacheEvict注解信息,如下:
    UserServiceImpl.java:

    	// 删除用户
    	@Override
    	@CacheEvict(value="UserCache",key="'user.getAllUsers'")
    	public void deleteUser(Integer id) {
    		System.out.println("删除了id为 " + id + " 的用户");
    		this.UserMapper.delete(id);
    	}
    

    启动项目后,进入http://localhost:8080/user/delete/1就会删除id=1的用户信息。
    eclipse控制台的信息如下:

    2018-05-20 13:07:45.709 DEBUG 13739 --- [nio-8080-exec-1] c.zifeiy.demo.mapper.UserMapper.delete   : ==>  Preparing: DELETE FROM tb_user WHERE id=? 
    2018-05-20 13:07:45.761 DEBUG 13739 --- [nio-8080-exec-1] c.zifeiy.demo.mapper.UserMapper.delete   : ==> Parameters: 1(Integer)
    2018-05-20 13:07:45.773 DEBUG 13739 --- [nio-8080-exec-1] c.zifeiy.demo.mapper.UserMapper.delete   : <==    Updates: 1
    

    同时Redis中的缓存也会被相应地删除。

  • 相关阅读:
    第二次结对编程作业
    第一次结对编程作业
    第9组 团队展示
    第一次个人编程作业
    第一次博客作业
    2016-2017-1 20155215 信息安全技术 补课上测试
    2017-2018-1 20155215 第九周 加分项 PWD命令的实现
    2017-2018-1 20155215 《信息安全系系统设计基础》实验三
    2017-2018-1 20155215 《信息安全系统设计基础》第9周学习总结
    2017-2018-1 20155215 《信息安全系统设计基础》第8周学习总结
  • 原文地址:https://www.cnblogs.com/zifeiy/p/9063183.html
Copyright © 2011-2022 走看看