问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

RedisTemplate的使用与注意事项

创作时间:
作者:
@小白创作中心

RedisTemplate的使用与注意事项

引用
CSDN
1.
https://blog.csdn.net/m0_74823452/article/details/145659209

RedisTemplate是Spring官方提供的用于操作Redis数据库的工具类,它提供了丰富的API来实现对Redis的各种操作。本文将详细介绍RedisTemplate的使用方法、注意事项以及相关的序列化问题解决方案。

一.什么是RedisTemplate

RedisTemplate是一个工具类,由Spring官方提供,方便操作Redis数据库。它来源于org.springframework.data.redis.core包下,属于Spring-Data模块下的Spring-Data-Redis部分。RedisTemplate通过整合Lettuce和Jedis这两种Redis客户端,对外提供了统一的API供调用者访问。它既支持Lettuce的响应式编程,也支持JDK中集合的实现。

二.如何使用RedisTemplate

1. 导入相关依赖

要使用RedisTemplate,首先需要在项目中导入相关依赖:

<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>

2. 配置Redis连接

导入依赖后,通过配置文件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: 最小空闲连接

3. 使用RedisTemplate

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

@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)

序列化问题及解决方案

使用RedisTemplate时,可能会遇到序列化问题。例如,存储在Redis中的数据可能变成乱码。这是因为Redis的序列化并没有按照预期进行转化。为了解决这个问题,可以自定义序列化器。例如,将key设置为String类型,value设置为JSON类型:

@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序列化工具,也需要引入依赖:

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

StringRedisTemplate

由于存储在Redis中的key和value通常是很常见的String类型,Redis模块提供了RedisConnection和RedisTemplate的扩展,分别是StringRedisConnection和StringRedisTemplate,作为字符串操作的解决方案。打开源码可以看到,对于Key、Value、HashKey、HashValue都是进行String类型的序列化。因此,对于一些复杂类型,如对象在StringRedisTemplate的时候往往需要自己手动序列化将对象转为JSON再存入Redis。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号