RedisTemplate对多种数据结构的操作
1. String类型
示例代码:
// 保存数据
redisTemplate.opsForValue().set("user:1001", "John Doe"); // 设置键值对,无过期时间
redisTemplate.opsForValue().set("user:1002", "Jane Smith", 10, TimeUnit.MINUTES); // 设置键值对并设置10分钟过期
// 获取数据
String user = redisTemplate.opsForValue().get("user:1001");
System.out.println("获取到的用户: " + user); // 输出:John Doe
应用场景:
- 简单缓存:例如缓存用户的姓名、常量等单项数据。
- 计数器:结合
INCR
命令实现原子递增,如统计网站访问量。
2. Hash类型
Redis的Hash数据类型适合存储对象,其中每个字段可以是字符串、数值等。
示例代码:
// 保存数据(保存用户对象的多个字段)
redisTemplate.opsForHash().put("user:profile", "name", "Alice");
redis_TEMPLATE.opsForHash().put("user:profile", "age", 30);
// 获取单个字段
Object name = redisTemplate.opsForHash().get("user:profile", "name");
System.out.println("用户名:" + name); // 输出:Alice
// 获取所有字段和值(返回Map)
Map<Object, Object> user = redisTemplate.opsForHash().entries("user:profile");
System.out.println("用户资料:" + user); // 输出:{name=Alice, age=30}
应用场景:
- 对象缓存:存储用户信息(name、age、email等)。
- 批量更新:通过
hashOperations.putAll()
一次性设置多个字段。
3. List类型
Redis的List是链表结构,支持从两端插入或弹出元素。
示例代码:
// 左侧插入元素(先进后出,类似栈)
redisTemplate.opsForList().leftPush("messageQueue", "Message1");
redisTemplate.opsForList().leftPush("messageQueue", "Message2");
// 获取所有元素(从左到右)
List<String> messages = redisTemplate.opsForList().range("messageQueue", 0, -1);
System.out.println("消息队列:" + messages); // 输出:[Message2, Message1]
// 右侧弹出元素(先进先出,类似队列)
String popped = redisTemplate.opsForList().rightPop("messageQueue");
System.out.println("弹出的消息:" + popped); // 输出:Message1
应用场景:
- 消息队列:实现生产者-消费者模式(如异步处理任务)。
- 记录日志:按时间或顺序保存数据。
4. Set类型
Set是一种无序、不重复的集合,常用于唯一性存储。
示例代码:
// 添加元素到集合
redisTemplate.opsForSet().add("tags", "Java", "Redis", "Spring");
// 获取所有元素
Set<String> tags = redisTemplate.opsForSet().members("tags");
System.out.println("标签集合:" + tags); // 输出:[Java, Redis, Spring]
// 判断元素是否存在
Boolean exists = redisTemplate.opsForSet().isMember("tags", "Redis");
System.out.println("Redis标签是否存在?" + exists); // 输出:true
应用场景:
- 标签系统:统计不重复的用户标签或关键词。
- 随机推荐:通过
S随机获取
选择用户。
5. Sorted Set类型
Sorted Set是有序且无重复的集合,每个元素关联一个分数(score)用于排序。
示例代码:
// 添加元素(分数和值)
redisTemplate.opsForZSet().add("leaderboard", "PlayerA", 95.0); // 分数95
redisTemplate.opsForZSet().add("leaderboard", "PlayerB", 88.0); // 分数88
// 获取排名前3的用户(按分数降序)
Set<String> topPlayers = redisTemplate.opsForZSet().reverseRange("leaderboard", 0, 2);
System.out.println("排行榜前3名:" + topPlayers); // 输出:[PlayerA, PlayerB]
// 获取某个玩家的排名
Long rank = redisTemplate.opsForZSet().reverseRank("leaderboard", "PlayerB");
System.out.println("PlayerB的排名:" + rank); // 输出:1(第2位)
应用场景:
- 排名系统:如游戏或考试的分数排名。
- 优先级队列:根据分数动态调整处理顺序。
通用注意事项:
- 序列化配置:
- 默认情况下,
RedisTemplate
会将Java对象序列化为二进制(如JdkSerializationRedisSerializer
),适合存储简单字符串或复杂对象。 - 若需要存储JSON格式的类,可配置:
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
- 默认情况下,
- 过期时间:通过第二个参数为操作设置有效期,例如:
redisTemplate.opsForValue().set("key", "value", Duration.ofHours(1));
- 事务与管道:使用
multi()
、exec()
或opsFor...
的批量操作优化性能。