SpringBoot系列十:SpringBoot整合Redis


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

1、概念:SpringBoot 整合 Redis 

2、背景

Redis 的數據庫的整合在 java 里面提供的官方工具包:jedis,所以即便你現在使用的是 SpringBoot,那么也繼續使用此開發包。

2.1、RedisTemplate 模版操作

在 Spring 支持的 Redis 操作之中提供有一個 RedisTemplate 處理程序類,利用這個類可以非常方便的實現 Redis 的各種基本數 據操作。

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

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

2、 如果要想使用 Redis 操作,則一定要修改 application.yml 配置文件,在這個配置文件之中要進行 Redis 的各種連接配置處理;

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

3、 下面就可以通過程序來利用 RedisTemplate 模版進行數據處理了,因為以上的配置一旦完成之后會在 Spring 內部幫助用戶直接 獲得一個 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;
@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 中的數據存儲操作了。

2.2、Redis 對象序列化操作

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

1、 如果要想進行 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);
    }

}

2、 此時如果要想讓 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;
    }
}

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

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.3、配置多個 RedisTemplate

由於在項目的實際開發過程之中 Redis 的使用會非常的頻繁, 那么就有可能出現這樣一種問題:現在的項目里面要求連接兩 個 Redis 數據庫。SpringBoot 里面針對於 Redis 的連接配置本質上只提供有一個連接配置項,那么如果你真的需要進行更多的 Redis 的連接配置,那么就需要自己來進行 Redis 的創建管理了。

1、 以非正規的形式修改 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

2、 建立一個 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;
    }
}

3、 編寫測試程序類:

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 數據庫。

3、總結

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM