RedisTemplate 常用用法

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序列化,可以使用Jackson2JsonRedisSerializerGenericJackson2JsonRedisSerializer(对于泛型类型),这取决于具体需求。以下是一个配置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;  
    }  
}

注意几个关键点:

  1. KeySerializer:这里使用了StringRedisSerializer来序列化和反序列化Redis的key,因为key通常是简单的字符串。

  2. ValueSerializer:使用Jackson2JsonRedisSerializer来序列化和反序列化Redis的value。这个序列化器依赖于Jackson库来将Java对象转换为JSON字符串,并将JSON字符串反序列化为Java对象。

  3. ObjectMapper配置:通过配置ObjectMapper,你可以控制如何将Java对象转换为JSON(例如,日期格式、字段可见性等)。

  4. 类型信息om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); 这行代码启用了Jackson的默认类型信息,这有助于在反序列化时确定Java对象的类型(特别是当处理泛型或继承结构时)。然而,请注意,在Jackson的新版本中,enableDefaultTyping方法可能已被弃用,你应使用activateDefaultTyping方法替代。

  5. HashSerializer:如果打算使用Redis的hash数据结构,并且hash的key和value也是复杂类型,那么你需要为它们分别设置序列化器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值