自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Wang的专栏

Email : johnnynode@gmail.com | Github : github.com/rwxbot

  • 博客(2388)
  • 收藏
  • 关注

原创 Java 项目实战: 交友项目 - 小视频模块实战:访客记录、FastDFS 存储与 SpringCache 缓存

本文实现小视频模块核心功能:基于MongoDB记录“谁看过我”访客数据,使用FastDFS分布式文件系统存储视频与缩略图,通过Dubbo服务完成发布与列表接口。结合Spring Cache注解(@Cacheable/@CacheEvict)对视频列表缓存30秒,发布后自动清空缓存,提升性能并保证数据实时性。工程新增视频、访客实体及缓存配置,三条技术线(MongoDB、FastDFS、Redis)协同支撑完整链路。

2026-11-02 00:30:00 224

原创 Java 项目实战: 交友项目 - 附近的人与快配:LBS 与配对功能全流程复盘

本文系统梳理社交产品两大核心能力:LBS(地理围圈)与快配(双向匹配)。通过「地理位置上报→2dsphere索引查询→项目卡片处理→Redis双Set判存→好友双写」完整链路,沉淀五项可复用技术套路(如地理空间四件套、双向状态缓存等),并给出12个关键坑点与上线前检查清单。实践任务聚焦修复Long ==比较、升级$geoNear排序分页,确保功能稳定可用。

2026-11-01 23:30:00 363

原创 Java 项目实战: 交友项目 - MongoDB 地理位置实战:搜附近的人(withinSphere 圆球查询与 $geoNear 聚合)

本文详解基于MongoDB的“搜附近”功能实现,核心为withinSphere圆球查询。通过用户当前坐标(user_location集合)作为圆心,结合前端传入的米制半径,经单位换算(米→公里→弧度)后构建Circle,利用2dsphere索引高效查询覆盖范围内的用户。需注意:接口返回null而非空集以区分未上报位置与无结果;查询默认包含自身,排序与分页需在上层处理,避免因withinSphere不支持距离排序导致结果失序。

2026-11-01 22:15:00 314

原创 MongoDB 地理位置上报实战:从接口设计到覆盖写入的完整实现

本文详解「附近的人」功能中位置上报与存储设计:基于用户移动距离(>500米)或定时(5分钟)触发上报,避免频繁耗电与隐私风险。采用独立 user_location 集合,每用户仅保留最新位置,使用 GeoJsonPoint + 2dsphere 索引保障查询效率。因 Dubbo 序列化限制,接口传参为 Double longitude, latitude,由服务端封装为 GeoJsonPoint。结合 MongoDB 索引优化与数据语义分离,实现高效、低耗、可维护的位置服务。

2026-11-01 20:30:00 314

原创 Java 项目实战: 交友项目 - 搜索附近的功能概述和分析

「搜附近」功能基于地理位置精准匹配,通过客户端定时上报坐标,MongoDB 以 2dsphere 索引存储 GeoJsonPoint,实现高效范围检索。查询时以用户为中心画圆圈人,按距离排序返回结果,需注意坐标顺序(经度在前)、单位换算(米转千米)、排序与分页缺失等关键细节。数据链路清晰:上报→存储→检索,核心依赖地理索引与正确参数处理,是唯一强依赖位置的功能,结果完全由坐标决定,与推荐无关。

2026-11-01 19:30:00 573

原创 Java 项目实战:交友项目 - MongoDB 地理位置

本文详解「搜附近的人」的 LBS 核心实现,聚焦 MongoDB 地理空间查询。通过 2dsphere 索引(而非 2d)结合 GeoJSON Point 结构(坐标顺序为 [经度, 纬度]),实现高效距离检索。推荐使用 $near 实现按距离排序的“附近人”列表,避免全表遍历性能瓶颈,确保真实地球曲率下的精准定位。

2026-11-01 01:30:00 515

原创 # Java 项目实战: 交友项目 - 左滑不喜欢:无配对检查的推荐排除

