RedisTemplate 是 Spring Data Redis 提供的一个用于操作 Redis 的模板类,它封装了 Redis 的基本命令并提供了一系列常用的方法,以便于在 Java 应用程序中更方便地操作 Redis。以下是 RedisTemplate 的一些常用用法:
1. 引入依赖
首先,Spring Boot 项目中引入 spring-boot-starter-data-redis 依赖。这可以通过在 pom.xml 文件中添加以下依赖来实现:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2. 配置 Redis
在 application.yml 或 application.properties 文件中配置 Redis 的连接信息,如主机名、端口、密码等。
spring:
redis:
host: 127.0.0.1
port: 6379
password: yourpassword
database: 0
lettuce:
pool:
max-active: 8
max-idle: 8
min-idle: 0
max-wait: 100ms
3. 注入 RedisTemplate
在你的 Spring Boot 应用程序中,你可以通过 @Autowired 注解来注入 RedisTemplate。
@Autowired
private RedisTemplate<String, String> redisTemplate;
4. 常用操作
字符串(String)
- 设置值:
redisTemplate.opsForValue().set(key, value); - 获取值:
String value = redisTemplate.opsForValue().get(key); - 删除值:
redisTemplate.delete(key);
哈希(Hash)
- 设置哈希值:
redisTemplate.opsForHash().put(hashKey, field, value); - 获取哈希值:
Object value = redisTemplate.opsForHash().get(hashKey, field); - 删除哈希字段:
redisTemplate.opsForHash().delete(hashKey, field);
列表(List)
- 左推入:
redisTemplate.opsForList().leftPush(key, value); - 右推入:
redisTemplate.opsForList().rightPush(key, value); - 获取列表范围:
List<String> values = redisTemplate.opsForList().range(key, start, end);
集合(Set)
- 添加元素:
redisTemplate.opsForSet().add(key, values); - 获取集合成员:
Set<String> members = redisTemplate.opsForSet().members(key); - 判断元素是否存在:
Boolean exists = redisTemplate.opsForSet().isMember(key, value);
有序集合(ZSet/Sorted Set)
- 添加元素:
redisTemplate.opsForZSet().add(key, value, score); - 根据分数范围获取成员:
Set<ZSetOperations.TypedTuple<String>> tuples = redisTemplate.opsForZSet().rangeByScore(key, minScore, maxScore);
5. 序列化
RedisTemplate 默认使用 JDK 序列化,但这通常不是最佳实践,因为它会导致可读性差和内存占用大。可以通过配置 RedisTemplate 来使用更合适的序列化方式,如 JSON 序列化。
为了配置RedisTemplate以使用JSON序列化,可以使用Jackson2JsonRedisSerializer或GenericJackson2JsonRedisSerializer(对于泛型类型),这取决于具体需求。以下是一个配置RedisTemplate以使用Jackson2JsonRedisSerializer的示例:
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccess;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);
// 使用StringRedisSerializer来序列化和反序列化redis的key值
template.setKeySerializer(new StringRedisSerializer());
// 使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
// 配置ObjectMapper,以便它可以正确地将对象转换为JSON
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccess.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
// 或者使用 om.activateDefaultTyping(om.getPolymorphicTypeValidator(), ObjectMapper.DefaultTyping.NON_FINAL);
// 在新版本Jackson中,可能需要启用类型信息
om.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
jackson2JsonRedisSerializer.setObjectMapper(om);
template.setValueSerializer(jackson2JsonRedisSerializer);
// 如果hash key也是String类型,则需要设置
template.setHashKeySerializer(new StringRedisSerializer());
// 如果hash value也是对象,则需要设置
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
}
注意几个关键点:
-
KeySerializer:这里使用了
StringRedisSerializer来序列化和反序列化Redis的key,因为key通常是简单的字符串。 -
ValueSerializer:使用
Jackson2JsonRedisSerializer来序列化和反序列化Redis的value。这个序列化器依赖于Jackson库来将Java对象转换为JSON字符串,并将JSON字符串反序列化为Java对象。 -
ObjectMapper配置:通过配置
ObjectMapper,你可以控制如何将Java对象转换为JSON(例如,日期格式、字段可见性等)。 -
类型信息:
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);这行代码启用了Jackson的默认类型信息,这有助于在反序列化时确定Java对象的类型(特别是当处理泛型或继承结构时)。然而,请注意,在Jackson的新版本中,enableDefaultTyping方法可能已被弃用,你应使用activateDefaultTyping方法替代。 -
HashSerializer:如果打算使用Redis的hash数据结构,并且hash的key和value也是复杂类型,那么你需要为它们分别设置序列化器。

797

被折叠的 条评论
为什么被折叠?



