首頁 > 軟體

SpringBoot使用Redis快取MySql的方法步驟

2022-02-22 13:02:08

1 專案組成

  • 應用:springboot rest api
  • 資料庫:mysql
  • jdbc框架:jpa
  • 快取中介軟體:redis

2 執行springboot

2.1 官網download最基本的restful應用

教學地址:https://spring.io/guides/gs/rest-service/

直接download成品,找到git命令 :git clone https://github.com/spring-guides/gs-rest-service.git

建立一個資料夾,開啟git bash here(安裝git)

Idea開啟成品 (complete資料夾)

2.2 執行應用

gradle -> bootRun右鍵 -> Run/Deubg

通過http://localhost:8080/greeting?name=lanxingisthebest存取

3 存取mysql

增加gradle依賴 (通過jpa)

implementation(‘mysql:mysql-connector-java')
implementation(‘org.springframework.boot:spring-boot-starter-data-jpa')

增加組態檔及資料庫設定

建立檔案application.yml

spring:
 datasource:
   url: jdbc:mysql://localhost:3306/user_info
   username: root
   password: root
 jpa:
   show-sql: true

類調整

mysql insert一條資料,然後通過 http://localhost:8080/listAllUser 查詢資料庫

4 設定redis快取

增加gradle依賴

implementation(‘org.springframework.boot:spring-boot-starter-data-redis')
implementation(‘org.springframework.boot:spring-boot-starter-cache')

組態檔設定redis引數

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/user_info
    username: root
    password: root
  jpa:
    show-sql: true
  ## Redis 設定
  redis:
    ## Redis資料庫索引(預設為0)
    database: 0
    ## Redis伺服器地址
    host: localhost
    ## Redis伺服器連線埠
    port: 6379
    ## Redis伺服器連線密碼(預設為空)
    password:
    jedis:
      pool:
        ## 連線池最大連線數(使用負值表示沒有限制)
        #spring.redis.pool.max-active=8
        max-active: 8
        ## 連線池最大阻塞等待時間(使用負值表示沒有限制)
        #spring.redis.pool.max-wait=-1
        max-wait: -1
        ## 連線池中的最大空閒連線
        #spring.redis.pool.max-idle=8
        max-idle: 8
        ## 連線池中的最小空閒連線
        #spring.redis.pool.min-idle=0
        min-idle: 0
    ## 連線超時時間(毫秒)
    timeout: 1200

Redis設定類

RedisConfig程式碼

package com.example.restservice.config;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
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.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.cache.RedisCacheWriter;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.*;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import java.time.Duration;

/**
 * @author lzh
 * create 2019-09-24-15:07
 */
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {

    /**
     * 選擇redis作為預設快取工具
     * @param redisConnectionFactory
     * @return
     */
    /*@Bean
    //springboot 1.xx
    public CacheManager cacheManager(RedisTemplate redisTemplate) {
        RedisCacheManager rcm = new RedisCacheManager(redisTemplate);
        return rcm;
    }*/
    @Bean
    public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
        RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofHours(1)); // 設定快取有效期一小時
        return RedisCacheManager
                .builder(RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory))
                .cacheDefaults(redisCacheConfiguration).build();
    }

    /**
     * retemplate相關設定
     * @param factory
     * @return
     */
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {

        RedisTemplate<String, Object> template = new RedisTemplate<>();
        // 設定連線工廠
        template.setConnectionFactory(factory);

        //使用Jackson2JsonRedisSerializer來序列化和反序列化redis的value值(預設使用JDK的序列化方式)
        Jackson2JsonRedisSerializer jacksonSeial = new Jackson2JsonRedisSerializer(Object.class);

        ObjectMapper om = new ObjectMapper();
        // 指定要序列化的域,field,get和set,以及修飾符範圍,ANY是都有包括private和public
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        // 指定序列化輸入的型別,類必須是非final修飾的,final修飾的類,比如String,Integer等會跑出異常
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jacksonSeial.setObjectMapper(om);

        // 值採用json序列化
        template.setValueSerializer(jacksonSeial);
        //使用StringRedisSerializer來序列化和反序列化redis的key值
        template.setKeySerializer(new StringRedisSerializer());

        // 設定hash key 和value序列化模式
        template.setHashKeySerializer(new StringRedisSerializer());
        template.setHashValueSerializer(jacksonSeial);
        template.afterPropertiesSet();

        return template;
    }

    /**
     * 對hash型別的資料操作
     *
     * @param redisTemplate
     * @return
     */
    @Bean
    public HashOperations<String, String, Object> hashOperations(RedisTemplate<String, Object> redisTemplate) {
        return redisTemplate.opsForHash();
    }

    /**
     * 對redis字串型別資料操作
     *
     * @param redisTemplate
     * @return
     */
    @Bean
    public ValueOperations<String, Object> valueOperations(RedisTemplate<String, Object> redisTemplate) {
        return redisTemplate.opsForValue();
    }

    /**
     * 對連結串列型別的資料操作
     *
     * @param redisTemplate
     * @return
     */
    @Bean
    public ListOperations<String, Object> listOperations(RedisTemplate<String, Object> redisTemplate) {
        return redisTemplate.opsForList();
    }

    /**
     * 對無序集合型別的資料操作
     *
     * @param redisTemplate
     * @return
     */
    @Bean
    public SetOperations<String, Object> setOperations(RedisTemplate<String, Object> redisTemplate) {
        return redisTemplate.opsForSet();
    }

    /**
     * 對有序集合型別的資料操作
     *
     * @param redisTemplate
     * @return
     */
    @Bean
    public ZSetOperations<String, Object> zSetOperations(RedisTemplate<String, Object> redisTemplate) {
        return redisTemplate.opsForZSet();
    }
}

程式碼通過@Cacheable使用 redis快取

存取介面後,通過redis工具查詢資料

點選 redis-lic.exe
命令 keys *

 到此這篇關於SpringBoot使用Redis快取MySql的方法步驟的文章就介紹到這了,更多相關SpringBoot Redis快取MySql內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com