左滑“不喜欢”与右滑“喜欢”在产品语义上不对称:右滑触发配对,左滑仅反馈排除信号。代码实现上,notLikeUser 与 likeUser 镜像操作,但左滑不进行配对检查,因推荐列表已通过 NIN 排除所有表态用户。关键在于,user_like 表中无论喜欢或不喜欢,均被用于持久排除,左滑后用户永久不再出现于推荐列表,反悔只需再次滑动翻转态度,零成本更新。

2026-11-01 00:30:00 376

原创 Java 项目实战: 交友项目 - 交友喜欢

本文详解用户滑动卡片后“右滑喜欢”的完整链路:先在MongoDB的user_like集合中保存或更新记录,同步更新Redis的USER_LIKE_SET与USER_NOT_LIKE_SET两个Set,确保推荐列表实时排除已划过用户;若对方也喜欢自己,则触发双向好友关系创建,联动交友系统与环信IM。核心逻辑为“先保存、再判断、后加好友”,兼顾数据一致性与性能,实现高效配对闭环。

2026-10-31 23:30:00 500

原创 Java 项目实战:交友项目 - 交友左滑右滑

项目实现滑动交互(右滑喜欢/左滑不喜欢)的完整链路:通过统一 user_like 集合记录用户态度,isLike 字段动态标识偏好,支持“保存或更新”语义;结合 Redis 双 Set 实现高效判存与排除已划用户;滑动后同步更新数据库与缓存,并在双向喜欢时自动加好友,反之则解除关系。整体遵循“先保存、再判断、后加好友”原则,确保数据一致性与业务逻辑闭环。

2026-10-31 22:30:00 444

原创 Java 项目实战: 交友项目 - 项目:需求分析与滑动数据设计

「Tinder式快配」通过卡片滑动实现低门槛交友,核心在于高效的数据设计:利用Redis Set存储用户喜欢/不感兴趣记录,实现O(1)写入与判存,天然去重且支持交集运算。双写机制保障数据持久化,推荐时排除已滑用户,双向右滑触发自动配对。接口简洁,交互流畅,兼顾性能与可扩展性。

2026-10-31 18:14:22 284

原创 Java 项目实战:交友项目 - 社交产品核心互动实战:LBS 搜附近的人与左滑右滑快速配对

本篇补齐社交产品核心互动:基于MongoDB 2dsphere索引与GeoJSON实现「搜附近的人」,通过上报地理位置(UserLocation)并构建圆圈查询;结合Redis Set与MongoDB双写机制,实现「左滑不喜欢、右滑喜欢」的快速配对逻辑。项目链路中,推荐卡片去重($sample + nin)、双向喜欢自动加好友(含环信同步)等设计,体现推荐系统关键模式。新增9个类,修改3处,完成从位置数据到匹配关系的全链路闭环。

2026-10-31 02:00:00 328

原创 Java 项目实战:交友项目 - 即时通信总结:全链路复盘、可复用清单与自检

本章总结即时通信模块闭环:接入环信云IM,完成“注册→凭证→好友→聊天→联系人”全链路集成。通过知识地图梳理五环节逻辑,沉淀双体系映射、凭证下发三铁律等五大可复用套路,回顾12项关键坑(如字段拼写错误、弱密码、双写不一致),明确上线自检清单与技术练习。强调选型权衡——第三方成本低但数据不可控,后续可复用于支付、云存储等第三方集成。

2026-10-31 01:00:00 404

原创 Java 项目实战:交友项目 - 联系人列表

联系人列表接口跨MongoDB与MySQL查询,通过userId等值查好友关系,批量获取用户资料并拼接环信ID(hx+id)返回。关键在于userId字段实际为环信ID,确保前端可直接用于聊天会话,避免客户端硬编码前缀,提升可维护性。

2026-10-31 00:00:00 417

原创 Java 项目实战: 交友项目 - 添加好友

