news 2026/5/5 4:51:01

从购物车到点赞排行:用Spring Boot RedisTemplate的opsForHash和opsForZSet搞定5个真实业务场景

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从购物车到点赞排行:用Spring Boot RedisTemplate的opsForHash和opsForZSet搞定5个真实业务场景

从购物车到点赞排行:用Spring Boot RedisTemplate的opsForHash和opsForZSet搞定5个真实业务场景

Redis作为高性能的内存数据库,在现代互联网应用中扮演着越来越重要的角色。特别是在高并发场景下,合理利用Redis的数据结构可以显著提升系统性能。本文将基于Spring Boot框架,通过RedisTemplate提供的opsForHash和opsForZSet等操作,实现五个典型的业务场景。

1. 用opsForHash实现购物车功能

电商平台的购物车是一个典型的使用哈希表结构的场景。每个用户的购物车可以看作是一个哈希表,其中商品ID作为字段(field),商品数量和属性作为值(value)。

// 添加商品到购物车 public void addToCart(String userId, String productId, int quantity) { redisTemplate.opsForHash().put("cart:" + userId, productId, String.valueOf(quantity)); } // 获取购物车中某商品数量 public int getProductQuantity(String userId, String productId) { Object quantity = redisTemplate.opsForHash().get("cart:" + userId, productId); return quantity != null ? Integer.parseInt(quantity.toString()) : 0; } // 获取整个购物车内容 public Map<Object, Object> getCart(String userId) { return redisTemplate.opsForHash().entries("cart:" + userId); }

哈希表结构的优势在于:

  • 可以单独操作某个字段,而不需要读取整个哈希表
  • 内存占用更高效,特别适合存储对象类型的数据
  • 支持原子性操作,保证数据一致性

2. 用opsForZSet实现文章点赞排行榜

内容平台的点赞排行是一个典型的排序需求,有序集合(ZSet)可以完美解决这个问题。我们可以将文章ID作为成员(member),点赞数作为分数(score)。

// 用户点赞文章 public void likeArticle(String articleId, String userId) { // 使用集合记录已点赞用户,防止重复点赞 String likeKey = "article:liked:" + articleId; if (redisTemplate.opsForSet().add(likeKey, userId) == 1) { // 点赞成功,增加文章分数 redisTemplate.opsForZSet().incrementScore("article:ranking", articleId, 1); } } // 获取点赞排行榜前10 public Set<ZSetOperations.TypedTuple<Object>> getTop10Articles() { return redisTemplate.opsForZSet().reverseRangeWithScores("article:ranking", 0, 9); }

有序集合的特点:

  • 自动按分数排序
  • 支持范围查询
  • 可以获取成员的排名
  • 支持分数增减操作

3. 用opsForList实现最新评论列表

对于内容平台的评论系统,我们通常需要展示最新的评论。Redis的列表(List)结构可以很好地满足这个需求。

// 添加新评论 public void addComment(String articleId, String commentId, String comment) { String key = "comments:" + articleId; // 将新评论添加到列表头部 redisTemplate.opsForList().leftPush(key, comment); // 限制列表长度,只保留最近100条评论 redisTemplate.opsForList().trim(key, 0, 99); } // 获取最新10条评论 public List<Object> getLatestComments(String articleId, int count) { return redisTemplate.opsForList().range("comments:" + articleId, 0, count - 1); }

列表结构的优势:

  • 插入和获取头部元素的时间复杂度都是O(1)
  • 支持范围查询
  • 可以方便地实现队列或栈的功能

4. 用opsForSet实现共同关注/好友推荐

社交网络中的共同关注和好友推荐功能可以利用Redis的集合(Set)结构来实现。

// 用户关注某人 public void followUser(String userId, String followId) { redisTemplate.opsForSet().add("following:" + userId, followId); redisTemplate.opsForSet().add("followers:" + followId, userId); } // 获取共同关注 public Set<Object> getCommonFollowing(String userId1, String userId2) { return redisTemplate.opsForSet().intersect( "following:" + userId1, "following:" + userId2 ); } // 推荐可能认识的人(共同关注最多的人) public Set<Object> recommendFriends(String userId) { // 获取用户关注的人 Set<Object> following = redisTemplate.opsForSet().members("following:" + userId); // 获取这些人的关注列表 List<String> otherKeys = following.stream() .map(f -> "following:" + f) .collect(Collectors.toList()); // 计算这些关注列表与当前用户关注列表的交集 return redisTemplate.opsForSet().intersect( "following:" + userId, otherKeys ); }

