# JBoss **Repository Path**: YHVisionxiaoy/jboss ## Basic Information - **Project Name**: JBoss - **Description**: 项目基于SpringBoot+Redis+MySQL+Elasticsearch+AI+Next.js服务端渲染的一款智能的求职刷题平台,你可以浏览招聘的公司的相关信息(招聘相关信息,热度,推荐指数)可以上传自己的简历提供给AI(圆圆),它可以智能的帮你生成与你要面试的这家公司以及与你简历相匹配的面试题。并提供题解和学习的建议,可以提高你的面试通过率😀🎇 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 4 - **Forks**: 1 - **Created**: 2024-12-23 - **Last Updated**: 2025-08-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # JBoss #### 介绍 项目基于SpringBoot+Redis+MySQL+Elasticsearch+AI+Next.js服务端渲染的一款智能的求职刷题平台,你可以浏览招聘的公司的相关信息(招聘相关信息,热度,推荐指数)可以上传自己的简历提供给AI(圆圆),它可以智能的帮你生成与你要面试的这家公司以及与你简历相匹配的面试题。并提供题解和学习的建议,可以提高你的面试通过率😀🎇 #### 项目整体业务流程 ![业务流程图](https://foruda.gitee.com/images/1734943777296740641/91936a4e_15293537.png "屏幕截图") #### 软件架构 软件架构说明 ![架构图](src/%E6%9E%B6%E6%9E%84%E5%9B%BE.png) #### 用户拓展功能 刷题签到记录: 设计思路 ●用户浏览题目详情触发签到/用户主动签到 ●用户查询当年签到记录 1.用户签到: ●基础方案:数据库建表存储签到当天日期 从存储方面看,现有用户数为100万,更具数据库存储字段计算:1个用户签到366天,100W个用户就是:总存储大小 = 总行数 × 单行大小 = 366000000 × 58 字节 = 21228000000 字节 = 21.23 GB ●考虑到系统的分布式,可以采用Redis的Set来存储,redis key 设计为考虑到系统多出使用redis,将redis的key统一设计为 ``` key=模块:业务:>>> vaule=[] ``` 采用Redis的Bitmap数据类型来存储,为什么要采用位图来存储? 1)从存储上:在java中要用int类型来存储签到状态,占4字节,1字节=8bit;那么它就占32bit ``` 假设:第一天签到 int存储:00000000 00000000 00000000 00000001 Bitmap存储:1 ``` 很明显,它的占用空间优化到了原来的32倍! ``` 现有用户数为100万:1个用户签到366天,366/8=46字节,100W个用户就是:46MB 相较于数据库存储直接节约了462倍的存储空间!! ``` ![输入图片说明](image.png) 2)从场景上:签到本来就是只记录0,1状态,适用于这种场景 3) 从性能上:采用redis缓存,将用户签到记录过期时间设置为366天,用户查询直接走缓存,提高了查询性能 java程序中Redisson提供了现成的RBitset来实现,开发成本也大大降低。 创建一个Redisson客户端,将键值对进行组合,其中动态的获取当年的年份和用户id:key=user:signins:{year}:{userId};通过signinRedissonClient.getBitSet(key)来获取key,然后通过getDayOfYear()获取当前日期是一年中的第几天作为偏移量,最后检查当天是否签到,如果签到通过set()将偏移量设置为true即可。 2.查询用户签到记录 获取当年的总天数,遍历365天查询用户签到记录 ``` for (int dayOfYear = 1; dayOfYear <= totalDays; dayOfYear++) { LocalDate currentDate = LocalDate.ofYearDay(year, dayOfYear); boolean hasRecord = signInBitSet.get(dayOfYear); signInStatus.put(currentDate, hasRecord); } ```