添加好友需双写环信与MongoDB:先调用环信API建立联系人关系,再通过FriendApi.save在MongoDB中双向写入好友记录(userId→friendId与friendId→userId)。设计上以“我的联系人”查询为核心,采用双向存储提升读性能,避免OR查询。实读发现判重字段拼写错误导致幂等失效,建议修复字段名并建立userId+friendId唯一索引,实现数据库层幂等。整体流程为:请求 → Controller解参 → Service编排(先环信后本地)→ Dubbo调用落库,确保关系一

2026-10-30 23:00:00 309

原创 Java 项目实战: 交友项目 - 好友申请的测试验证

本文聚焦IM系统中的联系人管理,明确“一份好友关系,两处使用”的设计原则:社交侧与IM侧共享好友数据。核心流程包括发送好友申请、同意添加及查询列表三步,采用双向存储(friend集合存两条记录)提升查询效率。未读消息数由客户端环信SDK本地维护,服务端不参与统计。接口设计复用/messages/contacts路径,通过方法区分增删查操作,返回含环信ID的联系人信息,支持分页与搜索。数据组装依赖跨存储批量查询,确保展示信息完整。关键在于双写一致性保障,流程上坚持“先环信后数据库”,避免脏数据产生。

2026-10-30 22:00:00 1

原创 Java 项目实战:交友项目 - 好友申请:回复陌生人问题

用户回答陌生人问题后,服务端不落库,而是将回答包装为包含用户信息、原问题和回复内容的JSON消息,通过环信系统以admin身份发送至提问人账号。接口POST /mf/strangerQuestions接收userId与reply,经UserHolder获取当前用户信息,调用Dubbo查昵称与问题原文,组装五字段消息体,最终由HuanXinTemplate.sendMsg以系统消息形式发送。发送失败抛异常,前端需重试;因消息来源为admin,无需好友关系,但回答人身份依赖消息体携带信息。此设计实现一次性的搭讪

2026-10-29 23:45:00 345

原创 Java 项目实战: 交友项目 - 好友申请:查看陌生人问题

在用户详情页点击「聊一下」,首步调用 GET /mf/strangerQuestions?userId= 接口获取对方预设的陌生人问题。数据源自 MySQL tb_question 表,通过 Dubbo 调用 QuestionApi 查询,若无记录则返回默认文案“你喜欢java编程吗?”。该接口仅读取,不产生关系,其结果作为“回复陌生人问题”环节的输入,回答经环信私信送达。链路清晰:客户端 → Controller → Service → Dubbo → MySQL,独立接口设计便于解耦与复用,确保卡片内容

2026-10-29 22:45:00 173

原创 Java 项目实战: 交友项目 - 好友申请之查看佳人详情

本文实现交友项目中“查看佳人详情”功能,通过 Dubbo 调用 MySQL(用户信息)与 MongoDB(推荐缘分值)拼装 TodayBest VO。关键点包括:双远程调用串行执行、null 值兜底(默认缘分值 95)、字段脱敏与类型转换。接口 /mf/{id}/personalInfo 返回精选用户资料,支撑后续好友申请链路,涉及鉴权、超时控制及空指针防护等实战细节。

2026-10-29 21:30:00 363

原创 Java 项目实战:交友项目 - 联系人管理需求分析

本文分析交友项目中联系人管理的核心需求,明确好友关系需双向存储于MongoDB并同步至环信IM系统,实现社交与通信双场景复用。通过/messages/contacts接口完成添加好友(双写)与查询联系人列表,采用客户端本地维护未读消息数,提升实时性。数据模型设计为双向记录以优化查询性能,服务端不参与未读统计,依赖环信SDK本地计算。流程涵盖申请、同意、展示三阶段,强调跨存储组装与接口设计合理性,为后续代码实现奠定基础。

2026-10-29 20:30:00 416

原创 Java 项目实战:交友项目 - 用户体系集成总结

本文为「用户体系集成」系列收官篇,构建了从注册、凭证下发到反查、好友双写的闭环链路,明确“hx+userId”前缀映射规则为核心契约。提炼可复用套路:前缀映射+落库双保险、凭证接口三铁律、双写一致性以对账兜底、分层验证排障路径。总结10大关键坑,强调幂等、鉴权、大小写统一、对账补偿等实战要点,提供上线自检清单与练习建议,助力独立对接第三方用户体系。

