溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Spring Boot怎樣集成Redis

發(fā)布時(shí)間:2021-10-27 09:21:27 來源:億速云 閱讀:377 作者:柒染 欄目:大數(shù)據(jù)

本篇文章給大家分享的是有關(guān)Spring Boot怎樣集成Redis,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

Redis 簡(jiǎn)介

什么是 Redis

Redis 是目前使用的非常廣泛的免費(fèi)開源內(nèi)存數(shù)據(jù)庫(kù),是一個(gè)高性能的 key-value 數(shù)據(jù)庫(kù)。

Redis 與其他 key-value 緩存(如 Memcached )相比有以下三個(gè)特點(diǎn):

1.Redis 支持?jǐn)?shù)據(jù)的持久化,它可以將內(nèi)存中的數(shù)據(jù)保存在磁盤中,重啟的時(shí)候可以再次加載進(jìn)行使用。 2.Redis 不僅僅支持簡(jiǎn)單的 key-value 類型的數(shù)據(jù),同時(shí)還提供 list,set,zset,hash 等數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ)。 3.Redis 支持?jǐn)?shù)據(jù)的備份,即 master-slave 模式的數(shù)據(jù)備份。

Redis 優(yōu)勢(shì)如下:

1.性能極高。Redis 能讀的速度是 110000 次/s,寫的速度是 81000 次/s。 2.豐富的數(shù)據(jù)類型。Redis 支持二進(jìn)制案例的 Strings,Lists,Sets 及 Ordered Sets 數(shù)據(jù)類型操作。 3.原子性。Redis 所有的操作都是原子性的,意思是要么成功執(zhí)行要么失敗完全不執(zhí)行。單個(gè)操作是原子性的,多個(gè)操作也是,通過 MULTI 和 EXEC 指令抱起來。 4.豐富的特性。Redis 還支持 publish/subscribe,通知,key 過期等特性。

Spring Boot 集成 Redis

1.在項(xiàng)目中添加依賴

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.1.9.RELEASE</version>
		<relativePath /> <!-- lookup parent from repository -->
	</parent>
	<groupId>cn.zwqh</groupId>
	<artifactId>spring-boot-redis</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>spring-boot-redis</name>
	<description>spring-boot-redis</description>

	<properties>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>

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

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>

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

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

查看 jar 包時(shí)發(fā)現(xiàn),Spring Data Redis 下 org.springframework.data.redis.connection 包路徑下面默認(rèn)有兩個(gè)包 jedis 和 lettuce,這說明 Spring Boot 已經(jīng)默認(rèn)包裝適配了這兩個(gè) Redis 客戶端。

在 springboot 1.5.x版本的默認(rèn)的Redis客戶端是 Jedis實(shí)現(xiàn)的,springboot 2.x版本中默認(rèn)客戶端是用 lettuce實(shí)現(xiàn)的。

Lettuce 與 Jedis 比較

Lettuce 和 Jedis 的都是連接 Redis Server的客戶端。

Jedis 在實(shí)現(xiàn)上是直連 redis server,多線程環(huán)境下非線程安全,除非使用連接池,為每個(gè) redis實(shí)例增加物理連接。


Lettuce 是 一種可伸縮,線程安全,完全非阻塞的Redis客戶端,多個(gè)線程可以共享一個(gè)RedisConnection,它利用Netty NIO 框架來高效地管理多個(gè)連接,從而提供了異步和同步數(shù)據(jù)訪問方式,用于構(gòu)建非阻塞的反應(yīng)性應(yīng)用程序。


下面我們分別使用 Lettuce 和 Jedis 來集成 Redis 服務(wù)

2. Lettuce 集成 Redis 服務(wù)

導(dǎo)入依賴

由于 Spring Boot 2.X 默認(rèn)集成了 Lettuce ,所以無需導(dǎo)入。

