SpringBoot系列十:SpringBoot整合Redis

聲明:本文來源於MLDN培訓視頻的課堂筆記,寫在這裏只是爲了方便查閱。java

一、概念:SpringBoot 整合 Redis web

二、背景redis

Redis 的數據庫的整合在 java 裏面提供的官方工具包:jedis,因此即使你如今使用的是 SpringBoot,那麼也繼續使用此開發包。spring

2.一、RedisTemplate 模版操做數據庫

在 Spring 支持的 Redis 操做之中提供有一個 RedisTemplate 處理程序類,利用這個類能夠很是方便的實現 Redis 的各類基本數 據操做。數組

一、 修改項目中的 pom.xml 配置文件,追加 redis 的依賴引用:併發

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

二、 若是要想使用 Redis 操做,則必定要修改 application.yml 配置文件,在這個配置文件之中要進行 Redis 的各類鏈接配置處理;app

spring:
  redis:
    host: 192.168.68.166
    port: 6379
    password: studyjava
    timeout: 1000
    database: 0
    pool:
      max-active: 10
      max-idle: 8
      min-idle: 2
      max-wait: 100

三、 下面就能夠經過程序來利用 RedisTemplate 模版進行數據處理了,由於以上的配置一旦完成以後會在 Spring 內部幫助用戶直接 得到一個 RedisTemplate 模版處理對象,爲了簡單,直接創建一個測試類完成:ide

package cn.study.microboot;
import javax.annotation.Resource;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
@SpringBootTest(classes = StartSpringBootMain.class)
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
public class TestRedis {
    @Resource
    private RedisTemplate<String, String> redisTemplate;
    @Test
    public void testSet() {
        this.redisTemplate.opsForValue().set("study", "java");
        System.out.println(this.redisTemplate.opsForValue().get("study"));
    }
}

則此時就能夠利用 Redis 實如今 SpringBoot 中的數據存儲操做了。spring-boot

2.二、Redis 對象序列化操做

雖然以上的代碼實現了 Redis 基礎的數據操做,可是遺憾的是在 Java 開發領域內必需要考慮一個實際的問題,那麼就是對象 的序列化保存問題,畢竟 Redis 數據庫的讀寫速度是很是快的,可是若是不可以進行對象的存儲,這樣的存儲意義就不大了,這樣 就須要準備一個對象的序列化處理程序類,經過對象的形式進行數據的存儲。

一、 若是要想進行 Redis 對象序列化操做則必定要首先準備一個序列化處理程序類,這個程序類有實現要求:

package cn.study.microboot.util.redis;

import org.springframework.core.convert.converter.Converter;
import org.springframework.core.serializer.support.DeserializingConverter;
import org.springframework.core.serializer.support.SerializingConverter;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.SerializationException;
// 此時定義的序列化操做表示能夠序列化全部類的對象,固然,這個對象所在的類必定要實現序列化接口
public class RedisObjectSerializer implements RedisSerializer<Object> {
    // 爲了方便進行對象與字節數組的轉換,因此應該首先準備出兩個轉換器
    private Converter<Object, byte[]> serializingConverter = new SerializingConverter();
    private Converter<byte[], Object> deserializingConverter = new DeserializingConverter();
    private static final byte[] EMPTY_BYTE_ARRAY = new byte[0];    // 作一個空數組,不是null
    @Override
    public byte[] serialize(Object obj) throws SerializationException {
        if (obj == null) {    // 這個時候沒有要序列化的對象出現,因此返回的字節數組應該就是一個空數組
            return EMPTY_BYTE_ARRAY ;
        }
        return this.serializingConverter.convert(obj);    // 將對象變爲字節數組
    }
    @Override
    public Object deserialize(byte[] data) throws SerializationException {
        if (data == null || data.length == 0) {    // 此時沒有對象的內容信息
            return null ;
        }
        return this.deserializingConverter.convert(data);
    }

}

二、 此時若是要想讓 RedisTemplate 操做模版知道有這樣一個序列化程序類存在,那麼就不可以採用 RedisTemplate 默認配置形式, 須要準備一個單獨的配置類進行處理:

package cn.study.microboot.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import cn.study.microboot.util.redis.RedisObjectSerializer;

@Configuration
public class RedisConfig {
    @Bean
    public RedisTemplate<String, Object> getRedisTemplate(
            RedisConnectionFactory factory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
        redisTemplate.setConnectionFactory(factory);
        redisTemplate.setKeySerializer(new StringRedisSerializer()); // key的序列化類型
        redisTemplate.setValueSerializer(new RedisObjectSerializer()); // value的序列化類型
        return redisTemplate;
    }
}

三、 進行程序的測試使用:

package cn.study.microboot.vo;

import java.io.Serializable;

@SuppressWarnings("serial")
public class Member implements Serializable {
    private String mid;
    private Integer age;
    public String getMid() {
        return mid;
    }
    public void setMid(String mid) {
        this.mid = mid;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Member [mid=" + mid + ", age=" + age + "]";
    }
}
package cn.study.microboot;
import javax.annotation.Resource;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;

