整合Redis
引入依賴
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId>
</dependency>
除了 spring-boot-starter-data-redis
外,還添加了 commons-pool2
依賴,是因為需要使用到連接池。
配置屬性
只需要在 application.yaml | properties
中配置如下常用的基本屬性即可:
spring:data:redis:# 連接地址host: "localhost"# 端口port: 6379# 數據庫database: 0# 用戶名,如果有# username:# 密碼,如果有# password:# 連接超時connect-timeout: 5s# 讀超時timeout: 5s# Lettuce 客戶端的配置lettuce:# 連接池配置pool:# 最小空閑連接min-idle: 0# 最大空閑連接max-idle: 8# 最大活躍連接max-active: 8# 從連接池獲取連接 最大超時時間,小于等于0則表示不會超時max-wait: -1ms
注意,如果使用的是 spring boot 2.x,上述配置的命名空間應該是
spring.redis
而不是spring.data.redis
自定義 RedisTemplate
如果基本的 StringRedisTemplate
不能滿足需求,你也可以自定義 RedisTemplate
實現。
例如,想要自定義一個 JsonRedisTemplate
,用于把任意 Java 對象序列化為 json 數據存儲到 Redis,并且也能夠把 Redis 中的 json 數據反序列化為任意 Java 對象。
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.stereotype.Component;import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;/*** 自定義一個 JsonRedisTemplate* 用于把任意 Java 對象序列化為 json 數據存儲到 Redis,并且也能夠把 Redis 中的 json 數據反序列化為任意 Java 對象*/
@Component
public class JsonRedisTemplate extends RedisTemplate<String, Object> {public JsonRedisTemplate(RedisConnectionFactory redisConnectionFactory) {// 構造函數注入 RedisConnectionFactory,設置到父類super.setConnectionFactory(redisConnectionFactory);// 使用 Jackson 提供的通用 SerializerGenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer();serializer.configure(mapper -> {// 如果涉及到對 java.time 類型的序列化,反序列化那么需要注冊 JavaTimeModulemapper.registerModule(new JavaTimeModule());});// String 類型的 key/value 序列化super.setKeySerializer(StringRedisSerializer.UTF_8);super.setValueSerializer(serializer);// Hash 類型的 key/value 序列化super.setHashKeySerializer(StringRedisSerializer.UTF_8);super.setHashValueSerializer(serializer);}
}
首先,繼承 RedisTemplate<K,V>
,泛型 K
表示 Redis Key 類型,一般都是 String
,泛型 V
表示 Redis Value 類型,既然我們需要的是一個通用的 JSON Template,所以設置為 Object
,Value 值可以是任意對象。
在構造函數中注入 RedisConnectionFactory
設置到父類,「這是必須的」。
然后創建GenericJackson2JsonRedisSerializer
實例,它是基于 Jackson 的 RedisSerializer
實現,用于任意 Java 對象和 JSON 字符串之間的序列化/反序列化。使用該實例作為普通 Value 和 Hash Value 的序列化/反序列化器。注意,因為序列化的對象可能包含了 java.time
類型的日期字段,如:LocalTime
、LocalDate
以及 LocalDateTime
,所以需要注冊 JavaTimeModule
。
測試
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import com.keepc.springredis.config.JsonRedisTemplate;@SpringBootTest
class SpringRedisApplicationTests {static final Logger logger = LoggerFactory.getLogger(SpringRedisApplicationTests.class);// 注入 JsonRedisTemplate@AutowiredJsonRedisTemplate jsonRedisTemplate;@SuppressWarnings("unchecked")@Testpublic void test() {// MapMap<String, Object> map = new HashMap<>();map.put("title", "spring redis");map.put("url", "https://springdoc.cn");map.put("createAt", LocalDateTime.now());// 設置 key/valuethis.jsonRedisTemplate.opsForValue().set("key1-string", map, Duration.ofMinutes(5));// 讀取 key/valuemap = (Map<String, Object>) this.jsonRedisTemplate.opsForValue().get("key1-string");logger.info("map={}", map);// 設置 Hash Valuethis.jsonRedisTemplate.opsForHash().put("key2-hash", "app", map);// 讀取 Hash Valuemap = (Map<String, Object>) this.jsonRedisTemplate.opsForHash().get("key2-hash", "app");logger.info("map={}", map);}}