2026-10-29 19:30:00 752

原创 Java 项目实战: 交友项目 - 用户体系集成:根据环信id查询用户详情

本文实现交友项目中“环信ID→用户详情”的反向查询链路,解决消息接收端无法获取昵称、头像的问题。通过GET /messages/userinfo?huanxinId接口,基于环信ID在数据库hx_user字段查用户,再关联tb_user_info获取完整信息,完成用户体系集成闭环。方案基于Dubbo服务调用,支持单个查询,已验证可复现,适用于客户端、服务端及回调场景。

2026-10-28 23:30:00 197

原创 Java 项目实战: 交友项目 - 环信后台发送消息测试

集成环信后,最快验证消息链路是否通畅的方法是通过环信 Console 手工发送标准 JSON 格式消息至已注册用户(如 hx106),App 端接收并展示。该方式绕过业务代码,聚焦于「注册→连接→投递」核心链路,可快速定位问题:若收不到,检查注册或登录;若显示异常,核对消息格式与服务端查询接口。配合 curl 脚本实现自动化回归,结合排错表与常见误解澄清,高效完成分层验证,确保整条链路畅通。

2026-10-28 22:30:00 362

原创 Java 项目实战: 交友项目 - 用户体系集成:查询用户环信账号密码

本文详解交友App通过GET /huanxin/user接口获取环信登录凭证的完整链路。在双token体系下,用户项目登录后,App调用该接口,服务端校验JWT并返回环信用户名与密码(如hx1001/123456),实现无感登录。接口设计简洁,响应为HuanXinUserVo,但存在安全风险:密码直返导致永久弱凭证泄露风险。相较之下,服务端换token方案更安全,虽复杂度高,却是生产环境首选。代码链路清晰,依赖Dubbo查库,关键点在于通过拦截器从JWT提取userId,确保鉴权兜底。建议生产环境升级为用户

2026-10-28 21:30:00 534

原创 Java 项目实战: 交友项目 - 用户体系集成:将新用户注册到环信

新用户注册成功后,立即同步创建环信账号。在loginVerification()中,用户落库后生成唯一hxUser(格式:hx+id),调用HuanXinTemplate#createUser()注册,并回写环信凭证至user表。采用注册时同步注册方案,确保聊天链路无空指针风险。失败仅记录日志,不影响主流程。通过Constants定义前缀与初始密码,实现闭环集成。

2026-10-28 20:30:00 363

原创 Java 项目实战: 交友项目 - 环信通信:抽取组件

本文将环信 im-sdk-core 响应式 SDK 封装为 Spring Boot 自动配置组件,延续“四件套”模式(Properties、Template、AutoConfiguration、spring.factories),重点解决响应式 Mono.block() 在同步 MVC 项目中的集成问题。通过 HuanXinTemplate 将异步调用转为同步阻塞,实现用户创建、好友添加、消息发送等核心功能。强调 block() 使用风险边界,避免线程阻塞;并总结环信特有坑点:用户名大小写敏感、appkey

2026-10-28 19:30:00 376

原创 Java 项目实战:交友项目环信云通信全解——体系集成、执行链路与 REST API 实战

项目通过环信REST API实现服务端集成,采用clientId/clientSecret换取app token进行鉴权,token缓存复用避免频繁请求。核心封装为HuanXinTemplate,实现用户创建(自动转小写)、好友关系双写(增删)、系统消息发送(from=admin)。API能力聚焦用户、好友、消息三类,未使用群组与历史消息功能。环信token与项目JWT独立,互不兼容。调用基于im-sdk-core,.block()阻塞式调用保障同步执行,避免异步风险。

2026-10-27 23:30:00 222

原创 Java 项目实战:交友项目即时通信(IM)选型与环信接入

