RedisTemplate的使用

RedisTemplate是Spring Data Redis提供的核心抽象类,是Spring Boot访问Redis服务器的底层实现。

有了RedisTemplate就不用Jedis的连接池或者直连,手动序列化对象,查询时还需要手动反序列化,还要处理各种异常和链接关闭

RedisTemplate就可以直接访问Redis服务,并且自动处理各种异常和链接关闭

redisTemplate.opsForValue().set("user:1", user);
User result = (User) redisTemplate.opsForValue().get("user:1");

核心配置

RedisTemplate使用之前需要配置RedisConnectionFactory

@Configuration
public class RedisConfig {

@Bean
public RedisTemplate<String, Object> redisTemplate(
RedisConnectionFactory connectionFactory) {

RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);

// 🔥 最重要的配置:序列化器(避免存储乱码和查询失败)

// Key序列化:StringRedisSerializer(推荐)
template.setKeySerializer(new StringRedisSerializer());
// Value序列化:Jackson2JsonRedisSerializer(存储对象)
template.setValueSerializer(new GenericJackson2JsonRedisSerializer());

// Hash结构序列化
template.setHashKeySerializer(new StringRedisSerializer());
template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());

template.afterPropertiesSet();
return template;
}
}

如果序列化配置不当或者不欸之序列化器,使用默认的JDK序列化。在Redis中可能就会存储乱码,查询时出现类型转换异常

所以我们必须显式配置序列化器。
key通常使用StringRedisSerializer,value通常使用Jackson2JsonRedisSerializer

核心操作接口(opsForXxxx)

@Service
public class RedisService {

@Autowired
private RedisTemplate<String, Object> redisTemplate;

public void demoAllOperations() {
// 1. 字符串操作 - 最常用
ValueOperations<String, Object> valueOps = redisTemplate.opsForValue();
valueOps.set("name", "张三");
String name = (String) valueOps.get("name");

// 2. 列表操作
ListOperations<String, Object> listOps = redisTemplate.opsForList();
listOps.leftPush("myList", "item1");
List<Object> list = listOps.range("myList", 0, -1);

// 3. 集合操作(无序、不重复)
SetOperations<String, Object> setOps = redisTemplate.opsForSet();
setOps.add("mySet", "a", "b", "c");
Set<Object> set = setOps.members("mySet");

// 4. 有序集合操作(排行榜专用)
ZSetOperations<String, Object> zSetOps = redisTemplate.opsForZSet();
zSetOps.add("leaderboard", "user1", 100.0);
Set<Object> topUsers = zSetOps.range("leaderboard", 0, 2);

// 5. Hash操作(对象存储)
HashOperations<String, Object, Object> hashOps = redisTemplate.opsForHash();
hashOps.put("user:1", "name", "李四");
hashOps.put("user:1", "age", 25);
Map<Object, Object> userMap = hashOps.entries("user:1");
}
}