【Redis系列】RedisTemplate的使用与注意事项


目录

一.什么是RedisTemplate

二.如何使用RedisTemplate

RedisTemplate的API

序列化

三.StringRedisTemplate


一.什么是RedisTemplate

RedisTemplate 是一个工具类,由 Spring 官方提供的方便操作 Redis 数据库的一个工具类,来源于 org.springframework.data.redis.core 包下。其本质属于 Spring-Data 模块下的 Spring-Data-Redis 部分,它提供了从 Spring 应用程序轻松配置和访问 Redis的功能。

Spring-Data-Redis 是通过整合Lettuce和Jedis这俩种Redis客户端产生的,对外则提供了RedisTemplate这样统一的API来供调用者访问。它既支持Luttuce的响应式编程也支持JDK中集合的实现。

二.如何使用RedisTemplate

首先要导入相关依赖

        <!--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>
            <version>2.11.1</version>
        </dependency>

导入相关依赖之后,通过配置文件 application.yml 进行配置,由于 RedisTemplate 是整合的Lettuce和Jedis,因此在配置连接池的时候需要进行选择是使用Lettuce还是Jedis(默认是Lettuce)

spring:
  data:
    redis:
      host: Redis所在主机地址
      port: Redis对应端口号默认6379
      password: 密码
      lettuce:
        pool:
          max-active: 最大连接数
          max-wait: 等待时长
          max-idle: 最大空闲连接
          min-idle: 最小空闲连接

在配置完成后,通过依赖注入就可以直接使用

    @Autowired
    private RedisTemplate redisTemplate;
    
    @Test
    void testCode() {
        String checheCode = "cheche_code";
        String code = "168901";
        //写入Redis
        redisTemplate.opsForValue().set(checheCode, code);
        //读出Redis
        Object o = redisTemplate.opsForValue().get(checheCode);
        System.out.println("验证码为" + o);
    }

运行结果:

RedisTemplate的API

RedisTemplate 提供了丰富的方法来实现对 Redis 的各种操作,包括但不限于字符串、哈希、列表、集合和有序集合等数据结构的操作。以下是一些常用的 RedisTemplate API:

字符串操作

  • opsForValue().set(key, value): 设置字符串值。
  • opsForValue().get(key): 获取字符串值。
  • opsForValue().incr(key): 字符串值自增。
  • opsForValue().decr(key): 字符串值自减。

哈希操作

  • opsForHash().getOperations().put(key, hashKey, value): 向哈希中添加键值对。
  • opsForHash().getOperations().get(key, hashKey): 获取哈希中的值。
  • opsForHash().getOperations().entries(key): 获取哈希中的所有键值对。

列表操作

  • opsForList().leftPush(key, value): 从列表左侧添加元素。
  • opsForList().rightPush(key, value): 从列表右侧添加元素。
  • opsForList().leftPop(key): 从列表左侧弹出元素。
  • opsForList().rightPop(key): 从列表右侧弹出元素。

集合操作

  • opsForSet().add(key, value): 向集合中添加元素。
  • opsForSet().members(key): 获取集合中的所有元素。
  • opsForSet().remove(key, value): 从集合中移除元素。

有序集合操作

  • opsForZSet().add(key, value, score): 向有序集合中添加元素,并指定分数。
  • opsForZSet().range(key, start, end): 获取有序集合中指定分数范围内的元素。
  • opsForZSet().removeRangeByScore(key, minScore, maxScore): 按分数范围移除有序集合中的元素。

键操作

  • delete(key): 删除键。
  • hasKey(key): 检查键是否存在。
  • keys(pattern): 根据模式匹配获取所有键。

事务

  • multi(): 开启事务。
  • exec(): 提交事务。

发布/订阅

  • convertAndSend(channel, message): 发布消息。
  • subscribe(RedisMessageListenerContainer, MessageListener): 订阅消息。

连接管理

  • getConnectionFactory(): 获取连接工厂。
  • getExecutor(): 获取执行器。

序列化

  • setKeySerializer(Serializer): 设置键的序列化器。
  • setValueSerializer(Serializer): 设置值的序列化器。

更多操作可以查看官方提供的API文档:RedisTemplate (Spring Data Redis 3.3.2 API)

序列化

我们打开Redis图形化工具查看一下刚才的验证码会发现刚才存入的验证码变成了一堆乱码

这是因为Redis的序列化并没有按照我们预期的进行转化,我们需要自己去重写一个序列化,如下将key设置为String类型、value设置为json类型,最后将这个对象交给Spring管理,之后在调用该对象的时候就会自动选择我们配置的这个