本文剖析交友项目即时通信(IM)的技术挑战,指出其核心难点在于长连接管理、消息可靠性、离线消息、多端同步、海量并发与安全。对比自研(需团队、周期长、成本高)与第三方服务(如环信,快速接入、免运维),结合项目定位为通用功能而非核心差异点,最终选择接入环信云服务,实现高效、可靠的聊天功能,为后续集成铺路。

2026-10-27 21:30:00 448

原创 Java 项目实战: 交友项目 - 即时通信开工

本文完成即时通信(IM)接入,基于环信云服务实现好友聊天功能。复用此前“四件套”封装模式,抽取HuanXinTemplate组件,打通项目用户与环信账号的双体系映射(hx+userId),实现注册双写、凭证下发、好友关系同步。结合已有的“喜欢”互匹配机制,完成好友列表分页查询与消息收发闭环。重点在于第三方选型逻辑与双体系集成设计,非自研长连接,强调快速落地与可维护性。

2026-10-27 20:30:00 177

原创 Java 项目实战: 交友项目 - 圈子互动章总结与自检清单

本文复盘动态查询三视图(好友、推荐、单条)与互动闭环一体化设计:通过movement_time_line、Redis pid列表、movement本体实现多源查询;将点赞/评论/喜欢统一存于comment集合,以commentType区分,结合Redis Hash缓存用户互动状态,实现高效读写。构建了跨存储组装、条件下沉、推模式时间线等五项可复用架构套路,揭示“三合一”防重与索引依赖的隐性成本,强调高频状态缓存与职责分离的工程价值。

2026-10-27 19:30:00 615

原创 Java 项目实战: 交友项目 - 喜欢与取消喜欢

本文详解圈子互动中“喜欢”功能与点赞的同构实现:基于相同流程与数据结构,仅通过 commentType=3 与 LOVE 常量区分。核心在于复用 save/delete/hasComment 公共链路,但易因常量遗漏导致读侧 hasLiked 判错(如误用 MOVEMENT_LIKE_HASHKEY),引发逻辑错误。工程启示表明,三合一设计下新增互动类型成本极低,关键在统一管理常量与严格验证。

2026-10-26 23:30:00 337

原创 Java 项目实战: 交友项目 - 取消点赞

取消点赞操作需同步回退评论明细、动态点赞数及Redis状态,确保三处数据一致。通过完整校验条件(publishId、commentType、userId)避免误删评论记录,优先抛出“用户未点赞”错误以暴露状态异常,保障接口语义清晰。实现中强调删除条件必须包含三字段,防止因漏写导致数据误伤,并验证幂等性与回退结果,确保功能安全可靠。

2026-10-26 22:30:00 693

原创 Java 项目实战: 交友项目 - 动态点赞

点赞功能设计:通过三合一评论表(comment)区分点赞、评论、喜欢,以 publishId + commentType=1 + userId 为唯一键防重。数据写入三处:MongoDB明细(记录行为)、movement计数字段(原子自增,供列表展示)、Redis Hash(判断用户是否已点赞)。接口基于 MovementController,通过Token获取用户信息,返回操作后最新点赞数,实现“一次点击,两处落笔”。代码分层清晰,复用CommentsService与Dubbo服务,兼顾性能与可维护性。

2026-10-26 21:30:00 420

原创 Java 项目实战: 交友项目 - 查询评论列表

动态详情页评论区分页加载依赖 GET /comments 接口,通过 movementId 从 MongoDB 拉取评论并批查用户信息拼装 CommentVo。关键点:ObjectId 类型的 publishId 需手动转换;因评论、点赞、喜欢共用 commentType=2 的三合一集合,查询时必须显式过滤。服务链路涉及 Dubbo 调用与跨存储组装,注意分页从 1 开始,避免 page=0 导致数据跳过。

2026-10-26 20:30:00 414

原创 Java 项目实战: 交友项目 - 发布评论

