2026/2/16 13:43:14
网站建设
项目流程
网站商城与网站区别吗,wordpress 重置插件,wordpress后台管理,wordpress可视化函数#x1f343; 予枫#xff1a;个人主页#x1f4da; 个人专栏: 《Java 从入门到起飞》《读研码农的干货日常》#x1f4bb; Debug 这个世界#xff0c;Return 更好的自己#xff01; 引言 做电商或社交开发的同学#xff0c;大概率都遇到过这样的痛点#xff1a;购物车… 予枫个人主页 个人专栏: 《Java 从入门到起飞》《读研码农的干货日常》 Debug 这个世界Return 更好的自己引言做电商或社交开发的同学大概率都遇到过这样的痛点购物车商品实时更新、点赞功能秒级响应、排行榜实时排序既要扛住十万级并发请求又要保证核心数据不丢失——这时候Redis 准存储就是破局关键。不同于纯缓存的“临时存储”准存储既保留了Redis的高性能优势又通过合理的设计实现数据安全完美适配电商、社交等核心业务场景。本文将从准存储定义出发结合购物车、点赞、排行榜三大高频场景拆解实现逻辑与高并发优化方案干货满满建议收藏慢慢看文章目录引言一、什么是Redis准存储准存储的核心特性3大关键点二、电商场景实战购物车Hash结构实现2.1 实现逻辑拆解2.2 核心代码实现Java示例2.3 高并发优化点三、社交场景实战点赞功能Set结构实现3.1 实现逻辑拆解3.2 核心代码实现Java示例3.3 高并发优化点四、通用场景实战排行榜Sorted Set结构实现4.1 实现逻辑拆解4.2 核心代码实现Java示例4.3 高并发优化点五、高并发下的性能优化核心Pipeline批量操作5.1 Pipeline原理5.2 核心代码实现批量查询点赞状态示例5.3 Pipeline使用注意事项六、全文总结一、什么是Redis准存储首先我们要明确Redis准存储≠缓存也≠数据库而是介于两者之间的“高性能数据载体”。核心定义准存储是指基于Redis的高性能特性将核心业务数据非核心但对响应速度要求极高以特定数据结构存储通过持久化配置数据同步策略实现“高性能访问”与“数据安全兜底”的平衡适用于对实时性要求高、数据一致性要求中等的场景如购物车、点赞、排行榜等。准存储的核心特性3大关键点高性能优先基于Redis内存操作特性读写响应时间控制在毫秒级支撑高并发场景数据安全兜底开启AOF/RDB持久化配合定时同步到数据库避免Redis宕机导致数据丢失适配特定场景针对非核心交易数据购物车未支付商品、点赞关系、临时排行榜无需强事务支持允许短时间数据不一致可通过同步机制补偿。 提示准存储的核心价值的是“取舍”——牺牲极致一致性换取超高并发与响应速度这也是电商、社交场景的核心诉求。觉得有收获的同学欢迎点赞收藏后续实战代码可直接复用二、电商场景实战购物车Hash结构实现购物车是电商平台的核心场景之一要求支持“添加商品、修改数量、删除商品、查询商品列表”等操作同时要保证用户切换设备时数据同步且在高并发如双十一时不卡顿。Redis的Hash结构键值对集合天然适配购物车场景。2.1 实现逻辑拆解核心思路以用户ID作为Redis的Key如cart:user:10086Hash的Field为商品IDHash的Value为商品详情JSON格式包含商品名称、单价、数量、选中状态等数据安全开启AOF持久化每秒同步一次同时后台定时任务如每分钟将购物车数据同步到MySQL数据库兜底存储核心操作添加/修改商品hset、删除商品hdel、查询所有商品hgetall、清空购物车del。2.2 核心代码实现Java示例/** * 购物车Redis操作工具类 */ComponentpublicclassCartRedisUtil{AutowiredprivateStringRedisTemplateredisTemplate;// 购物车Key前缀privatestaticfinalStringCART_KEY_PREFIXcart:user:;// 过期时间7天用户未操作自动清理privatestaticfinalLongEXPIRY_TIME7*24*60*60L;/** * 添加/修改购物车商品 * param userId 用户ID * param productId 商品ID * param productInfo 商品详情JSON字符串 */publicvoidaddOrUpdateCart(LonguserId,LongproductId,StringproductInfo){StringkeyCART_KEY_PREFIXuserId;redisTemplate.opsForHash().put(key,productId.toString(),productInfo);// 设置过期时间重置过期时间用户操作后延续7天redisTemplate.expire(key,EXPIRY_TIME,TimeUnit.SECONDS);}/** * 删除购物车商品 * param userId 用户ID * param productId 商品ID */publicvoiddeleteCartItem(LonguserId,LongproductId){StringkeyCART_KEY_PREFIXuserId;redisTemplate.opsForHash().delete(key,productId.toString());}/** * 查询用户购物车所有商品 * param userId 用户ID * return 商品列表Map商品ID, 商品详情 */publicMapString,StringgetCartList(LonguserId){StringkeyCART_KEY_PREFIXuserId;returnredisTemplate.opsForHash().entries(key);}/** * 清空购物车 * param userId 用户ID */publicvoidclearCart(LonguserId){StringkeyCART_KEY_PREFIXuserId;redisTemplate.delete(key);}}2.3 高并发优化点批量操作用户批量添加/删除商品时使用hmultiSet/hmultiGet替代多次单条操作减少Redis网络请求过期清理设置合理的过期时间如7天避免无效数据占用内存缓存预热双十一等大促前将高频用户的购物车数据提前加载到Redis内存中。三、社交场景实战点赞功能Set结构实现社交平台的点赞功能如文章点赞、评论点赞要求支持“点赞、取消点赞、查询点赞状态、统计点赞数量”等操作特点是并发量极高单篇热门文章点赞量可达百万级且对实时性要求极高。Redis的Set结构无序不重复集合适合存储点赞用户ID天然支持去重避免重复点赞。3.1 实现逻辑拆解核心思路以“业务类型:对象ID”作为Redis的Key如like:article:2024表示文章2024的点赞集合Set的Value为点赞用户ID点赞状态判断用户是否点赞sismember点赞则添加用户IDsadd取消点赞则移除用户IDsrem点赞数量直接获取Set集合的大小scard无需查询数据库数据安全开启AOF持久化定时如每5分钟将点赞数据同步到MySQL存储点赞关系用于后续统计分析。3.2 核心代码实现Java示例/** * 点赞Redis操作工具类 */ComponentpublicclassLikeRedisUtil{AutowiredprivateStringRedisTemplateredisTemplate;// 点赞Key前缀article文章comment评论privatestaticfinalStringLIKE_KEY_PREFIXlike:%s:%s;// 过期时间永久点赞数据需长期保留privatestaticfinalLongEXPIRY_TIME-1L;/** * 点赞操作 * param bizType 业务类型article/comment * param bizId 业务ID文章ID/评论ID * param userId 用户ID * return true点赞成功false已点赞重复点赞 */publicbooleanlike(StringbizType,LongbizId,LonguserId){StringkeyString.format(LIKE_KEY_PREFIX,bizType,bizId);// sadd返回1表示添加成功未点赞返回0表示已存在重复点赞LongresultredisTemplate.opsForSet().add(key,userId.toString());returnresult!nullresult0;}/** * 取消点赞操作 * param bizType 业务类型 * param bizId 业务ID * param userId 用户ID * return true取消成功false未点赞无需取消 */publicbooleancancelLike(StringbizType,LongbizId,LonguserId){StringkeyString.format(LIKE_KEY_PREFIX,bizType,bizId);// srem返回1表示移除成功已点赞返回0表示不存在未点赞LongresultredisTemplate.opsForSet().remove(key,userId.toString());returnresult!nullresult0;}/** * 查询用户是否点赞 * param bizType 业务类型 * param bizId 业务ID * param userId 用户ID * return true已点赞false未点赞 */publicbooleanisLiked(StringbizType,LongbizId,LonguserId){StringkeyString.format(LIKE_KEY_PREFIX,bizType,bizId);returnredisTemplate.opsForSet().isMember(key,userId.toString());}/** * 统计点赞数量 * param bizType 业务类型 * param bizId 业务ID * return 点赞数量 */publicLongcountLike(StringbizType,LongbizId){StringkeyString.format(LIKE_KEY_PREFIX,bizType,bizId);returnredisTemplate.opsForSet().size(key);}}3.3 高并发优化点避免缓存穿透对于未点赞的对象Redis中不会存储Key可设置空值缓存如点赞数为0时存储Key并设置短期过期时间批量统计多篇文章/多条评论的点赞数统计使用pipeline批量查询减少网络往返次数异步同步点赞数据同步到MySQL时采用异步线程池如ThreadPoolExecutor避免阻塞点赞接口响应。 互动时刻你在项目中实现点赞功能时遇到过哪些问题欢迎在评论区留言交流四、通用场景实战排行榜Sorted Set结构实现排行榜是电商销量排行、社交粉丝排行、游戏积分排行等场景的高频需求要求支持“实时更新排名、查询TopN、查询用户排名”等操作且排序结果需实时准确。Redis的Sorted Set结构有序不重复集合通过“分数score”排序天然适配排行榜场景。4.1 实现逻辑拆解核心思路以“排行榜名称”作为Redis的Key如rank:sales:202412表示2024年12月商品销量排行Sorted Set的Value为商品ID或用户IDScore为排序依据销量、粉丝数、积分等排名规则默认按Score降序排序zrevrange支持升序排序zrange核心操作更新排名zadd、查询TopNzrevrange、查询用户排名zrevrank、查询用户分数zscore。4.2 核心代码实现Java示例/** * 排行榜Redis操作工具类 */ComponentpublicclassRankRedisUtil{AutowiredprivateStringRedisTemplateredisTemplate;// 过期时间30天月度排行榜保留30天privatestaticfinalLongEXPIRY_TIME30*24*60*60L;/** * 更新排行榜数据添加/修改分数 * param rankKey 排行榜Key如rank:sales:202412 * param member 成员ID商品ID/用户ID * param score 分数排序依据 */publicvoidupdateRank(StringrankKey,Stringmember,Doublescore){redisTemplate.opsForZSet().add(rankKey,member,score);// 设置过期时间redisTemplate.expire(rankKey,EXPIRY_TIME,TimeUnit.SECONDS);}/** * 查询TopN排行榜降序从高到低 * param rankKey 排行榜Key * param topN 前N名 * return ListZSetOperations.TypedTupleString包含成员ID和分数 */publicListZSetOperations.TypedTupleStringgetTopNRank(StringrankKey,inttopN){// 0表示第1名topN-1表示第N名闭区间returnredisTemplate.opsForZSet().reverseRangeWithScores(rankKey,0,topN-1);}/** * 查询用户排名降序排名从0开始 * param rankKey 排行榜Key * param member 成员ID * return 排名null表示未上榜 */publicLonggetMemberRank(StringrankKey,Stringmember){// reverseRank降序排名0为第一名returnredisTemplate.opsForZSet().reverseRank(rankKey,member);}/** * 查询用户分数 * param rankKey 排行榜Key * param member 成员ID * return 分数null表示未上榜 */publicDoublegetMemberScore(StringrankKey,Stringmember){returnredisTemplate.opsForZSet().score(rankKey,member);}}4.3 高并发优化点批量更新多成员分数更新时使用addAll批量添加减少Redis请求分数自增支持分数递增如销量1使用incrementScore替代add原子操作避免并发问题热点分离热门排行榜如实时销量榜可拆分多个Redis实例存储避免单实例压力过大。五、高并发下的性能优化核心Pipeline批量操作无论是购物车、点赞还是排行榜场景在高并发请求下单条Redis操作会因为网络往返次数过多导致响应延迟。Redis Pipeline流水线允许将多个命令打包发送到Redis服务器服务器批量执行后一次性返回结果可大幅减少网络往返次数提升吞吐量。5.1 Pipeline原理传统操作客户端发送1条命令 → 服务器执行并返回 → 客户端接收结果1次网络往返Pipeline操作客户端打包N条命令 → 服务器批量执行 → 客户端一次性接收N条结果1次网络往返注意Pipeline中的命令是批量执行的但并非原子操作若其中一条命令失败其他命令仍会执行适合非事务性场景。5.2 核心代码实现批量查询点赞状态示例/** * 批量查询用户点赞状态使用Pipeline优化 */publicMapLong,BooleanbatchCheckLike(StringbizType,LongbizId,ListLonguserIds){StringkeyString.format(LIKE_KEY_PREFIX,bizType,bizId);MapLong,BooleanresultMapnewHashMap(userIds.size());// 使用Pipeline批量执行命令ListObjectresponsesredisTemplate.executePipelined(newRedisCallbackVoid(){OverridepublicVoiddoInRedis(RedisConnectionconnection)throwsDataAccessException{StringRedisConnectionstringRedisConnection(StringRedisConnection)connection;for(LonguserId:userIds){// 批量添加sismember命令stringRedisConnection.sIsMember(key,userId.toString());}returnnull;}});// 处理响应结果for(inti0;iuserIds.size();i){LonguserIduserIds.get(i);BooleanisLiked(Boolean)responses.get(i);resultMap.put(userId,isLiked!nullisLiked);}returnresultMap;}5.3 Pipeline使用注意事项命令打包数量不宜过多建议每次100-1000条避免单次请求数据量过大导致阻塞适用场景非事务性、批量读写场景如批量查询、批量更新不适合需要原子性的操作性能提升高并发场景下Pipeline可将吞吐量提升5-10倍大幅降低接口响应时间。六、全文总结本文围绕Redis准存储的核心价值结合电商购物车Hash、社交点赞Set、通用排行榜Sorted Set三大高频业务场景详细拆解了实现逻辑、核心代码并重点讲解了高并发下的性能优化方案Pipeline批量操作、异步同步、过期清理等。核心要点总结Redis准存储的核心是“高性能数据安全”的平衡适配非核心但实时性要求高的场景不同业务场景需选择合适的Redis数据结构Hash适配键值对、Set适配去重、Sorted Set适配排序高并发优化的关键是减少Redis网络往返次数Pipeline、避免无效数据过期清理、分散压力热点分离。Redis准存储在电商、社交等领域的应用极为广泛掌握这些实战技巧能让你在面对高并发场景时更从容。建议结合实际项目场景多练多总结将理论转化为实战能力。