Spring boot 配置多個(gè)redis的方法示例
Spring Data提供其他項(xiàng)目,用來幫你使用各種各樣的NoSQL技術(shù),包括MongoDB, Neo4J, Elasticsearch, Solr, Redis,Gemfire, Couchbase和Cassandra。Spring Boot為Redis, MongoDB, Elasticsearch, Solr和Gemfire提供自動(dòng)配置。你可以充分利用其他項(xiàng)目,但你需要自己配置它們。
單個(gè) RedisTemplate 的配置
使用 spring-boot-starter-data-redis 配置一個(gè) redis 是很簡(jiǎn)單的。
pom.xml 中該引入的依賴是要引入的,下面的是完整的 pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>me.deweixu</groupId>
<artifactId>muti-redis</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>muti-redis</name>
<description>config mutiple redis host</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
application.properties 文件增加相關(guān)的配置
spring.redis.host=localhost spring.redis.port=6379
簡(jiǎn)單的配置就是這樣的,還有一些有關(guān)連接池或其他的詳細(xì)配置可以在 common-application-properties 中參考,或者直接查看 RedisProperties 類。
這里使用 redis 的例子我就直接在主類中示例了。
package me.deweixu.mutiredis;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.redis.core.BoundValueOperations;
import org.springframework.data.redis.core.StringRedisTemplate;
@SpringBootApplication
public class MutiRedisApplication implements CommandLineRunner {
@Autowired
StringRedisTemplate stringRedisTemplate;
@Override
public void run(String... args) throws Exception {
BoundValueOperations op = stringRedisTemplate.boundValueOps("PERSON");
op.set("Deweixu");
}
public static void main(String[] args) {
SpringApplication.run(MutiRedisApplication.class, args);
}
}
直接運(yùn)行起來,然后去 redis 查看結(jié)果:
$ redis-cli 127.0.0.1:6379> keys * 1) "PERSON" 127.0.0.1:6379> get PERSON "Deweixu" 127.0.0.1:6379>
沒問題的,順利的把數(shù)據(jù)存入到了 redis 中。
自定義 RedisTemplate 的序列類
上面的實(shí)現(xiàn)其實(shí)有一個(gè)問題,就是 redis 的 key 和 value 只能是 String 類型的,是 redis-starter 默認(rèn)實(shí)現(xiàn)了的一個(gè) StringRedisTemplate。查看其源代碼是這樣的
public StringRedisTemplate() {
RedisSerializer<String> stringSerializer = new StringRedisSerializer();
this.setKeySerializer(stringSerializer);
this.setValueSerializer(stringSerializer);
this.setHashKeySerializer(stringSerializer);
this.setHashValueSerializer(stringSerializer);
}
如果使用 StringRedisTemplate 存入一個(gè)對(duì)象是要報(bào)錯(cuò)的,我們修改一下代碼試試:
@Autowired
StringRedisTemplate stringRedisTemplate;
@Override
public void run(String... args) throws Exception {
BoundValueOperations op = stringRedisTemplate.boundValueOps("PERSON");
op.set(new Person("Deiweixu", 22));
}
public static void main(String[] args) {
SpringApplication.run(MutiRedisApplication.class, args);
}
運(yùn)行就報(bào)錯(cuò)如下:
Caused by: java.lang.ClassCastException: me.deweixu.mutiredis.MutiRedisApplication$Person cannot be cast to java.base/java.lang.String
at org.springframework.data.redis.serializer.StringRedisSerializer.serialize(StringRedisSerializer.java:35) ~[spring-data-redis-2.0.9.RELEASE.jar:2.0.9.RELEASE]
at org.springframework.data.redis.core.AbstractOperations.rawValue(AbstractOperations.java:126) ~[spring-data-redis-2.0.9.RELEASE.jar:2.0.9.RELEASE]
at org.springframework.data.redis.core.DefaultValueOperations.set(DefaultValueOperations.java:197) ~[spring-data-redis-2.0.9.RELEASE.jar:2.0.9.RELEASE]
at org.springframework.data.redis.core.DefaultBoundValueOperations.set(DefaultBoundValueOperations.java:110) ~[spring-data-redis-2.0.9.RELEASE.jar:2.0.9.RELEASE]
at me.deweixu.mutiredis.MutiRedisApplication.run(MutiRedisApplication.java:19) [classes/:na]
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:800) [spring-boot-2.0.4.RELEASE.jar:2.0.4.RELEASE]
... 5 common frames omitted
這樣我們可以自己配置一下序列化類,這里我們把對(duì)象序列化為一個(gè) json 存入到 redis 中
@Bean
JedisConnectionFactory jedisConnectionFactory() {
return new JedisConnectionFactory();
}
@Bean
RedisTemplate<String, Object> firstRedisTemplate() {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer(om);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(genericJackson2JsonRedisSerializer);
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(genericJackson2JsonRedisSerializer);
redisTemplate.setConnectionFactory(jedisConnectionFactory());
return redisTemplate;
}
@Autowired
RedisTemplate<String, Object> redisTemplate;
@Override
public void run(String... args) throws Exception {
BoundValueOperations<String, Object> op = redisTemplate.boundValueOps("PERSON");
People people = new People();
people.setAge(26);
people.setName("Deweixu");
op.set(people);
People getPeople = (People) op.get();
System.out.println(getPeople.getName() + "," + getPeople.getAge());
}
上面使用了 Jedis 的配置和 GenericJackson2JsonRedisSerializer 類,所以 maven 要引入依賴
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.0</version> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency>
這樣運(yùn)行可以看到 redis 中變成這樣了:
127.0.0.1:6379> get PERSON
"[\"me.deweixu.mutiredis.entity.People\",{\"name\":\"Deweixu\",\"age\":26}]"
127.0.0.1:6379>
配置另外一個(gè) redisTemplate
@Bean
RedisTemplate<String, Object> secondRedisTemplate() {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer(om);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(genericJackson2JsonRedisSerializer);
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(genericJackson2JsonRedisSerializer);
// 這里的 redis 信息也是可以寫入配置文件,用 @Value 讀入
// 這里是單機(jī)的配置,看看源代碼還可以配置集群和哨兵模式
RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration("localhost", 6379);
JedisConnectionFactory factory = new JedisConnectionFactory(configuration);
redisTemplate.setConnectionFactory(factory);
return redisTemplate;
}
注入 secondRedisTemplate 即可
@Autowired
RedisTemplate<String, Object> firstRedisTemplate;
@Autowired
RedisTemplate<String, Object> secondRedisTemplate;
@Override
public void run(String... args) throws Exception {
BoundValueOperations<String, Object> op = firstRedisTemplate.boundValueOps("PERSON");
People people = new People();
people.setAge(26);
people.setName("Deweixu");
op.set(people);
BoundValueOperations<String, Object> secondOp = secondRedisTemplate.boundValueOps("PERSON");
People getPeople = (People) secondOp.get();
System.out.println(getPeople.getName() + "," + getPeople.getAge());
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot中引入MyBatisPlus的常規(guī)操作
這篇文章主要介紹了SpringBoot中引入MyBatisPlus的常規(guī)操作,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
Java如何使用遞歸查詢多級(jí)樹形結(jié)構(gòu)數(shù)據(jù)(多級(jí)菜單)
這篇文章主要介紹了Java如何使用遞歸查詢多級(jí)樹形結(jié)構(gòu)數(shù)據(jù)(多級(jí)菜單),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
如何解決Mybatis--java.lang.IllegalArgumentException: Result Maps
這兩天因?yàn)轫?xiàng)目需要整合spring、struts2、mybatis三大框架,但啟動(dòng)的時(shí)候總出現(xiàn)這個(gè)錯(cuò)誤,困擾我好久,折騰了好久終于找到問題根源,下面小編給大家分享下問題所在及解決辦法,一起看看吧2016-12-12
SpringMVC實(shí)現(xiàn)參數(shù)校驗(yàn)配置方法
這篇文章主要介紹了SpringMVC實(shí)現(xiàn)參數(shù)校驗(yàn)的配置方式,Spring MVC會(huì)拋出MethodArgumentNotValidException異常,并將錯(cuò)誤信息綁定到相應(yīng)的字段上,感興趣的朋友跟隨小編一起看看吧2024-03-03
ArrayList的自動(dòng)擴(kuò)充機(jī)制實(shí)例解析
本文主要介紹了ArrayList的自動(dòng)擴(kuò)充機(jī)制,由一個(gè)題目切入主題,逐步向大家展示了ArrayList的相關(guān)內(nèi)容,具有一定參考價(jià)值,需要的朋友可以了解下。2017-10-10