发布评论需在 comment 集合中创建带内容的记录,并更新对应动态的评论计数。流程包括参数校验、构建评论对象、落库并回填被评论人信息,最后通过 findAndModify 原子操作实现计数 +1。与点赞共用同一接口逻辑,依赖 commentType 区分类型。虽返回值暂未传给前端,但已预留计数返回机制。关键点在于数据一致性、敏感词过滤及动态不存在时仍保存评论的潜在漏洞。

2026-10-26 19:30:00 822

原创 Java 项目实战: 交友项目 - 圈子互动

本文系统阐述社交产品“互动层”的技术设计,聚焦点赞、评论、喜欢三大核心功能。基于数据量大、查询频繁、价值低三大业务特点,采用“MongoDB存明细+Redis缓存状态+动态表冗余计数”方案:MongoDB以文档模型高效存储海量互动记录;Redis Hash缓存用户互动标记,实现O(1)状态判断;动态表冗余计数兼顾性能与容错。通过真实案例揭示细节陷阱(如点赞/喜欢字段混淆),强调高并发下一致性与正确性的平衡,为社交类产品提供可复用的互动架构范式。

2026-10-25 23:30:00 231

原创 Java 项目实战: 交友项目 - 查询单条动态:动态详情页的接口与实现

本文详解动态详情页的数据来源与实现链路:通过 _id(ObjectId)查询单条动态,pid(Long自增)仅用于推荐系统;详情页接口 GET /movements/{id} 返回动态本体及用户信息,评论列表由独立 /comments 接口按 publishId 分页拉取;核心流程为 Controller 接收路径参数 → Service 查询动态与用户 → MovementsVo.init 组装数据 → 评论列表分页查询;强调前端仅使用 _id,避免将 pid 误用于详情查询,澄清双 id 分工边界。

2026-10-25 22:30:00 132

原创 Java 项目实战: 交友项目 - 查询推荐动态

推荐动态数据源自Redis中MOVEMENTS_RECOMMEND_{userId}的pid列表,由推荐系统预先计算写入。查询时先读取该列表,在内存中按页码截取pid子集,再通过pid in查询MongoDB的movement集合获取详情。排序由推荐系统在写入时确定,服务端不参与计算;分页也仅在内存中完成,避免对大数据量进行数据库分页。此设计实现高效、低延迟的推荐展示,与好友动态的“关系驱动”形成鲜明对比。

2026-10-25 21:15:00 384

原创 Java 项目实战: 交友项目 - 查询好友动态

本文详解圈子页“刷好友动态”接口的设计与实现,采用推模式(写扩散):发布时将动态投递至好友时间线表(movement_timeline),查询时仅需按 friendId 分页读取该表,再回查动态详情。相比拉模式的高读成本,此方案在“读多写少”场景下显著提升性能,且复用 getPageResult 方法实现好友与推荐动态共用逻辑,降低扩展成本。但存在写扩散空间开销及边界场景隐患。

2026-10-25 20:15:00 305

原创 Java 项目实战: 交友项目 - 动态查询开工:昨日回顾与今日任务

今日补全圈子“读”链路,复用昨日写链路成果:好友动态通过 friendId 查询时间线表,推荐动态从 Redis 取 pid 列表内存分页并以 $sample 兜底,单条动态直查 movement 表。三接口共用 MovementsVo 组装逻辑,核心依赖异步写入的时间线与推荐系统预计算结果。关键在于“写时多写一份,读时少扫多表”的架构取舍,避免遍历好友查动态,提升查询效率。

2026-10-25 19:30:00 242

原创 Java 项目实战: 交友项目 - 圈子功能实现:总结

本文系统复盘“发一条动态”的存储设计,梳理六条数据链路:发布、异步化、好友时间线、推荐列表、我的动态与互动。核心架构为“MongoDB存真相、时间线表管可见性、Redis管推荐序”,实现写扩散与跨存储组装。提炼五大可复用套路(如推模式、三合一互动),回顾十二个实测坑(如@Async失效、分页越界),提供自检清单与动手练习,为下一章互动功能铺路。

2026-10-25 02:15:00 197

英文字典-a-z-txt形式

英文字典

2024-10-26

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除