application.properties配置文件
################ Redis 基礎(chǔ)配置 ##############
# Redis數(shù)據(jù)庫(kù)索引(默認(rèn)為0)
spring.redis.database=0  
# Redis服務(wù)器地址
spring.redis.host=127.0.0.1
# Redis服務(wù)器連接端口
spring.redis.port=6379  
# Redis服務(wù)器連接密碼(默認(rèn)為空)
spring.redis.password=zwqh
# 鏈接超時(shí)時(shí)間 單位 ms(毫秒)
spring.redis.timeout=3000
################ Redis 線程池設(shè)置 ##############
# 連接池最大連接數(shù)(使用負(fù)值表示沒有限制) 默認(rèn) 8
spring.redis.lettuce.pool.max-active=8
# 連接池最大阻塞等待時(shí)間(使用負(fù)值表示沒有限制) 默認(rèn) -1
spring.redis.lettuce.pool.max-wait=-1
# 連接池中的最大空閑連接 默認(rèn) 8
spring.redis.lettuce.pool.max-idle=8
# 連接池中的最小空閑連接 默認(rèn) 0
spring.redis.lettuce.pool.min-idle=0
自定義 RedisTemplate

默認(rèn)情況下的模板只能支持 RedisTemplate<String,String>,只能存入字符串,很多時(shí)候,我們需要自定義 RedisTemplate ,設(shè)置序列化器,這樣我們可以很方便的操作實(shí)例對(duì)象。如下所示:

@Configuration
public class LettuceRedisConfig {

	@Bean
	public RedisTemplate<String, Serializable> redisTemplate(LettuceConnectionFactory connectionFactory) {
		RedisTemplate<String, Serializable> redisTemplate = new RedisTemplate<>();
		redisTemplate.setKeySerializer(new StringRedisSerializer());
		redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
		redisTemplate.setConnectionFactory(connectionFactory);
		return redisTemplate;
	}
}
序列化實(shí)體類
public class UserEntity implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 5237730257103305078L;
	
	private Long id;
	private String userName;
	private String userSex;
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getUserSex() {
		return userSex;
	}
	public void setUserSex(String userSex) {
		this.userSex = userSex;
	}
	
}
單元測(cè)試
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBootRedisApplicationTests {

	@Autowired
	private RedisTemplate<String, String> strRedisTemplate;
	@Autowired
	private RedisTemplate<String, Serializable> serializableRedisTemplate;
	
	@Test
	public void testString() {
		strRedisTemplate.opsForValue().set("strKey", "zwqh");
		System.out.println(strRedisTemplate.opsForValue().get("strKey"));
	}
	
	@Test
	public void testSerializable() {
		UserEntity user=new UserEntity();
		user.setId(1L);
		user.setUserName("朝霧輕寒");
		user.setUserSex("男");		
		serializableRedisTemplate.opsForValue().set("user", user);		
		UserEntity user2 = (UserEntity) serializableRedisTemplate.opsForValue().get("user");
		System.out.println("user:"+user2.getId()+","+user2.getUserName()+","+user2.getUserSex());
	}

}

執(zhí)行結(jié)果如下: Spring Boot怎樣集成Redis 得到我們預(yù)期的結(jié)果。

3.Jedis 集成 Redis 服務(wù)

