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,实现高效的数据缓存和存储功能。

相关推荐
事圆则缓10 分钟前
Java I/O、文件与 Android 存储
java
wno70416 分钟前
Spring Security基础使用
java·后端·spring
晚安日记wanna1 小时前
Redis 持久化RDB 和 AOF 到底该怎么选
redis·面试·架构
小蒜学长1 小时前
基于RFID技术的仓储管理系统设计(代码+数据库+LW)
java·数据库·spring boot·后端·rfid技术·仓储管理
梦影_1 小时前
Langchain简单快速上手教程(五)——聊天模型之流式传输
java·数据库·人工智能·python·langchain
数据狐(Datafox)1 小时前
1688商品列表API接口解析(附 JSON 样例)
java·开发语言·数据库·爬虫·json
xcl09251 小时前
健身场馆无人自动化系统:从架构设计到落地实践
java·spring boot
EatFan1 小时前
一个二维码背后的系统设计:批次生成、绑定、扫码与数据统计怎么做?
java·后端·微信小程序·二维码·qrcode
白远山1 小时前
自助健身小程序源码:架构拆解、核心链路与本地部署实战
java·架构·uni-app·需求分析
Lyyaoo.2 小时前
【动态规划】【待更新】
java·数据结构·算法