Spring Boot 2.X(六):Spring Boot 集成Redis
- 2019 年 10 月 13 日
- 筆記
Redis 簡介
什麼是 Redis
Redis 是目前使用的非常廣泛的免費開源記憶體資料庫,是一個高性能的 key-value 資料庫。
Redis 與其他 key-value 快取(如 Memcached )相比有以下三個特點:
1.Redis 支援數據的持久化,它可以將記憶體中的數據保存在磁碟中,重啟的時候可以再次載入進行使用。
2.Redis 不僅僅支援簡單的 key-value 類型的數據,同時還提供 list,set,zset,hash 等數據結構的存儲。
3.Redis 支援數據的備份,即 master-slave 模式的數據備份。
Redis 優勢如下:
1.性能極高。Redis 能讀的速度是 110000 次/s,寫的速度是 81000 次/s。
2.豐富的數據類型。Redis 支援二進位案例的 Strings,Lists,Sets 及 Ordered Sets 數據類型操作。
3.原子性。Redis 所有的操作都是原子性的,意思是要麼成功執行要麼失敗完全不執行。單個操作是原子性的,多個操作也是,通過 MULTI 和 EXEC 指令抱起來。
4.豐富的特性。Redis 還支援 publish/subscribe,通知,key 過期等特性。
Spring Boot 集成 Redis
1.在項目中添加依賴
<?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 包時發現,Spring Data Redis 下 org.springframework.data.redis.connection 包路徑下面默認有兩個包 jedis 和 lettuce,這說明 Spring Boot 已經默認包裝適配了這兩個 Redis 客戶端。
在 springboot 1.5.x版本的默認的Redis客戶端是 Jedis實現的,springboot 2.x版本中默認客戶端是用 lettuce實現的。
Lettuce 與 Jedis 比較
Lettuce 和 Jedis 的都是連接 Redis Server的客戶端。
Jedis 在實現上是直連 redis server,多執行緒環境下非執行緒安全,除非使用連接池,為每個 redis實例增加物理連接。
Lettuce 是 一種可伸縮,執行緒安全,完全非阻塞的Redis客戶端,多個執行緒可以共享一個RedisConnection,它利用Netty NIO 框架來高效地管理多個連接,從而提供了非同步和同步數據訪問方式,用於構建非阻塞的反應性應用程式。
下面我們分別使用 Lettuce 和 Jedis 來集成 Redis 服務
2. Lettuce 集成 Redis 服務
導入依賴
由於 Spring Boot 2.X 默認集成了 Lettuce ,所以無需導入。
application.properties配置文件
################ Redis 基礎配置 ############## # Redis資料庫索引(默認為0) spring.redis.database=0 # Redis伺服器地址 spring.redis.host=127.0.0.1 # Redis伺服器連接埠 spring.redis.port=6379 # Redis伺服器連接密碼(默認為空) spring.redis.password=zwqh # 鏈接超時時間 單位 ms(毫秒) spring.redis.timeout=3000 ################ Redis 執行緒池設置 ############## # 連接池最大連接數(使用負值表示沒有限制) 默認 8 spring.redis.lettuce.pool.max-active=8 # 連接池最大阻塞等待時間(使用負值表示沒有限制) 默認 -1 spring.redis.lettuce.pool.max-wait=-1 # 連接池中的最大空閑連接 默認 8 spring.redis.lettuce.pool.max-idle=8 # 連接池中的最小空閑連接 默認 0 spring.redis.lettuce.pool.min-idle=0
自定義 RedisTemplate
默認情況下的模板只能支援 RedisTemplate<String,String>
,只能存入字元串,很多時候,我們需要自定義 RedisTemplate ,設置序列化器,這樣我們可以很方便的操作實例對象。如下所示:
@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; } }
序列化實體類
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; } }
單元測試
@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()); } }
執行結果如下:
得到我們預期的結果。
3.Jedis 集成 Redis 服務
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 基礎配置 ############## # Redis資料庫索引(默認為0) spring.redis.database=0 # Redis伺服器地址 spring.redis.host=127.0.0.1 # Redis伺服器連接埠 spring.redis.port=6379 # Redis伺服器連接密碼(默認為空) spring.redis.password=zwqh # 鏈接超時時間 單位 ms(毫秒) spring.redis.timeout=3000 ################ Redis 執行緒池設置 ############## # 連接池最大連接數(使用負值表示沒有限制) 默認 8 spring.redis.jedis.pool.max-active=8 # 連接池最大阻塞等待時間(使用負值表示沒有限制) 默認 -1 spring.redis.jedis.pool.max-wait=-1 # 連接池中的最大空閑連接 默認 8 spring.redis.jedis.pool.max-idle=8 # 連接池中的最小空閑連接 默認 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(); // 最大連接數 jedisPoolConfig.setMaxTotal(maxActive); // 當池內沒有可用連接時,最大等待時間 jedisPoolConfig.setMaxWaitMillis(maxWaitMillis); // 最大空閑連接數 jedisPoolConfig.setMinIdle(maxIdle); // 最小空閑連接數 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; } }
單元測試同上
出現預期結果。
總結
上面介紹了 Spring Boot 2.X 如何通過 Lettuce 和 Jedis 來集成 Redis 服務,按項目需求,我們也可以自定義操作類來實現數據操作。
示例程式碼
非特殊說明,本文版權歸 朝霧輕寒 所有,轉載請註明出處.
原文標題:Spring Boot 2.X(六):Spring Boot 集成Redis
原文地址:https://www.zwqh.top/article/info/11