聲明:本文來源於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 數據庫的使用是一種常 見形式。