简介:  



  在项目中设计数据访问的时候往往都是采用直接访问数据库,采用数据库连接池来实现,但是如果我们的项目访问量过大或者访问过于频繁,将会对我们的数据库带来很大的压力。为了解决这个问题从而redis数据库脱颖而出,redis数据库出现时是以非关系数据库的光环展示在广大程序猿的面前的,后来redis的迭代版本支持了缓存数据、登录session状态(分布式session共享)等。所以又被作为内存缓存的形式应用到大型企业级项目中。



本文目标

实现SpringBoot项目中整合非关系数据库Redis作为内存缓存框架,并测试数据读取源。

Redis的安装:



 官网的redis仅支持Linux服务器的安装版本,由于开发人员都是在windows上工作,所以GitHub上的牛人基于linux平台下的Redis实现了windows版本。

  下载Windows版本Redis:

  我们直接访问github网址:github.com/MSOpenTech/redis/releases,下载最新的windows X64版本的压缩包。

开启Redis:

  解压完成后我们来开启Redis数据库,Redis数据库的默认端口是6379,如果已经被其他应用程序占用,请自行修改redis.windows.conf配置文件。

springboot的缓存管理_操作系统

springboot的缓存管理_spring_02

 一、创建项目:

项目依赖pom.xml,我们添加缓存的支持需要两个依赖,一个是SpringBoot内部的缓存配置、另外则是我们的redis缓存。




springboot的缓存管理_springboot的缓存管理_03

springboot的缓存管理_数据库_04

<?xml version="1.0" encoding="UTF-8"?>
<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.yuqiyu</groupId>
    <artifactId>chapter16</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>

    <name>chapter16</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--引入druid最新maven依赖-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.0.29</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <!--<scope>provided</scope>-->
        </dependency>
        <!-- 添加缓存支持 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-cache</artifactId>
        </dependency>
        <!-- 添加Redis缓存支持 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-redis</artifactId>
            <version>1.4.3.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>


View Code


springboot的缓存管理_spring_05

 数据库对应的实体类:




springboot的缓存管理_springboot的缓存管理_03

springboot的缓存管理_数据库_04

@Entity
@Table(name = "t_user")
public class UserEntity implements Serializable
{

    @Id
    @GeneratedValue
    @Column(name = "t_id")
    private Long id;

    @Column(name = "t_name")
    private String name;

    @Column(name = "t_age")
    private int age;

    @Column(name = "t_address")
    private String address;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}


View Code


  简单JPA接口



public interface UserJPA extends JpaRepository<UserEntity,Long>{

}



 

二、配置文件application.yml,数据库连接池、jpa、本地的redis数据库连接到项目中



spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8
    username: root
    password: root
    #最大活跃数
    maxActive: 20
    #初始化数量
    initialSize: 1
    #最大连接等待超时时间
    maxWait: 60000
    #打开PSCache,并且指定每个连接PSCache的大小
    poolPreparedStatements: true
    maxPoolPreparedStatementPerConnectionSize: 20
    #通过connectionProperties属性来打开mergeSql功能;慢SQL记录
    #connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
    minIdle: 1
    timeBetweenEvictionRunsMillis: 60000
    minEvictableIdleTimeMillis: 300000
    validationQuery: select 1 from dual
    testWhileIdle: true
    testOnBorrow: false
    testOnReturn: false
    #配置监控统计拦截的filters,去掉后监控界面sql将无法统计,'wall'用于防火墙
    filters: stat, wall, log4j
  jpa:
    properties:
      hibernate:
        show_sql: true
        format_sql: true
  #配置redis数据库连接
  redis:
    host: 127.0.0.1
    port: 6379
    pool:
      max-idle: 20
      min-idle: 1
      max-active: 20
      max-wait: 60000
    database: 0 #默认是索引为的0的数据库



三、创建一个业务逻辑服务类:UserService,我们在Service内添加redis的缓存支持

 @CacheConfig:该注解是用来开启声明的类参与缓存,如果方法内的@Cacheable注解没有添加key值,那么会自动使用cahceNames配置参数并且追加方法名。
  @Cacheable:配置方法的缓存参数,可自定义缓存的key以及value。



@Service
@CacheConfig(cacheNames = "user")
public class UserService {

    @Autowired
    private UserJPA userJPA;

    @Cacheable
    public List<UserEntity> list()
    {
        return userJPA.findAll();
    }
}



四、配置CacheManager

  让SpringBoot内置的缓存框架使用我们的Redis作为新的缓存,我们来添加一个RedisConfiguration的配置类。

  使用@EnableCaching注解来开启我们的项目支持缓存,我们在配置类内添加了方法cacheManager(),方法的返回值则是使用了我们的Redis缓存的管理器,SpringBoot项目启动时就会去找自定义配置的CacheManager对象并且自动应用到项目中。

  自定义Key:我们打开RedisConfiguration配置类,添加继承CachingConfigurerSupport类,并重写方法keyGenerator()。

使用@EnableCaching注解来开启我们的项目支持缓存,我们在配置类内添加了方法cacheManager(),方法的返回值则是使用了我们的Redis缓存的管理器,SpringBoot项目启动时就会去找自定义配置的CacheManager对象并且自动应用到项目中。



@Configuration
@EnableCaching
public class RedisConfiguration extends CachingConfigurerSupport
{

    /**
     * 自定义生成key的规则
     * @return
     */
    @Override
    public KeyGenerator keyGenerator() {
        return new KeyGenerator() {
            @Override
            public Object generate(Object o, Method method, Object... objects) {
                //格式化缓存key字符串
                StringBuilder sb = new StringBuilder();
                //追加类名
                sb.append(o.getClass().getName());
                //追加方法名
                sb.append(method.getName());
                //遍历参数并且追加
                for (Object obj : objects) {
                    sb.append(obj.toString());
                }
                System.out.println("调用Redis缓存Key : " + sb.toString());
                return sb.toString();
            }
        };
    }
    /**
     * 采用RedisCacheManager作为缓存管理器
     * @param redisTemplate
     * @return
     */
    @Bean
    public CacheManager cacheManager(RedisTemplate redisTemplate) {
        return new RedisCacheManager(redisTemplate);
    }
}



 

测试:

springboot的缓存管理_java_08

 

springboot的缓存管理_springboot的缓存管理_09

对比可以看出,再次刷新网页,并没有SQL语句输出,说明不是从数据库中查出的,而是从Redis缓存中获得。

springboot的缓存管理_springboot的缓存管理_10

 

 



Redis数据库内有很多个命令下面我简单介绍几个大家在日常开发中常用到的。

  flushdb:清空当前数据库。
  select [index]:选择索引数据库,index为索引值名,如:select 1。
  del [key]:删除一条指定key的值。
  keys *:查看数据库内所有的key。
  flushall:清空所有数据库。
  quit:退出客户端连接。