Spring Data Redis的基本使用
目录
一、简介
二、环境搭建
三、RedisTemplate
四、序列化配置
一、简介
Spring Data Redis 是 Spring 提供的用于简化与 Redis 交互的子项目,封装了 Redis 的底层操作,提供了统一的模板和 Repository 支持,方便开发者使用面向对象的方式操作 Redis。
使用 Spring Data Redis,可以:
- 轻松地与 Redis 进行数据交互,包括字符串、哈希、列表、集合、有序集合等数据类型。
- 支持基于注解的缓存机制,与 Spring Cache 整合。
- 提供了事务支持、发布/订阅(Pub/Sub)、Lua 脚本执行等高级特性。
- 支持多种 Redis 客户端连接器,如 Lettuce(默认)和 Jedis。
二、环境搭建
1. 添加依赖
在使用 Spring Boot 开发时,只需在 pom.xml
中添加 spring-boot-starter-data-redis
依赖即可:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
**注意:**默认情况下使用 Lettuce 作为 Redis 客户端,如果需要使用 Jedis,需要额外添加依赖并进行配置。
2. 配置 Redis 连接
在 application.yml
中配置 Redis 的连接信息:
spring:redis:host: localhostport: 6379password: yourpassword # 如果没有密码,可不配置database: 0
三、RedisTemplate
1. 简介
RedisTemplate
是 Spring Data Redis 提供的核心模板类,用于执行 Redis 的各种操作。它支持所有的 Redis 数据类型,并提供了一系列的便捷方法。
2. 注入 RedisTemplate
Spring Boot 自动配置了 RedisTemplate
,可以直接在代码中注入使用。
@Service
public class RedisService {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;// 业务方法
}
**注意:**默认情况下,RedisTemplate
的键(Key)和值(Value)都使用 java.io.Serializable
进行序列化。如果需要使用其他序列化方式,需要进行配置。
3. 常用操作
String 操作
// 设置键值对
redisTemplate.opsForValue().set("name", "张三");// 获取值
String name = (String) redisTemplate.opsForValue().get("name");// 设置键的过期时间
redisTemplate.opsForValue().set("session:123", "userData", 30, TimeUnit.MINUTES);// 增加数值
redisTemplate.opsForValue().increment("counter", 1);// 删除键
redisTemplate.delete("name");
Hash 操作
// 设置哈希字段
redisTemplate.opsForHash().put("user:1001", "username", "lisi");
redisTemplate.opsForHash().put("user:1001", "email", "lisi@example.com");// 获取哈希字段
Object username = redisTemplate.opsForHash().get("user:1001", "username");// 获取整个哈希
Map<Object, Object> userMap = redisTemplate.opsForHash().entries("user:1001");// 删除哈希字段
redisTemplate.opsForHash().delete("user:1001", "email");
List 操作
// 左侧压入列表
redisTemplate.opsForList().leftPush("tasks", "task1");
redisTemplate.opsForList().leftPush("tasks", "task2");// 获取列表元素
List<Object> tasks = redisTemplate.opsForList().range("tasks", 0, -1);// 弹出列表元素
Object task = redisTemplate.opsForList().leftPop("tasks");
Set 操作
// 添加成员到集合
redisTemplate.opsForSet().add("online_users", "user1", "user2");// 获取集合成员
Set<Object> onlineUsers = redisTemplate.opsForSet().members("online_users");// 判断成员是否存在
boolean isMember = redisTemplate.opsForSet().isMember("online_users", "user1");
ZSet 操作
// 添加成员到有序集合
redisTemplate.opsForZSet().add("leaderboard", "player1", 100);
redisTemplate.opsForZSet().add("leaderboard", "player2", 200);// 获取有序集合成员
Set<Object> topPlayers = redisTemplate.opsForZSet().reverseRange("leaderboard", 0, -1);
4. StringRedisTemplate
StringRedisTemplate
是 RedisTemplate
的子类,专门用于操作字符串类型的数据,默认采用 StringRedisSerializer
进行序列化。
@Service
public class StringRedisService {@Autowiredprivate StringRedisTemplate stringRedisTemplate;public void demo() {// 设置字符串stringRedisTemplate.opsForValue().set("city", "北京");// 获取字符串String city = stringRedisTemplate.opsForValue().get("city");}
}
四、序列化配置
默认情况下,RedisTemplate
使用 JdkSerializationRedisSerializer
进行序列化,这会导致存储的键和值不可读。为了方便查看和调试,可以修改序列化方式:
@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(factory);// 使用 StringRedisSerializer 序列化键StringRedisSerializer stringSerializer = new StringRedisSerializer();template.setKeySerializer(stringSerializer);template.setHashKeySerializer(stringSerializer);// 使用 Jackson2JsonRedisSerializer 序列化值Jackson2JsonRedisSerializer<Object> jsonSerializer = new Jackson2JsonRedisSerializer<>(Object.class);template.setValueSerializer(jsonSerializer);template.setHashValueSerializer(jsonSerializer);template.afterPropertiesSet();return template;}
}
说明:
- 键和哈希键使用
StringRedisSerializer
,值和哈希值使用Jackson2JsonRedisSerializer
。 - 这样配置后,Redis 中存储的键和值都是可读的字符串或 JSON。