华中农业大学(211) | 数据科学与大数据技术 | 2023.09 – 至今
高仿 QQ 的 Web 即时通讯系统(独立开发) | 2025.07 – 至今
技术栈:Spring Boot, WebSocket, JWT, Redis, RabbitMQ, MySQL, Redisson
项目描述:
独立设计并实现一个支持高并发、可扩展的即时通讯系统。该项目核心攻克了集群环境下的消息实时推送、海量消息的可靠存储与高效查询以及高并发业务场景下的数据一致性三大技术挑战,综合运用了WebSocket、消息队列、分布式锁等关键技术。
核心职责与成果:
分布式实时通信与安全认证
消息可靠投递与存储性能优化
高并发业务实践:群聊红包系统
项目总结:
本项目以解决实际技术问题为导向,深入应用了消息队列、缓存、分布式锁等中间件。通过实践,不仅掌握了这些技术的核心用法,更深刻理解了它们在系统解耦、流量削峰、保证数据强一致性等场景下的价值,形成了从架构设计到编码落地的完整闭环能力。
单节点的redis并发能力有限,因此我们需要搭建主从集群,实现读写分离。一般是主节点进行写,从节点进行读。
主从同步:
高可用:
哨兵模式(sentinel):
脑裂:
redis实现的分布式锁:
因此我们使用第三方工具redisson:
双Token机制:
验证策略:
用户登录成功 → 生成双Token → AccessToken返回前端存入localStorage → RefreshToken存入MySQL并设置HttpOnly Cookie。
前端携带AccessToken → 后端解析JWT(验证签名和过期)→ 查询Redis黑名单 → 不在黑名单则放行 → 处理业务返回结果。
前端收到401 → 调用刷新接口(Cookie自动携带RefreshToken)→ 后端从MySQL查询RefreshToken进行匹配验证 → 验证通过则:
重要:RefreshToken验证只查MySQL,不查Redis黑名单。
用户登出 → 当前AccessToken加入Redis黑名单 → 删除MySQL中的RefreshToken记录 → 清除HttpOnly Cookie。
密码修改等安全事件 → 删除MySQL中的RefreshToken记录 → 强制重新登录。
只存储被吊销的AccessToken,键格式:blacklist:access_token:{token_hash},TTL 15分钟(与AccessToken有效期一致)。
user_tokens表存储有效的RefreshToken,每个用户一条记录(user_id唯一约束),验证时只查询此表。
默认所有AccessToken都有效,除非在Redis黑名单中。验证顺序:1.JWT解析 → 2.查Redis黑名单。
默认所有RefreshToken都无效,除非在MySQL白名单中且匹配。验证时只查MySQL,不查Redis。
核心要点:RefreshToken验证只查MySQL白名单,不查Redis黑名单;安全事件通过删除MySQL记录使RefreshToken失效。