@Configuration
public class RedisConfig {
    
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
        //创建RedisTemplate对象
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        //设置连接工厂
        template.setConnectionFactory(connectionFactory);
        //创建JSON序列化工具
        GenericJackson2JsonRedisSerializer jsonSerializer = new GenericJackson2JsonRedisSerializer();
        //设置key的序列化
        template.setKeySerializer(RedisSerializer.string());
        template.setHashValueSerializer(RedisSerializer.string());
        //设置value的序列化
        template.setValueSerializer(jsonSerializer);
        template.setHashValueSerializer(jsonSerializer);
        return template;
    }
}

对于JSON序列化工具,我们也需要引入依赖:

        <!--jackson依赖-->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.17.1</version>
        </dependency>

我们再次打开测试观察结果:

@SpringBootTest
class RedisDemoApplicationTests {
    
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    
    @Test
    void testCode() {
        String checheCode = "cheche_code";
        String code = "168901";
        //写入Redis
        redisTemplate.opsForValue().set(checheCode, code);
        //读出Redis
        Object o = redisTemplate.opsForValue().get(checheCode);
        System.out.println("验证码为" + o);
    }
}

我们可以发现数据已经正常显示出来了

三.StringRedisTemplate

由于存储在 Redis 中的 key 和 value 通常是很常见的 String 类型,Redis模块提供了 RedisConnection 和 RedisTemplate 的扩展,分是 StringRedisConnection 和 StringRedisTemplate,作为字符串操作的解决方案。

打开源码我们可以看见对于Key、Value、HashKey、HashValue都是进行String类型的序列化。

因此对于一些复杂类型,如对象在StringRedisTemplate的时候往往需要自己手动序列化将对象转为JSON再存入Redis。




本次的分享就到此为止了,希望我的分享能给您带来帮助,创作不易也欢迎大家三连支持,你们的点赞就是博主更新最大的动力!如有不同意见,欢迎评论区积极讨论交流,让我们一起学习进步!有相关问题也可以私信博主,评论区和私信都会认真查看的,我们下次再见

使用 RedisTemplate 进行操作 Redis 数据库时,有一些使用注意事项需要注意: 1. 配置 RedisTemplate:在使用 RedisTemplate 之前,需要先配置它。可以使用 Spring 配置文件(如 XML 配置文件)或者注解方式来配置 RedisTemplate。 2. 数据类型转换:RedisTemplate 是一个泛型类,需要指定键(key)和值(value)的类型。默认情况下,RedisTemplate 的键和值都是使用 Java 的序列化机制进行序列化和反序列化的。如果希望以其他格式存储数据(如 JSON),可以自定义序列化器或使用已有的序列化器。 3. 使用 BoundXXXOps 对象:RedisTemplate 提供了一系列的 BoundXXXOps 对象,如 BoundValueOperations、BoundListOperations、BoundSetOperations 等,用于操作不同类型的数据结构。使用 BoundXXXOps 对象可以方便地进行连续的操作,不需要每次都指定 key。 4. 事务支持:RedisTemplate 支持事务操作。可以通过调用 RedisTemplate 的 multi()、exec() 和 discard() 方法来开启、提交或者取消事务。 5. 执行 Redis 命令:RedisTemplate 提供了执行 Redis 命令的方法,如 opsForValue()、opsForList()、opsForSet() 等。通过这些方法可以调用 Redis 的各种命令操作数据。 6. 注意事项: - RedisTemplate 是线程安全的,可以在多个线程中共享使用。 - 在使用 RedisTemplate 进行操作时,需要注意异常处理和错误情况的处理,如连接超时、操作失败等。 - 使用 RedisTemplate 时,应该根据实际需求选择适当的数据结构和操作方法,以提高性能和减少资源消耗。 下面是一个示例代码,演示了如何使用 RedisTemplate 进行基本的操作: ```java import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.ValueOperations; public class RedisExample { private RedisTemplate<String, String> redisTemplate; public RedisExample(RedisTemplate<String, String> redisTemplate) { this.redisTemplate = redisTemplate; } public void setValue(String key, String value) { ValueOperations<String, String> valueOps = redisTemplate.opsForValue(); valueOps.set(key, value); } public String getValue(String key) { ValueOperations<String, String> valueOps = redisTemplate.opsForValue(); return valueOps.get(key); } public void deleteValue(String key) { redisTemplate.delete(key); } } ``` 上述代码中,我们通过构造函数注入了一个 RedisTemplate 对象,并在 setValue、getValue、deleteValue 方法中使用 opsForValue() 方法获取了 ValueOperations 对象,用于操作字符串值。然后,我们可以通过该对象进行对字符串值的设置、获取和删除操作。 希望以上信息对你有所帮助!如有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值