import cn.mldn.microboot.vo.Member;
@SpringBootTest(classes = StartSpringBootMain.class)
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
public class TestRedis {
    @Resource
    private RedisTemplate<String, Object> redisTemplate;
    @Test 
    public void testGet() {
        System.out.println(this.redisTemplate.opsForValue().get("study"));
    }
    @Test
    public void testSet() {
        Member vo = new Member() ;
        vo.setMid("studyjava");
        vo.setAge(19);
        this.redisTemplate.opsForValue().set("study", vo);;
    }
}

此時能夠進行對象的序列化保存處理, 這樣總體的數據存儲的手段能夠更加的豐富。

2.三、配置多個 RedisTemplate

因爲在項目的實際開發過程之中 Redis 的使用會很是的頻繁, 那麼就有可能出現這樣一種問題:如今的項目裏面要求鏈接兩 個 Redis 數據庫。SpringBoot 裏面針對於 Redis 的鏈接配置本質上只提供有一個鏈接配置項,那麼若是你真的須要進行更多的 Redis 的鏈接配置,那麼就須要本身來進行 Redis 的建立管理了。

一、 以非正規的形式修改 application.yml 配置文件:

spring:
  redis:
    host: 192.168.68.166
    port: 6379
    password: studyjava
    timeout: 1000
    database: 0
    pool:
      max-active: 10
      max-idle: 8
      min-idle: 2
      max-wait: 100
  redis-two:
    host: 192.168.68.166
    port: 6380
    password: studyjava
    timeout: 1000
    database: 0
    pool:
      max-active: 10
      max-idle: 8
      min-idle: 2
      max-wait: 100

二、 創建一個 RedisTwoConfig 的程序配置類,進行第二個 Redis 鏈接的配置處理:

package cn.study.microboot.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import cn.study.microboot.util.redis.RedisObjectSerializer;
import redis.clients.jedis.JedisPoolConfig;

@Configuration
public class RedisTwoConfig {
    public RedisConnectionFactory getRedisConnectionFactory(String hostName,
            String password, int port, int maxActive, int maxIdle, int minIdle,
            long maxWait, int database) { // 是負責創建Factory的鏈接工廠類
        JedisConnectionFactory jedisFactory = new JedisConnectionFactory();
        jedisFactory.setHostName(hostName);
        jedisFactory.setPort(port);
        jedisFactory.setPassword(password);
        jedisFactory.setDatabase(database);
        JedisPoolConfig poolConfig = new JedisPoolConfig(); // 進行鏈接池配置
        poolConfig.setMaxTotal(maxActive);
        poolConfig.setMaxIdle(maxIdle);
        poolConfig.setMinIdle(minIdle);
        poolConfig.setMaxWaitMillis(maxWait);
        jedisFactory.setPoolConfig(poolConfig);
        jedisFactory.afterPropertiesSet(); // 初始化鏈接池配置
        return jedisFactory;
    }
    @Bean("redisTwo")
    public RedisTemplate<String, Object> getRedisTemplate(
            @Value("${spring.redis-two.host}") String hostName,
            @Value("${spring.redis-two.password}") String password,
            @Value("${spring.redis-two.port}") int port,
            @Value("${spring.redis-two.database}") int database,
            @Value("${spring.redis-two.pool.max-active}") int maxActive,
            @Value("${spring.redis-two.pool.max-idle}") int maxIdle,
            @Value("${spring.redis-two.pool.min-idle}") int minIdle,
            @Value("${spring.redis-two.pool.max-wait}") long maxWait) {

        RedisConnectionFactory factory = this.getRedisConnectionFactory(
                hostName, password, port, maxActive, maxIdle, minIdle, maxWait,
                database); // 創建Redis的鏈接
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
        redisTemplate.setConnectionFactory(factory);
        redisTemplate.setKeySerializer(new StringRedisSerializer()); // key的序列化類型
        redisTemplate.setValueSerializer(new RedisObjectSerializer()); // value的序列化類型
        return redisTemplate;
    }
}

三、 編寫測試程序類:

package cn.study.microboot;
import javax.annotation.Resource;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;

import cn.study.microboot.vo.Member;
@SpringBootTest(classes = StartSpringBootMain.class)
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
public class TestRedisTwo {
    @Resource(name="redisTwo")
    private RedisTemplate<String, Object> redisTemplate;
    @Test 
    public void testGet() {
        System.out.println(this.redisTemplate.opsForValue().get("study"));
    }
    @Test
    public void testSet() {
        Member vo = new Member() ;
        vo.setMid("studyjava");
        vo.setAge(19);
        this.redisTemplate.opsForValue().set("study", vo);;
    }
}

在實際的工做之中因爲 Redis 數據庫的使用至關頻繁,因此有很大的可能性是一個項目裏面須要鏈接不一樣的 Redis 數據庫。

三、總結

Redis 是一個重要的數據庫產品,實際開發之中會利用 Redis 實現高併發的信息存儲,因此多個 Redis 數據庫的使用是一種常 見形式。

相關文章
相關標籤/搜索