Redis之RedisTemplate在实际开发中的使用

本文详细介绍了如何在SpringBoot中集成和自定义RedisTemplate,包括SpringBoot自动装配RedisTemplate的原理,如何定义自己的RedisTemplate以改变默认的序列化方式,以及创建RedisUtil工具类以简化操作。通过这些步骤,可以更高效地在实际开发中使用Redis进行数据存储和操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        本篇文章介绍的是RedisTemplate在实际开发中如何使用,从SpringBoot自动装配RedisTemplate出发,介绍如何定义自己的RedisTemplate,到RedisTemplate的封装,老司机不必再浪费时间,O(∩_∩)O

一、SpringBoot中集成RedisTemplate

        我的上一篇博客清楚明了介绍了在SpringBoot中如何集成Redis,其中遇到了一些问题,都有记录,可以看下:如何在SpringBoot中集成Redis(RedisTemplate)_springboot集成redistemplate_LuckyWangxs的博客-CSDN博客

二、RedisTemplate自动装配

        org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration这个类为RedisTemplate自动装配的类,我们不妨打开看一眼:

        1)这个带@Bean注解的就是SpringBoot默认为我们装配的RedisTemplate,我们可以看到装配类型是RedisTemplate<Object, Object>,所以默认情况下我们只能自动注入<Object, Object>或者<String, String>泛型的RedisTemplate(上一篇博客记录了踩过的这个坑)

        2)我们可以看到方法上带有@ConditionalOnMissingBean(name = "redisTemplate"),这个注解的作用就是如果我们自己定义了RedisTemplate并放入了IoC,那SpringBoot的这个RedisTemplate就不生效了,我们用@Autowired注入的RedisTemplate就是我们自己写的那个了

        3)默认的这个RedisTemplate使用的序列化方式是jdk的,所以我们存入的Object要实现序列化接口,不然会报错,但在实际开发中我们并不想用这种序列化方式,我们都会采用JSON方式的序列化

三、自定义RedisTemplate

        在实际开发中,我们用的RedisTemplate通常是<String, Object>这种泛型,所以我们自定义的RedisTemplate采用这种泛型,并用@Configuration和@Bean注解将我们自己定义的RedisTemplate放入IoC容器,使默认RedisTemplate失效:

@Configuration
public class RedisConfig {

    @Bean
    @SuppressWarnings("all")
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        //设置连接工厂,包含一些Redis连接信息
        redisTemplate.setConnectionFactory(factory);

        // Json序列化配置
        Jackson2JsonRedisSerializer jsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jsonRedisSerializer.setObjectMapper(objectMapper);

        // String的序列化
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();

        // key均采用String序列化方式
        redisTemplate.setKeySerializer(stringRedisSerializer);
        // hsah的key也采用String序列化的方式
        redisTemplate.setHashKeySerializer(stringRedisSerializer);
        // value采用json的序列化方式
        redisTemplate.setValueSerializer(jsonRedisSerializer);
        // hash的value也采用json的序列化方式
        redisTemplate.setHashKeySerializer(jsonRedisSerializer);

        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }

}

四、RedisTemplate的工具类RedisUtil

        上篇博客的案例提到过RedisTemplate的使用,例如往Redis中存值、取值、设置失效时间:

// 存
redisTemplate.opsForValue().set(id, blogTemp);
// 取
redisTemplate.opsForValue().get(id);
// 设置失效时间
redisTemplate.expire(id, 30, TimeUnit.SECONDS)

        我们可以发现每次都要写很长,所以在实际开发中不仅会定义自己的RedisTemplate,而且还会给写一个工具类,目的就是为了方便,下面用代码简单举例说明,大家可以按照如此思路定义方便自己的使用Utils:

@Component
public final class RedisUtil {
    
    // 此处自动注入参数是上述自己定义的RedisTemplate,而非默认的
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    
    /**
     * 取
     * @param key 键
     * @return
     */
    public Object get(String key) {
        return key == null ? null : redisTemplate.opsForValue().get(key);
    }

    /**
     * 普通缓存放入
     * @param key   键
     * @param value 值
     * @return true成功 false失败
     */
    public boolean set(String key, Object value) {
        try {
            redisTemplate.opsForValue().set(key, value);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 指定缓存失效时间
     * @param key  键
     * @param time 时间(秒)
     * @return
     */
    public boolean expire(String key, long time) {
        try {
            if (time > 0) {
                redisTemplate.expire(key, time, TimeUnit.SECONDS);
            }
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 根据key 获取过期时间
     * @param key 键 不能为null
     * @return 时间(秒) 返回0代表为永久有效
     */
    public long getExpire(String key) {
        return redisTemplate.getExpire(key, TimeUnit.SECONDS);
    }
}

        这样我们存值就可以这么写:

public class PaymentServiceImpl implements PaymentService {
    
    @Autowired
    private RedisUtil redisUtil;
    
    @Override
    public ResultVO getByPrimaryKey(Integer id) {
        // 取值
        redisUtil.get(id.toString());
        return ResultVO.success();
    }
}

        大家理解这个思想就可以,网上有一大堆这种工具类,当然如果你有时间,也可以自己写一套自己用着舒服的Util。

### 如何使用 RedisTemplateSpring 中实现从 Redis 数据库读取数据 为了利用 `RedisTemplate` 有效地从 Redis 数据库存储中检索信息,在 Java 应用程序里通常会执行一系列特定的操作。对于基本键值对的获取,可以借助于 `ValueOperations` 接口完成这一过程[^2]。 下面是一个具体的例子展示怎样通过 `RedisTemplate` 获取存储在 Redis 中的数据: ```java @Autowired private RedisTemplate<String, Object> redisTemplate; public Object getValue(String key){ ValueOperations<String, Object> valueOperations = redisTemplate.opsForValue(); return valueOperations.get(key); } ``` 上述代码片段展示了如何注入一个已经配置好的 `RedisTemplate` 实例,并创建了一个名为 `getValue` 的方法用于接收键名作为参数并返回对应的值。这里调用了 `opsForValue()` 方法获得 `ValueOperations` 对象实例以便能够访问到相应的 get() 函数从而取得指定键所关联的值[^5]。 值得注意的是,当处理非字符串类型的值时,推荐采用泛型形式声明 `RedisTemplate<K,V>` 并设置合适的序列化策略以确保不同类型数据能被正确解析和保存。例如,如果打算存入或取出的对象不是简单的字符串,则可能需要调整默认的序列化方式来适应实际需求[^3]。 另外,除了直接操作单个键值对外,`RedisTemplate` 还提供了其他几种专门针对集合类型(如列表、哈希表等)的方法来进行更复杂的数据查询与管理。这些高级特性使得开发人员可以根据具体应用场景灵活选用最恰当的方式与 Redis 进行交互[^1]。 #### 关于序列化的注意事项 由于 `RedisTemplate` 支持多种不同的序列化器选项,因此建议根据应用程序的具体情况选择最适合的一种。比如 JSON 或者自定义的序列化逻辑都可以集成进来满足特殊的需求。这一步骤至关重要因为它直接影响到了存入 Redis 后的数据格式及其后续能否顺利解码恢复成原始对象形态[^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值