集合结构的特点:

  • 自动去重
  • 支持集合运算(并集、交集、差集)
  • 可以快速判断元素是否存在

5. 用opsForValue实现分布式锁和验证码缓存

Redis的字符串(String)结构虽然简单,但在实际应用中非常有用,比如实现分布式锁和验证码缓存。

// 获取分布式锁 public boolean tryLock(String lockKey, String requestId, long expireTime) { return redisTemplate.opsForValue().setIfAbsent( lockKey, requestId, expireTime, TimeUnit.MILLISECONDS ); } // 释放分布式锁 public boolean releaseLock(String lockKey, String requestId) { String script = "if redis.call('get', KEYS[1]) == ARGV[1] then " + "return redis.call('del', KEYS[1]) " + "else " + "return 0 " + "end"; return redisTemplate.execute( new DefaultRedisScript<>(script, Long.class), Collections.singletonList(lockKey), requestId ) == 1; } // 存储验证码 public void storeCaptcha(String phone, String captcha) { String key = "captcha:" + phone; redisTemplate.opsForValue().set(key, captcha, 5, TimeUnit.MINUTES); } // 验证验证码 public boolean verifyCaptcha(String phone, String inputCaptcha) { String key = "captcha:" + phone; String storedCaptcha = (String) redisTemplate.opsForValue().get(key); return inputCaptcha != null && inputCaptcha.equals(storedCaptcha); }

字符串结构的使用技巧:

  • 可以设置过期时间,适合临时数据存储
  • 操作简单高效
  • 支持原子性操作

在实际项目中,选择合适的数据结构需要考虑以下因素:

  • 数据的访问模式(读多还是写多)
  • 是否需要排序
  • 是否需要去重
  • 数据量大小
  • 是否需要设置过期时间

RedisTemplate提供了丰富的操作方法,但要注意序列化问题。建议根据业务需求配置合适的序列化方式,避免出现类型转换错误。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/5 4:49:52

ARM指令集详解:MOVT、MRC与MRRC指令应用

1. ARM指令集基础与寄存器操作 在嵌入式系统开发领域&#xff0c;ARM架构因其高效能和低功耗特性成为主流选择。作为开发者&#xff0c;深入理解ARM指令集对于编写高效底层代码至关重要。ARM指令集可分为数据处理指令、加载存储指令、分支指令和协处理器指令等几大类&#xff0…

作者头像 李华
网站建设 2026/5/5 4:39:16

SANA-Video:基于块线性注意力的高效视频生成技术

1. 项目背景与核心价值视频生成技术正在经历从实验室研究到产业落地的关键转折期。传统基于逐帧渲染或3D建模的方案存在计算成本高、生成效率低的痛点&#xff0c;而主流扩散模型又面临长序列建模的显存瓶颈。SANA-Video通过引入块线性注意力机制&#xff0c;在保持Transformer…

作者头像 李华
网站建设 2026/5/5 4:35:30

别再手动调参了!用麻雀算法SSA自动优化VMD分解参数(附MATLAB代码)

基于麻雀算法的VMD参数智能优化实战&#xff1a;从理论到故障诊断应用 在信号处理领域&#xff0c;变分模态分解(VMD)因其出色的非平稳信号分析能力而广受关注。然而&#xff0c;传统VMD应用中最大的痛点莫过于参数选择——模态数K和惩罚因子α的确定往往依赖经验或反复试错&am…

作者头像 李华
网站建设 2026/5/5 4:31:30

Arm Cortex-M52处理器架构与嵌入式应用解析

1. Cortex-M52处理器架构深度解析Cortex-M52是Arm China基于Armv8.1-M架构设计的中端微控制器处理器&#xff0c;作为Cortex-M系列的最新成员&#xff0c;它在性能、能效和功能扩展性方面实现了显著突破。这款处理器特别适合需要平衡计算性能与功耗的嵌入式应用场景&#xff0c…

作者头像 李华