pom 文件
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.1.9.RELEASE</version>
		<relativePath /> <!-- lookup parent from repository -->
	</parent>
	<groupId>cn.zwqh</groupId>
	<artifactId>spring-boot-redis</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>spring-boot-redis</name>
	<description>spring-boot-redis</description>

	<properties>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>

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

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>

		<!-- Redis -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-redis</artifactId>
			<exclusions>
				<!-- 排除lettuce包 -->
				<exclusion>
					<groupId>io.lettuce</groupId>
					<artifactId>lettuce-core</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<!-- 添加jedis客戶端 -->
		<dependency>
			<groupId>redis.clients</groupId>
			<artifactId>jedis</artifactId>
		</dependency>
	
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>
application.properties配置文件
################ Redis 基礎(chǔ)配置 ##############
# Redis數(shù)據(jù)庫(kù)索引(默認(rèn)為0)
spring.redis.database=0  
# Redis服務(wù)器地址
spring.redis.host=127.0.0.1
# Redis服務(wù)器連接端口
spring.redis.port=6379  
# Redis服務(wù)器連接密碼(默認(rèn)為空)
spring.redis.password=zwqh
# 鏈接超時(shí)時(shí)間 單位 ms(毫秒)
spring.redis.timeout=3000
################ Redis 線程池設(shè)置 ##############
# 連接池最大連接數(shù)(使用負(fù)值表示沒有限制) 默認(rèn) 8
spring.redis.jedis.pool.max-active=8
# 連接池最大阻塞等待時(shí)間(使用負(fù)值表示沒有限制) 默認(rèn) -1
spring.redis.jedis.pool.max-wait=-1
# 連接池中的最大空閑連接 默認(rèn) 8
spring.redis.jedis.pool.max-idle=8
# 連接池中的最小空閑連接 默認(rèn) 0
spring.redis.jedis.pool.min-idle=0
JedisRedisConfig
@Configuration
public class JedisRedisConfig {

	@Value("${spring.redis.database}")
	private int database;
	@Value("${spring.redis.host}")
	private String host;
	@Value("${spring.redis.port}")
	private int port;
	@Value("${spring.redis.password}")
	private String password;
	@Value("${spring.redis.timeout}")
	private int timeout;
	@Value("${spring.redis.jedis.pool.max-active}")
	private int maxActive;
	@Value("${spring.redis.jedis.pool.max-wait}")
	private long maxWaitMillis;
	@Value("${spring.redis.jedis.pool.max-idle}")
	private int maxIdle;
	@Value("${spring.redis.jedis.pool.min-idle}")
	private int minIdle;

	/**
	 * 連接池配置信息
	 */

	@Bean
	public JedisPoolConfig jedisPoolConfig() {
		JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
		// 最大連接數(shù)
		jedisPoolConfig.setMaxTotal(maxActive);
		// 當(dāng)池內(nèi)沒有可用連接時(shí),最大等待時(shí)間
		jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);
		// 最大空閑連接數(shù)
		jedisPoolConfig.setMinIdle(maxIdle);
		// 最小空閑連接數(shù)
		jedisPoolConfig.setMinIdle(minIdle);
		// 其他屬性可以自行添加
		return jedisPoolConfig;
	}

	/**
	 * Jedis 連接
	 * 
	 * @param jedisPoolConfig
	 * @return
	 */
	@Bean
	public JedisConnectionFactory jedisConnectionFactory(JedisPoolConfig jedisPoolConfig) {
		JedisClientConfiguration jedisClientConfiguration = JedisClientConfiguration.builder().usePooling()
				.poolConfig(jedisPoolConfig).and().readTimeout(Duration.ofMillis(timeout)).build();
		RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
		redisStandaloneConfiguration.setHostName(host);
		redisStandaloneConfiguration.setPort(port);
		redisStandaloneConfiguration.setPassword(RedisPassword.of(password));
		return new JedisConnectionFactory(redisStandaloneConfiguration, jedisClientConfiguration);
	}

	/**
	 * 緩存管理器
	 * 
	 * @param connectionFactory
	 * @return
	 */
	@Bean
	public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) {
		return RedisCacheManager.create(connectionFactory);
	}

	@Bean
	public RedisTemplate<String, Serializable> redisTemplate(JedisConnectionFactory connectionFactory) {
		RedisTemplate<String, Serializable> redisTemplate = new RedisTemplate<>();
		redisTemplate.setKeySerializer(new StringRedisSerializer());
		redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
		redisTemplate.setConnectionFactory(jedisConnectionFactory(jedisPoolConfig()));
		return redisTemplate;
	}

}
單元測(cè)試同上

出現(xiàn)預(yù)期結(jié)果。

上面介紹了 Spring Boot 2.X 如何通過 Lettuce 和 Jedis 來集成 Redis 服務(wù),按項(xiàng)目需求,我們也可以自定義操作類來實(shí)現(xiàn)數(shù)據(jù)操作。

以上就是Spring Boot怎樣集成Redis,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI