云图库和黑马点评的项目学习经验
捷优商超
我这个项目我主要实现了三个点,第一个是博主推送,就是用户进行消息的推送,拱用户进行商品的评价。第二个就是用户的签到。第三个就是优惠券秒杀了。
首先是博主推送,我们获取到前端信息以后直接把消息放到数据库里面,图片的存放地址是本地,因为我还没有进行服务器的部署。但是后续的话可以进行地址的变更。
然后是用户的签到,主要是连续签到的实现。我使用bitmap进行签到的数据选型。因为bitmap只需要4个字节就可以实现一个用户的很久的签到存储,不需要再去把这个用户的各个信息再去单开一个表存进去。签到就使用setbit方法就可以把key和value放进去。连续签到我们先获取该用户的天数,然后我们使用与运算,和1进行与运算获取到最低位,如果是0表示没有签到,1表示签到了,然后我们整体向右移动,在进行循环。
最后返回count即可。
然后是优惠券秒杀,因为是高并发操作,所以我第一个就是要解决高并发问题,齐次解决性能问题,最后解决内存问题。然后高并发我使用redission获取锁,然后使用并发操作解决性能问题,性能问题主要用lua脚本和redis的stream消息队列进行操作。添加到消息队列以后我提前构造好的线程池就开始实现对应操作了。使用postconstruct和init操作实现线程池的创建。我使用的redis的stream消息队列而不是用本地的阻塞队列进行操作就是这个原因,如果阻塞的了话又有请求过来,很有可能出现内存问题。
智汇云图平台
我这个项目主要有三个模块第一个是公共图库,任何人都可以看到审核以后的内容,并且进行下载。第二个是私人图库,私人图库提供ai扩图和以图搜图并且可以不受管理员审核,提供批量编辑,管理和分析功能。
团队图库比起私人图库多了权限的校验以及多人一起操作,还有邀请成员的功能。
首先在我们这个时代的话,如果一个人在本地存储图片啊就会受到内存和设备的限制,在企业的角度来看如果他们使用传统的工具的话可能没有办法进行高效的协作。所以我的这个项目就是为了给用户提供一个功能强大的云图库解决方法,解决他们的难题。
用户模块,图片模块,空间模块,Ai模块,分表模块,缓存模块,协作模块。
用户模块就是登录注册鉴权使用aop嘛,然后使用redis的分布式session登录。
图片模块主要利用腾讯云COS里面的SDK方法进行上传和下载图片。我们还基于数据万象进行图片解析。最终可以对上传的图片进行压缩图和缩略图的设置。
然后就是空间模块,我们分为个人空间和团队空间,个人空间可以上传图片,批量编辑,以图搜图,ai扩图,空间分析。团队空间对了一个satoken的RBAC鉴权和shardingsphere分库分表以及对团员的增加。
satoken我使用他的原因是因为他的社区很活跃并且里面的文档很好,如果遇到问题可以去查找解决方案。然后因为我这个角色只有三个,管理员,浏览和编辑这三个,所以我就不用建表了,直接使用json格式的文件,然后使用注解读取数据进行对象的初始化就可以了。然后因最难的点在权限的获取的实现,因为我分为公共图库谁都可以看,然后还分为个人空间和团队空间,这三个空间都有图片,但是我们实现satoken给我们的那个实现类以后发现参数根本不够,只有一个loginid和logintype,我们只根据loginid获取不到我们想要的东西,因为我们还要空间id才可以进行空间的操作。所以我自定义了一个上下文的方法,直接通过我们的网址比如说picture那么就是picture的id,如果是space的网址那么就是space的id,就这样可以获取到对应的id了。然后获取到各个的id以后我们要进行权限的获取实现了。因为我们主要对空间进行鉴权,所以我们先获取到团队的id,如果找到就可以使用枚举类直接返回对应的权限。找不到就利用图片id进行找,图片找到一样的操作,如果图片找不到就返回图片吃权限,然后是用户id,一样的操作。
然后是分库分表模块,主要用的是shardingsphere,原因因为他是主流的框架,齐次他提供了开箱即用的功能,然后他的帮助文档很好。他的默认配置不太符合我的这个项目所以我采用的是动态分库,使用spaceid加上表名就可以了,最后进行数据库创建表的同时要进行配置的更新。
然后就是ai模块了,获取到apikey以后,进行请求的设置以后直接发送就可以了,然后根据文档进行结果的获取。
协作模块我使用websocket进行长连接,便于多人持续操作。然后还用了逻辑锁解决并发操作问题。
然后还有缓存模块,使用多级缓存解决缓存雪崩问题。
自定义异常处理,第一个如果是业务逻辑我会使用BusinessException返回异常,实现就是基础RunTimeException调用父对象的构造方法就可以了。
然后自定义返回结果,因为我们不能随意返回结果,所以我对应前端写了一个结果类。
Knife4j的话是swagger的增强工具,一般我在controller使用注解@apioperation就可以在doc.html找到这个测试接口了。
因为myabtisplus的id字段使用的是雪花算法,id是long类型,所以返回前端会有精度丢失问题。所以我把long类型转换成string类型。
caffeine是java本地缓存库,运行在本地jvm里面,只能在单台服务器里面使用,比redis快得多。
批量导入图片是bing里面直接进行jsoup的导入,然后以图搜图我用的是百度的地址,首先用f12找到他的接口,然后调用百度的这个接口,就是直接发送请求,获取到的就是我们可以找到图片的地址了。然后使用jsoup进行连接获取,最终找到firsturl元素,然后转移一下就可以找到这个图片的最终网址了。最终网址里面就是一个list列表,返回list列表就可以了。最有难度的点就是得根据f12去看到底要获取什么,先获取data还是url还是什么。然后最终使用门面模式把他封装起来。
批量编辑使用mybatisplus里面的updatebatchbyid 直接批量更新即可。
jdk包括jre再加上一些java的开发工具,jre包括jvm再加上一些核心类,jvm虚拟机