# yupao-frontend **Repository Path**: Rosebleu/yupao-frontend ## Basic Information - **Project Name**: yupao-frontend - **Description**: 伙伴匹配项目旨在实现一个高效、精准的伙伴匹配系统,为用户提供优质的匹配服务。本项目涵盖了从后端开发到缓存设计、分布式锁实现以及数据抓取等多个关键技术点,以确保系统的稳定性和性能。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-11-26 - **Last Updated**: 2025-11-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 伙伴匹配项目 ## 项目概述 伙伴匹配项目旨在实现一个高效、精准的伙伴匹配系统,为用户提供优质的匹配服务。本项目涵盖了从后端开发到缓存设计、分布式锁实现以及数据抓取等多个关键技术点,以确保系统的稳定性和性能。 ## 项目主要内容 ### 1. 匹配算法 在项目开发的后端部分,随机匹配模块采用了多种算法来实现精准匹配: - **编辑距离算法(Levenshtein Distance)**:最小编辑距离是指字符串 1 通过最少多少次增删改字符的操作可以变成字符串 2。详细信息可参考[详解编辑距离算法 - Levenshtein Distance - CSDN 博客](https://blog.csdn.net/dbc_121/article/details/104198838)。 - **余弦相似度算法(带权重计算)**:如果需要带权重计算,比如学什么方向最重要,性别相对次要,可使用余弦相似度算法。相关信息可参考[相似度算法——余弦相似度(附带 Java 现实)_余弦相似度 java - CSDN 博客](https://blog.csdn.net/qq_36488175/article/details/109787805)。 ### 2. Redis 相关 #### 2.1 Redis 数据结构 Redis 在本项目中作为重要的缓存工具,其支持多种数据结构: - **String 字符串类型**:例如 `name:"fantasy"`。 - **List 列表**:如 `names:["fantasy","fantasytasy","fantasy"]`。 - **Set 集合**:`names:["fantasy","fantasytasy"]` (值不能重复)。 - **Hash 哈希**:`nameAge:{ "fantasy":1,"fantasytasy":2 }` (键不能重复)。 - **Zset 集合**:`names:{fantasy - 9,fantasytasy - 2}` (加入一个分数,从小到大排序,适合排行榜)。 此外,还有一些特殊的数据结构,如: - **bloomfilter(布隆过滤器)**:主要从大量的数据中快速过滤值,比如邮件黑名单拦截。 - **geo (计算地理位置)**:用于地理位置的计算。 - **hyperloglog(pv/uv)**:可用于统计页面的 PV(Page View)和 UV(Unique Visitor)。 - **pub/sub(发布订阅)**:类似消息队列,实现消息的发布和订阅。 - **BitMap**:如 `001010101010101010101010101`。 #### 2.2 Redis 安装与配置 - **安装**:在 Windows 环境下,可通过 [Redis - x64 - 5.0.14.1.zip](https://lihuibear.lanzoue.com/iJHjW2d9034h) 进行安装。 - **管理工具**:使用 [quick redis](https://lihuibear.lanzoue.com/iYCri2d91fpg) 进行 Redis 管理,密码为 `3mg8`。 #### 2.3 Spring 项目引入 Redis 相关依赖 在 Spring 项目中,引入 Redis 相关依赖以操作 Redis: ```xml org.springframework.boot spring-boot-starter-data-redis 2.6.2 ``` #### 2.4 设计缓存 Key 不同用户看到的数据不同,因此需要设计合适的缓存 Key,例如: - `systemld:moduleld:func:options`(注意不要和别人冲突) - `yupao:user:recommed:userId` 同时,由于 Redis 内存不能无限增加,需要记得为缓存数据设置过期时间。 ### 3. Redisson 实现分布式锁 #### 3.1 定时任务+锁 - 看门狗机制 Redisson 中提供了续期机制,即看门狗机制: - 开一个监听线程,如果方法还没执行完,就帮你重置 Redis 锁的过期时间。 - 原理: - 监听当前线程,默认过期时间是 30 秒,每 10 秒续期一次(补到 30 秒)。 - 如果线程挂掉(注意 debug 模式也会被它当成服务器宕机),则不会续期。 ### 4. 网页信息抓取 - EasyExcel #### 4.1 两种读对象的方式 - **确定表头**:建立对象,和表头形成映射关系。 - **不确定表头**:每一行数据映射为 `Map`。 #### 4.2 两种读取模式 - **监听器模式**:先创建监听器、在读取文件时绑定监听器。单独抽离处理逻辑,代码清晰易于维护;一条一条处理,适用于数据量大的场景。 - **同步读模式**:无需创建监听器,一次性获取完整数据。方便简单,但是数据量大时会有等待时长,也可能内存溢出。 ## 项目使用 1. 克隆本项目到本地。 2. 按照 Redis 安装与配置部分的说明,安装并配置好 Redis。 3. 在 Spring 项目中引入 Redis 相关依赖。 4. 根据需要,实现相应的匹配算法、分布式锁以及网页信息抓取功能。 ## 注意事项 - Redis 内存管理:由于 Redis 内存不能无限增加,在使用 Redis 作为缓存时,务必为缓存数据设置合理的过期时间,以避免内存溢出。 - 分布式锁:在使用 Redisson 实现分布式锁时,注意 debug 模式可能会被看门狗机制当成服务器宕机,从而导致锁不会续期。