第十六章:使用Redis作爲SpringBoot2項目數據緩存


感謝作者:https://www.jianshu.com/p/5a70b13a4fa7

本章目標

        實現SpringBoot項目中整合Redis非關係數據庫作爲內存緩存框架,並測試數據讀取源。


開啓Redis

        執行redis-server.exe redis.windows.conf



構建項目

    添加依賴Web, MySQL, JPA, Druid, Redis, Jedis支持

     <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依賴 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.9</version>
        </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>
        </dependency>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-redis</artifactId>
        </dependency>
        <!-- 添加Jedis支持 -->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.9.0</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-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>


配置Redis數據庫

        application.yml 配置(適用SpringBoot2)

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
    druid:
      #配置控制統計攔截的filters,去掉後監控界面sql將無法統計, wall用於防火牆
      filters: stat,wall
      #最大活躍數
      max-active: 20
      #初始化數量
      initial-size: 1
      #最小連接池數量
      min-idle: 1
      #最大連接等待超時時間
      max-wait: 60000
      #打開PSCache,並且指定每個連接PSCache的大小,mysql可以配置爲false
      pool-prepared-statements: false
      max-pool-prepared-statement-per-connection-size: 20
      #通過connectionProperties屬性來打開mergeSql功能;慢SQL記錄
      connection-properties: druid.stat.mergeSql=true;stat.slowSqlMillis=5000
      #配置間隔多久才進行一次檢測,檢測需要關閉的空閒連接,單位是毫秒
      time-between-eviction-runs-millis: 60000
      #配置一個連接在池中最小生存的時間,單位是毫秒
      min-evictable-idle-time-millis: 300000
      #用來檢測連接是否有效的sql
      validation-query: SELECT 'x'
      test-while-idle: true
      test-on-borrow: false
      test-on-return: false
      async-init: true
  jpa:
    properties:
      hibernate:
        show_sql: true
        format_sql: true

  #配置redis數據庫連接
  redis:
    host: 127.0.0.1
    port: 6379
    jedis:
      pool:
        #最大連接數
        max-active: 8
        #最大阻塞等待時間(負數表示沒限制)
        max-wait: -1ms
        #最大空閒
        max-idle: 8
        #最小空閒
        min-idle: 0
    #連接超時時間
    timeout: 10000ms
    #數據庫索引
    database: 0


配置CacheManager

        讓SpringBoot內置的緩存框架適用我們的Redis作爲新的緩存, 添加一個RedisConfiguration的配置類,

        SpringBoot2 略有不同, 具體配置如下:

/**
 * @author Ray
 * @date 2018/6/29 0029
 * 讓SpringBoot內置的緩存框架使用我們的Redis作爲新的緩存
 * 使用@EnableCaching註解來開啓我們的項目支持緩存
 */
@Configuration
@EnableCaching
public class RedisConfiguration {

    /**
     * 採用RedisCacheManager作爲緩存管理器
     * 爲了處理高可用Redis,可以使用RedisSentinelConfiguration來支持Redis Sentinel。
     */
    @Bean
    public CacheManager cacheManager(RedisConnectionFactory connectionFactory){
        RedisCacheManager redisCacheManager = RedisCacheManager.builder(connectionFactory).build();
        return redisCacheManager;
    }
}


測試Redis(一)

        訪問地址: http://localhost:8080/list

        再次訪問地址: http://localhost:8080/list

        可以看到只有一次輸出, 這個輸出還是我們上次訪問的時候執行的, 證明我們配置的Redis緩存已經生效.


自定義Key

        修改RedisConfiguration配置類, 繼承CachingConfigurerSupport類, 並重寫方法keyGenerator()

/**
 * @author Ray
 * @date 2018/6/29 0029
 * 讓SpringBoot內置的緩存框架使用我們的Redis作爲新的緩存
 */
@Configuration
@EnableCaching
public class RedisConfiguration extends CachingConfigurerSupport {

    /**
     * 採用RedisCacheManager作爲緩存管理器
     * 添加spring-data-redis依賴
     * 爲了處理高可用Redis,可以使用RedisSentinelConfiguration來支持Redis Sentinel。
     */
    @Bean
    public CacheManager cacheManager(RedisConnectionFactory connectionFactory){
        RedisCacheManager redisCacheManager = RedisCacheManager.builder(connectionFactory).build();
        return redisCacheManager;
    }

    /**
     * 自定義生成key的規則
     */
    @Override
    public KeyGenerator keyGenerator() {
        return new KeyGenerator() {
            @Override
            public Object generate(Object o, Method method, Object... objects) {
                // 格式化緩存key字符串
                StringBuilder stringBuilder = new StringBuilder();
                // 追加類名
                stringBuilder.append(o.getClass().getName());
                // 追加方法名
                stringBuilder.append(method.getName());
                // 遍歷參數並且追加
                for (Object obj :
                        objects) {
                    stringBuilder.append(obj.toString());
                }
                System.out.println("調用Redis緩存Key: " + stringBuilder.toString());
                return stringBuilder.toString();
            }
        };
    }
}


        再次訪問地址: http://localhost:8080/list

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章