SpringBoot--整合Redis
阿新 • • 發佈:2020-02-05
整合Redis
Redis的Java客戶端有很多,例如Jedis、JRdis、Spring Data Redis等,SpringBoot藉助於Spring Data Redis為Redis提供了開箱即用自動化配置,開發者只需要新增相關依賴並配置Redis連線資訊即可,具體步驟如下:
1. 建立SpringBoot Web專案,新增如下依賴:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
預設情況下,spring-boot-starter-data-redis使用的Redis工具是Lettuce,如果使用Jedis,可以先排除Lettuce並引入Jedis,修改為如下依賴:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <exclusions> <exclusion> <artifactId>lettuce-core</artifactId> <groupId>io.lettuce</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency>
2. 配置Redis:
spirng:
redis:
database: 0
host: localhost
port: 6379
password: 123456
jedis:
pool:
max-active: 8 #最大連線數
max-idle: 8 #最大空閒連線數
max-wait: -1ms #最大阻塞等待事件,預設為-1,表示沒有限制
min-idle: 0 #最小空閒連線數
如果使用了Lettuce,則只需將配置中的Jedis修改為lettuce即可。
在SpringBoot的自動配置類中提供了RedisAutoConfiguration進行Redis的配置,原始碼如下:
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package org.springframework.boot.autoconfigure.data.redis;
import java.net.UnknownHostException;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
@Configuration(
proxyBeanMethods = false
)
@ConditionalOnClass({RedisOperations.class})
@EnableConfigurationProperties({RedisProperties.class})
@Import({LettuceConnectionConfiguration.class,JedisConnectionConfiguration.class})
public class RedisAutoConfiguration {
public RedisAutoConfiguration() {
}
@Bean
@ConditionalOnMissingBean(
name = {"redisTemplate"}
)
public RedisTemplate<Object,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
RedisTemplate<Object,Object> template = new RedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
@Bean
@ConditionalOnMissingBean
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
StringRedisTemplate template = new StringRedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
}
可以看出application.properties中配置的資訊將被注入RedisProperties中,如果沒有提供RedisTemplate或者StringRedisTemplate例項,則SpringBoot預設提供這 兩個例項,RedisTemplate和StringRedisTemplate例項提供了Redis的基本操作方法。
3. 建立實體類:
public class Book implements Serializable {
private int id;
private String name;
private String author;
//省略getter和setter以及toString
4. 建立Controller:
//測試redis
@Autowired
RedisTemplate redisTemplate;
@Autowired
StringRedisTemplate stringRedisTemplate;
@GetMapping("testRedis")
public void test(){
ValueOperations<String,String> ops1 = stringRedisTemplate.opsForValue();
//#插入一條資料
ops1.set("name","三國演義");
//取出
String name = ops1.get("name");
System.out.println(name);
ValueOperations ops2 = redisTemplate.opsForValue();
Book b1 = new Book();
b1.setId(1);
b1.setName("紅樓夢");
b1.setAuthor("曹雪芹");
//插入資料
ops2.set("b1",b1);
//取出
Book book = (Book) ops2.get("b1");
System.out.println(book);
}
- StringRedisTemplate是RedisTemplate的子類,StringRedisTemplate中的key和value都是字串,採用的序列化方案是StringRedisSerializer,而RedisTemplate則可以用來操作物件,RedisTemplate採用的序列化方案是JdkSerializationRedisSerializer。無論是StringRedisTemplate還是RedisTemplate,操作Redis的方法都是一致的。
- StringRedisTemplate和RedisTemplate都是通過opsForValue、opsForZSet或者opsForSet等方法首先獲取一個操作物件,再使用該操作物件完成資料的讀寫。
5. 測試:
啟動專案訪問對應路徑,控制檯列印:
三國演義
Book{id=1,name='紅樓夢',author='曹雪芹'}