整合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);}}