RedisTemplate介绍与使用

RedisTemplate 介绍与使用指南

什么是 RedisTemplate

RedisTemplate 是 Spring Data Redis 提供的一个核心类,它封装了 Redis 的各种操作,提供了更高级的抽象来与 Redis 交互。它是 Spring 框架对 Jedis 或 Lettuce 等 Redis 客户端库的封装,提供了更便捷的操作方式。

主要特点:

  • 自动序列化/反序列化
  • 连接管理
  • 异常转换
  • 事务支持
  • 支持多种数据结构的操作

基本使用方法

1. 在 Spring Boot 中配置 RedisTemplate

首先需要在项目中添加依赖:

xml 复制代码
<!-- Maven 依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

然后在 application.properties 或 application.yml 中配置 Redis 连接信息:

ini 复制代码
# application.properties
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=
spring.redis.database=0

2. 自动注入 RedisTemplate

Spring Boot 会自动配置 RedisTemplate,你可以直接注入使用:

typescript 复制代码
@Autowired
private RedisTemplate<String, Object> redisTemplate;

3. 常用操作示例

字符串操作
dart 复制代码
// 设置值
redisTemplate.opsForValue().set("key", "value");

// 获取值
String value = (String) redisTemplate.opsForValue().get("key");

// 设置过期时间
redisTemplate.opsForValue().set("key", "value", 10, TimeUnit.SECONDS);
Hash 操作
dart 复制代码
// 设置 hash 值
redisTemplate.opsForHash().put("user", "name", "John");
redisTemplate.opsForHash().put("user", "age", "30");

// 获取 hash 值
String name = (String) redisTemplate.opsForHash().get("user", "name");

// 获取所有 hash 键值对
Map<Object, Object> user = redisTemplate.opsForHash().entries("user");
List 操作
go 复制代码
// 左推入列表
redisTemplate.opsForList().leftPush("list", "item1");

// 右推入列表
redisTemplate.opsForList().rightPush("list", "item2");

// 获取列表范围
List<Object> list = redisTemplate.opsForList().range("list", 0, -1);
Set 操作
dart 复制代码
// 添加元素
redisTemplate.opsForSet().add("set", "a", "b", "c");

// 获取所有元素
Set<Object> set = redisTemplate.opsForSet().members("set");
ZSet (有序集合) 操作
csharp 复制代码
// 添加元素
redisTemplate.opsForZSet().add("zset", "a", 1);
redisTemplate.opsForZSet().add("zset", "b", 2);

// 获取范围
Set<Object> zset = redisTemplate.opsForZSet().range("zset", 0, -1);

高级配置

自定义 RedisTemplate

如果需要自定义序列化方式,可以创建配置类:

arduino 复制代码
@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);
        
        // 使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值
        Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);
        ObjectMapper mapper = new ObjectMapper();
        mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        mapper.activateDefaultTyping(mapper.getPolymorphicTypeValidator(), ObjectMapper.DefaultTyping.NON_FINAL);
        serializer.setObjectMapper(mapper);
        
        // 使用StringRedisSerializer来序列化和反序列化redis的key值
        template.setKeySerializer(new StringRedisSerializer());
        template.setValueSerializer(serializer);
        
        // Hash key/value序列化方式
        template.setHashKeySerializer(new StringRedisSerializer());
        template.setHashValueSerializer(serializer);
        
        template.afterPropertiesSet();
        return template;
    }
}

使用 StringRedisTemplate

对于简单的字符串操作,可以使用 StringRedisTemplate:

csharp 复制代码
@Autowired
private StringRedisTemplate stringRedisTemplate;

public void example() {
    stringRedisTemplate.opsForValue().set("stringKey", "stringValue");
    String value = stringRedisTemplate.opsForValue().get("stringKey");
}

事务支持

RedisTemplate 支持事务操作:

dart 复制代码
// 启用事务支持
redisTemplate.setEnableTransactionSupport(true);

// 执行事务
redisTemplate.execute(new SessionCallback<Object>() {
    @Override
    public Object execute(RedisOperations operations) throws DataAccessException {
        operations.multi();
        operations.opsForValue().set("key1", "value1");
        operations.opsForValue().set("key2", "value2");
        return operations.exec();
    }
});

注意事项

  1. 序列化问题​:默认的 RedisTemplate 使用 JdkSerializationRedisSerializer,可能会导致存储的数据不易阅读。建议根据需求配置合适的序列化方式。

  2. 连接池配置​:可以在 application.properties 中配置连接池参数:

    ini 复制代码
    spring.redis.lettuce.pool.max-active=8
    spring.redis.lettuce.pool.max-idle=8
    spring.redis.lettuce.pool.min-idle=0
    spring.redis.lettuce.pool.max-wait=-1ms
  3. 异常处理​:Redis 操作可能会抛出异常,建议适当处理异常情况。

  4. 性能考虑​:批量操作比单个操作更高效,可以考虑使用 multiSet、multiGet 等方法。

通过合理使用 RedisTemplate,可以方便地在 Spring Boot 应用中集成 Redis,实现高效的数据缓存和存储功能。

相关推荐
玩代码25 分钟前
备忘录设计模式
java·开发语言·设计模式·备忘录设计模式
BUTCHER51 小时前
Docker镜像使用
java·docker·容器
岁忧1 小时前
(nice!!!)(LeetCode 面试经典 150 题 ) 30. 串联所有单词的子串 (哈希表+字符串+滑动窗口)
java·c++·leetcode·面试·go·散列表
没有口袋啦2 小时前
《Reids》配置文件
数据库·redis
LJianK12 小时前
Java和JavaScript的&&和||
java·javascript·python
RealmElysia2 小时前
java反射
java·开发语言
野蛮人6号2 小时前
黑马点评系列问题之p63unlock.lua不知道怎么整
java·redis·黑马点评
Raners_3 小时前
【Java代码审计(2)】MyBatis XML 注入审计
xml·java·安全·网络安全·mybatis
BillKu3 小时前
Java读取Excel日期内容
java·开发语言·excel
ai小鬼头3 小时前
如何重装旁路由系统并优化AIStarter部署:一步步教程
java·css·github