<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Wang的专栏]]></title><description><![CDATA[Email : johnnynode@gmail.com | Github : github.com/rwxbot]]></description><link>https://blog.youkuaiyun.com/Tyro_java</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Tyro_java]]></copyright><item><title><![CDATA[Java 项目实战：交友项目 - 查询视频列表]]></title><link>https://blog.youkuaiyun.com/Tyro_java/article/details/170289801</link><guid>https://blog.youkuaiyun.com/Tyro_java/article/details/170289801</guid><author>Tyro_java</author><pubDate>Sun, 08 Nov 2026 21:30:00 +0800</pubDate><description><![CDATA[小视频列表接口采用“推荐优先、时间兜底”策略：优先从Redis获取用户推荐视频ID串，按页码截取后批量查询MongoDB；若无推荐或已翻完，则按created倒序分页查询全量视频。通过page - redisPages实现页码无缝衔接，确保推荐与兜底区连续。接口返回带作者信息的VideoVo，关注/点赞状态暂置0，后续填充。整体设计兼顾性能与体验，实现高效信息流加载。]]></description><category></category></item><item><title><![CDATA[Java 项目实战: 交友项目 - 发布视频的代码实现]]></title><link>https://blog.youkuaiyun.com/Tyro_java/article/details/170289713</link><guid>https://blog.youkuaiyun.com/Tyro_java/article/details/170289713</guid><author>Tyro_java</author><pubDate>Sun, 08 Nov 2026 20:30:00 +0800</pubDate><description><![CDATA[发布小视频接口需同步处理封面（OSS）与视频（FastDFS）上传，并落库至MongoDB。核心链路为：接收MultipartFile → 校验 → 分别上传至OSS/FastDFS → 构造Video对象 → Dubbo调用save接口写入数据库。关键点包括：配置spring.servlet.multipart.max-file-size=30MB避免1MB默认限制；确保vid与_id双主键设计提升查询效率；落库后必须校验返回的videoId非空，否则用户将面临“视频发不出去”的死链问题。]]></description><category></category></item><item><title><![CDATA[Java 项目实战：交友项目 - 发布视频：接口文档和代码步骤分析]]></title><link>https://blog.youkuaiyun.com/Tyro_java/article/details/170289685</link><guid>https://blog.youkuaiyun.com/Tyro_java/article/details/170289685</guid><author>Tyro_java</author><pubDate>Sun, 08 Nov 2026 19:30:00 +0800</pubDate><description><![CDATA[本文详解小视频发布接口的六步执行链路：①接收双文件参数；②视频上传FastDFS（耗时最长）；③封面上传OSS；④组装Video对象；⑤Dubbo调用落库MongoDB；⑥返回200。对比发布动态，该接口为多类型文件上传（视频+封面），采用分存储策略——大视频走自建FastDFS，小封面走OSS，兼顾成本与性能。接口使用multipart/form-data，依赖参数名精确绑定，强调客户端命名规范。流程中各环节失败后果各异，需注意异常处理与资源清理，尤其避免孤儿文件残留。]]></description><category></category></item><item><title><![CDATA[Java 项目实战: 交友项目 - 视频功能：业务概述]]></title><link>https://blog.youkuaiyun.com/Tyro_java/article/details/170289661</link><guid>https://blog.youkuaiyun.com/Tyro_java/article/details/170289661</guid><author>Tyro_java</author><pubDate>Sun, 08 Nov 2026 18:30:00 +0800</pubDate><description><![CDATA[小视频模块作为交友App中类抖音的沉浸式内容消费入口，区别于圈子动态的熟人社交，聚焦陌生人间的流量传播。其核心架构基于分层存储：视频文件存于自建FastDFS，封面图用OSS，元数据则由MongoDB管理。通过推荐系统优先提供视频列表，不足时补查数据库，实现高效分页。关键设计包括：vid数字唯一标识用于推荐权重计算，点赞/关注等互动数据冗余在Video实体中提升读取性能，且关注行为直接影响推荐算法。整体数据流清晰，为后续缓存优化与发布实现奠定基础。]]></description><category></category></item><item><title><![CDATA[Java 项目实战: 交友项目 - FastDFS：入门案例]]></title><link>https://blog.youkuaiyun.com/Tyro_java/article/details/170289608</link><guid>https://blog.youkuaiyun.com/Tyro_java/article/details/170289608</guid><author>Tyro_java</author><pubDate>Sun, 08 Nov 2026 14:01:19 +0800</pubDate><description><![CDATA[本文详解Java项目接入FastDFS的三步流程：引入fastdfs-client依赖，配置application.yml中的Tracker地址与Web服务器路径，注入FastFileStorageClient后调用uploadFile上传文件。核心代码仅一行，返回StorePath，通过getFullPath()生成完整路径，可用于存库、拼URL访问或删除。附常见坑点与误解澄清，确保快速落地。]]></description><category></category></item><item><title><![CDATA[Java 项目实战：交友项目 - FastDFS 工作原理]]></title><link>https://blog.youkuaiyun.com/Tyro_java/article/details/169846605</link><guid>https://blog.youkuaiyun.com/Tyro_java/article/details/169846605</guid><author>Tyro_java</author><pubDate>Tue, 03 Nov 2026 01:30:00 +0800</pubDate><description><![CDATA[FastDFS 通过 Tracker 调度与 Storage 组内异步同步实现高可用文件存储。上传时，客户端经 Tracker 获取目标 Storage 地址，直接上传并获 file_id；文件在同组间异步复制，存在短暂同步延迟窗口，导致“刚传完查不到”，可通过读写粘性、Nginx 重试或业务容忍解决。Tracker 集群靠冗余而非通信保证高可用，按剩余空间或轮询选节点。扩容需加新组（真正扩容量），同组加机器仅提升冗余。文件不可变，更新须删传新文件，file_id 不变。支持 appender 实现断点续传]]></description><category></category></item><item><title><![CDATA[Java 项目实战：交友项目 - FastDFS 引入与内部结构]]></title><link>https://blog.youkuaiyun.com/Tyro_java/article/details/169846374</link><guid>https://blog.youkuaiyun.com/Tyro_java/article/details/169846374</guid><author>Tyro_java</author><pubDate>Tue, 03 Nov 2026 00:30:00 +0800</pubDate><description><![CDATA[项目因小视频文件大、流量集中，OSS按量计费成本过高，故选择自建FastDFS。FastDFS为纯C实现的轻量级分布式文件系统，支持整文件存储与组内冗余，通过Tracker调度、Storage分组存储，实现高性价比海量文件管理。上传时由Tracker分配Storage并返回file_id（含组名、路径等），下载时根据file_id反查存储位置。相比OSS，FastDFS在视频场景下显著降低存储成本，且支持灵活扩容。]]></description><category></category></item><item><title><![CDATA[Java 项目实战：交友项目 - 首页谁看过我]]></title><link>https://blog.youkuaiyun.com/Tyro_java/article/details/169846184</link><guid>https://blog.youkuaiyun.com/Tyro_java/article/details/169846184</guid><author>Tyro_java</author><pubDate>Mon, 02 Nov 2026 23:30:00 +0800</pubDate><description><![CDATA[首页「谁看过我」通过Redis记录用户上次查看时间，实现增量查询：仅推送新访客，保持卡片动态更新。数据源自MongoDB的visitors集合，按来访时间倒序取最新5条，排序基于毫秒级时间戳，不依赖缘分值。接口独立于今日最佳，调用链路涵盖Controller、Service、Dubbo层及缓存读写。关键点在于补全“写回”游标逻辑，确保下次查询准确增量。]]></description><category></category></item><item><title><![CDATA[Java 项目实战：交友项目 - 保存访客记录]]></title><link>https://blog.youkuaiyun.com/Tyro_java/article/details/169846054</link><guid>https://blog.youkuaiyun.com/Tyro_java/article/details/169846054</guid><author>Tyro_java</author><pubDate>Mon, 02 Nov 2026 22:45:00 +0800</pubDate><description><![CDATA[在用户详情接口中同步记录访客数据，通过mfController.personalInfo触发，构建Visitors实体并调用Dubbo接口保存。核心逻辑包括：以userId为被访者、visitorUserId为当前登录人，使用date（毫秒时间戳）和visitDate（yyyyMMdd格式）实现按天去重；缘分值score从推荐表冗余获取，提升查询效率。采用同步写入，教学阶段链路清晰，生产环境建议异步化处理。]]></description><category></category></item><item><title><![CDATA[Java 项目实战：交友项目 - 我的访客：需求说明]]></title><link>https://blog.youkuaiyun.com/Tyro_java/article/details/169845923</link><guid>https://blog.youkuaiyun.com/Tyro_java/article/details/169845923</guid><author>Tyro_java</author><pubDate>Mon, 02 Nov 2026 21:45:00 +0800</pubDate><description><![CDATA[本文详解交友项目“我的访客”功能的数据设计与实现：基于MongoDB的visitors集合，记录用户被查看行为。通过userId、visitorUserId与visitDate组合去重，确保一天内仅记录一次；date字段用于排序与增量查询，score为推荐系统快照值，提升列表查询效率。访客记录在查看详情页时同步写入，无需额外接口，兼顾准确性与性能。]]></description><category></category></item><item><title><![CDATA[Java 项目实战: 交友项目 - 小视频模块实战：访客记录、FastDFS 存储与 SpringCache 缓存]]></title><link>https://blog.youkuaiyun.com/Tyro_java/article/details/169745744</link><guid>https://blog.youkuaiyun.com/Tyro_java/article/details/169745744</guid><author>Tyro_java</author><pubDate>Mon, 02 Nov 2026 00:30:00 +0800</pubDate><description><![CDATA[本文实现小视频模块核心功能：基于MongoDB记录“谁看过我”访客数据，使用FastDFS分布式文件系统存储视频与缩略图，通过Dubbo服务完成发布与列表接口。结合Spring Cache注解（@Cacheable/@CacheEvict）对视频列表缓存30秒，发布后自动清空缓存，提升性能并保证数据实时性。工程新增视频、访客实体及缓存配置，三条技术线（MongoDB、FastDFS、Redis）协同支撑完整链路。]]></description><category></category></item><item><title><![CDATA[Java 项目实战: 交友项目 - 附近的人与快配：LBS 与配对功能全流程复盘]]></title><link>https://blog.youkuaiyun.com/Tyro_java/article/details/169745561</link><guid>https://blog.youkuaiyun.com/Tyro_java/article/details/169745561</guid><author>Tyro_java</author><pubDate>Sun, 01 Nov 2026 23:30:00 +0800</pubDate><description><![CDATA[本文系统梳理社交产品两大核心能力：LBS（地理围圈）与快配（双向匹配）。通过「地理位置上报→2dsphere索引查询→项目卡片处理→Redis双Set判存→好友双写」完整链路，沉淀五项可复用技术套路（如地理空间四件套、双向状态缓存等），并给出12个关键坑点与上线前检查清单。实践任务聚焦修复Long ==比较、升级$geoNear排序分页，确保功能稳定可用。]]></description><category></category></item><item><title><![CDATA[Java 项目实战: 交友项目 - MongoDB 地理位置实战：搜附近的人（withinSphere 圆球查询与 $geoNear 聚合）]]></title><link>https://blog.youkuaiyun.com/Tyro_java/article/details/169745533</link><guid>https://blog.youkuaiyun.com/Tyro_java/article/details/169745533</guid><author>Tyro_java</author><pubDate>Sun, 01 Nov 2026 22:15:00 +0800</pubDate><description><![CDATA[本文详解基于MongoDB的“搜附近”功能实现，核心为withinSphere圆球查询。通过用户当前坐标（user_location集合）作为圆心，结合前端传入的米制半径，经单位换算（米→公里→弧度）后构建Circle，利用2dsphere索引高效查询覆盖范围内的用户。需注意：接口返回null而非空集以区分未上报位置与无结果；查询默认包含自身，排序与分页需在上层处理，避免因withinSphere不支持距离排序导致结果失序。]]></description><category></category></item><item><title><![CDATA[MongoDB 地理位置上报实战：从接口设计到覆盖写入的完整实现]]></title><link>https://blog.youkuaiyun.com/Tyro_java/article/details/169738975</link><guid>https://blog.youkuaiyun.com/Tyro_java/article/details/169738975</guid><author>Tyro_java</author><pubDate>Sun, 01 Nov 2026 20:30:00 +0800</pubDate><description><![CDATA[本文详解「附近的人」功能中位置上报与存储设计：基于用户移动距离（>500米）或定时（5分钟）触发上报，避免频繁耗电与隐私风险。采用独立 user_location 集合，每用户仅保留最新位置，使用 GeoJsonPoint + 2dsphere 索引保障查询效率。因 Dubbo 序列化限制，接口传参为 Double longitude, latitude，由服务端封装为 GeoJsonPoint。结合 MongoDB 索引优化与数据语义分离，实现高效、低耗、可维护的位置服务。]]></description><category></category></item><item><title><![CDATA[Java 项目实战: 交友项目 - 搜索附近的功能概述和分析]]></title><link>https://blog.youkuaiyun.com/Tyro_java/article/details/169738754</link><guid>https://blog.youkuaiyun.com/Tyro_java/article/details/169738754</guid><author>Tyro_java</author><pubDate>Sun, 01 Nov 2026 19:30:00 +0800</pubDate><description><![CDATA[「搜附近」功能基于地理位置精准匹配，通过客户端定时上报坐标，MongoDB 以 2dsphere 索引存储 GeoJsonPoint，实现高效范围检索。查询时以用户为中心画圆圈人，按距离排序返回结果，需注意坐标顺序（经度在前）、单位换算（米转千米）、排序与分页缺失等关键细节。数据链路清晰：上报→存储→检索，核心依赖地理索引与正确参数处理，是唯一强依赖位置的功能，结果完全由坐标决定，与推荐无关。]]></description><category></category></item><item><title><![CDATA[Java 项目实战：交友项目 - MongoDB 地理位置]]></title><link>https://blog.youkuaiyun.com/Tyro_java/article/details/169650800</link><guid>https://blog.youkuaiyun.com/Tyro_java/article/details/169650800</guid><author>Tyro_java</author><pubDate>Sun, 01 Nov 2026 01:30:00 +0800</pubDate><description><![CDATA[本文详解「搜附近的人」的 LBS 核心实现，聚焦 MongoDB 地理空间查询。通过 2dsphere 索引（而非 2d）结合 GeoJSON Point 结构（坐标顺序为 [经度, 纬度]），实现高效距离检索。推荐使用 $near 实现按距离排序的“附近人”列表，避免全表遍历性能瓶颈，确保真实地球曲率下的精准定位。]]></description><category></category></item><item><title><![CDATA[# Java 项目实战: 交友项目 - 左滑不喜欢：无配对检查的推荐排除]]></title><link>https://blog.youkuaiyun.com/Tyro_java/article/details/169650783</link><guid>https://blog.youkuaiyun.com/Tyro_java/article/details/169650783</guid><author>Tyro_java</author><pubDate>Sun, 01 Nov 2026 00:30:00 +0800</pubDate><description><![CDATA[左滑“不喜欢”与右滑“喜欢”在产品语义上不对称：右滑触发配对，左滑仅反馈排除信号。代码实现上，notLikeUser 与 likeUser 镜像操作，但左滑不进行配对检查，因推荐列表已通过 NIN 排除所有表态用户。关键在于，user_like 表中无论喜欢或不喜欢，均被用于持久排除，左滑后用户永久不再出现于推荐列表，反悔只需再次滑动翻转态度，零成本更新。]]></description><category></category></item><item><title><![CDATA[Java 项目实战: 交友项目 - 交友喜欢]]></title><link>https://blog.youkuaiyun.com/Tyro_java/article/details/169650745</link><guid>https://blog.youkuaiyun.com/Tyro_java/article/details/169650745</guid><author>Tyro_java</author><pubDate>Sat, 31 Oct 2026 23:30:00 +0800</pubDate><description><![CDATA[本文详解用户滑动卡片后“右滑喜欢”的完整链路：先在MongoDB的user_like集合中保存或更新记录，同步更新Redis的USER_LIKE_SET与USER_NOT_LIKE_SET两个Set，确保推荐列表实时排除已划过用户；若对方也喜欢自己，则触发双向好友关系创建，联动交友系统与环信IM。核心逻辑为“先保存、再判断、后加好友”，兼顾数据一致性与性能，实现高效配对闭环。]]></description><category></category></item><item><title><![CDATA[Java 项目实战：交友项目 - 交友左滑右滑]]></title><link>https://blog.youkuaiyun.com/Tyro_java/article/details/169650732</link><guid>https://blog.youkuaiyun.com/Tyro_java/article/details/169650732</guid><author>Tyro_java</author><pubDate>Sat, 31 Oct 2026 22:30:00 +0800</pubDate><description><![CDATA[项目实现滑动交互（右滑喜欢/左滑不喜欢）的完整链路：通过统一 user_like 集合记录用户态度，isLike 字段动态标识偏好，支持“保存或更新”语义；结合 Redis 双 Set 实现高效判存与排除已划用户；滑动后同步更新数据库与缓存，并在双向喜欢时自动加好友，反之则解除关系。整体遵循“先保存、再判断、后加好友”原则，确保数据一致性与业务逻辑闭环。]]></description><category></category></item><item><title><![CDATA[Java 项目实战: 交友项目 - 项目：需求分析与滑动数据设计]]></title><link>https://blog.youkuaiyun.com/Tyro_java/article/details/169650717</link><guid>https://blog.youkuaiyun.com/Tyro_java/article/details/169650717</guid><author>Tyro_java</author><pubDate>Sat, 31 Oct 2026 18:14:22 +0800</pubDate><description><![CDATA[「Tinder式快配」通过卡片滑动实现低门槛交友，核心在于高效的数据设计：利用Redis Set存储用户喜欢/不感兴趣记录，实现O(1)写入与判存，天然去重且支持交集运算。双写机制保障数据持久化，推荐时排除已滑用户，双向右滑触发自动配对。接口简洁，交互流畅，兼顾性能与可扩展性。]]></description><category></category></item></channel></rss>