伙伴匹配系统收获

伙伴匹配系统收获

伙伴匹配系统前前后后花了40+小时,最后完成了这个基于Vue、Vant、Vite 以及SpringBoot的移动端 项目,有了用户中心的 基础架构,这个系统主要围绕功能如用户组队匹配以及性能优化进行开发,由于是轻量前端框架,开发上手较为容易。

后端

本次项目 的 Swagger + Knife4j 接口文档的 引入 极大的提高了之前前后端联调的效率,可以自动根据Controller上的handler 方法的参数 生成对应的 前端数据格式。这个在日常开发还是很常用的.

在登录优化时引入了分布式Session, 以前的登录的Session 我们 是直接存在一台机器的服务上,但单个SpringBoot session 应用只能应用本服务。如果我们将项目拆分成微服务 或 集群部署,Session的状态就无法共享,引入spring-session-data-redis 就能够轻松的将Session 信息在redis维护,实现了分布式Session。

Redis 基于内存的 nosql 数据库 的引入让我体验到其性能的强大,除了这种分布式Session的应用,它还能广泛的应用于数据缓存,在此系统的用户表我插入了大量的模拟用户,导致查询性能大大下降,后端响应到前端的时间大概要花10来秒。这样一来用户的体验感会大大下降。利用redis 的 基于内存的存储 成功的将 第二次访问的 速度降低到了毫秒级别。

好像计算机的世界里 无论遇到什么问题加一层 缓存总能解决问题。然而引入 一个新的东西总会带来新的问题。从业务层面来说就是 我们需要维护 数据库和缓存的数据一致,但既然存在缓存我们就不可避免 两者的数据 会出现不一致,要做的就是将这种情况带来损失降低,比如设置合适的过期时间,既能带给用户良好的体验也不至于数据长时间不更新。其次就是就是只对变化不明显的数据使用缓存,这样用户感知体验会很少。从性能层面来说就是redis利用了内存,我们不能长时间占有,所以缓存的数据量一定要合适,而且一定要设置过期时间,一旦内存爆了,不然不但提升不了性能还会降低性能,同时redis 自我淘汰机制还会将重要数据淘汰掉。

还有一个细节就是使用了缓存可是我们每次第一次访问还是比较慢,这里想要第一次也读的是缓存数据就需要缓存预热,缓存预热可以是定时任务也可以是触发某个事件。然后这里引出了基于Redisson的分布式锁(感觉这里有点为了用这个技术而用了🙄) 解决分布式环境下多个应用服务只想执行一次 缓存预热的定时任务。有点类似线程里的lock锁,设置然后抢锁然后执行预热然后释放锁.多线程和分布式其实就好像一个微观下一个宏观下的竞争对手,都是为了抢夺资源,只不过前者是为了抢夺计算机资源,后者是为了提供用户的服务的资源。这里Redisson的Rlock还实现了看门狗机制,就是如果一个服务抢到锁后 在执行分布式锁住的内容时 如果过了设置最大时间还没完就会自动续期一段时间。

这个项目运用到的Redis 客户端有spring-boot-starter-data-redis、Redisson 后者比较高级支持线程安全同步。Rlock就是里面的。前者是SpringBoot推荐的。而且默认使用了jdk的序列化方法,就是最后到redis里都是一堆乱码其实是序列化号的,我们可以定制其的序列化方式增强可读性或者效率,只需要定制化配置redisTemplate的bean。

然后值得一提的就是数据库表的建立以前都是一堆数据放在一张表,查起来确实爽但是极大的浪费了性能,大量的数据冗余。维护一张关系表虽然操作起来麻烦但还是能减少IO,记得使用事物注解就行了。这次开发又熟悉了下mybatis plus。它确实强大。记得自己写的sql语句没有自动添加逻辑删除的条件。

最最最大收获就是这次的业务逻辑了,这次真的是经历了业务的完整流程,首先一定要想好需求分析再想好怎么实现,整个项目最多的地方就是在鉴权,因为队伍的创建者以及队伍的状态是有区别的。我们需要层层的判断是否有权限进行操作不然就会出现问题,有些鉴权可以直接判断,而有一些鉴权需要查数据库比如一个人最多加入5个队伍,我们要尽量让那些不要查数据库的鉴权在前面检查以减少数据库的访问。在开发过程尽量不要直接传递数据库的查询对象,多封装dto,vo来隔离原始数据,保证数据安全和数据格式统一。必要的时候对于相同的也逻辑要整体抽离。

算法这一块用的是dp实现的最小编辑距离方法,感觉这个算法还是有局限性的,可以实现更好的匹配或者推荐算法,后续有机会我再试一试。

前端

前端这次用的3V三剑客,总体来说比较轻量,这次基本学会了其使用方法,这次🐟带我们实现了之前用户中心他们实现的一些功能,比如如和自己封装axios 全局拦截器,比如自己实现用户缓存,比如vue router跳转等等,了解到了Vue开发项目的结构,比如设置模板设置组件设置路由页面,其实这个项目就是一个单页面项目,Vue-router确实方便。总体上Vue3和React还是很像的,甚至更简单,v-if,v-for太好用了,ref响应式变量也很好好用,就是要注意Vue的生命周期,这些在后面再后面细细学习把

写在最后

这个项目还可以构建小程序等等,由于赶着总结项目找实习先不弄了,这次项目后端知识点很零碎但还是不算太难,然后就是lambda表达式操作集合类是真的很爽!!!!


伙伴匹配系统收获
https://yilinyo.github.io/2023/02/05/伙伴匹配系统收获/
作者
yilin
发布于
2023年2月5日
许可协议