网盘项目话术(0.5w字精选)

功能结构图

数据库设计总结

该项目主要就是对文件的操作,file表,file_share表。

file表主要字段:id,用户id,父级目录id,文件的地址,文件的封面图片地址,创建和修改时间。

file_share表主要字段:id,文件id,用户id,有效类型,创建和失效时间(用于定时任务)。

基于RDAB的五张表:用户信息表,角色表,权限表,用户角色关联表(多对多关系),角色权限关联表(多对多关系)。

基础设置表:id,邮箱标题,邮箱内容前缀,默认初始化空间大小。

登录模块总结

单点登录->双token三认证(迭代方案)

版本1.0时我们采用单点登录的方式做校验的,其问题就是我们无法控制token的有效时间。并且token是存放在session中。

在版本2.0中我们使用双token三认证模型,主要就是基于长短token来实现的。长短token存放在cookie中。

在用户登录完成之后,就会通过JWT及我们配置的私钥来生成对应的长短token,并且会将加密后的长token作为key,value为1存储到redis中,请求会携带这两个token。短token用来校验,长token用来生成新的长短token。

 在执行业务的时候就会去判断短token是否有效,通过公钥进行验证。此时就是第一次验证。

当发现短token无效,就会去判断长token是否有效,也是通过公钥进行验证的。此时就会第二次验证。

如果长token有效,就会去redis中查询长token是否存在,此时就是第三次验证。

通过三次验证后,就会去刷新token生成新的长短token。

权限隔离(迭代方案)

权限隔离,项目中主要分为普通用户和管理员,刚开始使用特殊字段作为权限标识,权限扩展起来就非常的麻烦,涉及修改表字段。因此就使用RDAB模型来实现权限隔离,可扩展性高。主要分为用户表,角色表,权限表,用户关联角色表(多对多的关系),角色关联权限表(多对多的关系),并配合springSecurity实现的。

文件列表总结

文件查询 

文件列表为用户操作的主要模块,特别是在查询接口上存在高并发的场景,因此通过做缓存来优化查询接口,及使用布隆过滤器解决缓存穿透的问题。

缓存优化:通过springCache来实现缓存的,保证双写一致性。(主要就是使用@Cacheable,@CachePut,@CacheEvit实现的)

解决缓存穿透问题:通过使用redisson创建布隆过滤器,在数据做插入时也在布隆过滤器进行中标记,在进行查询的时候先到布隆布隆过滤器中做判断,防止缓存穿透的安全问题。

其实只要是对应暴露的如何数据库的curd方法都存在缓存穿透的问题。

文件转移

通过递归的形式来生成一个树形结构,选择对应的文件作为其新的父文件。当然在树形结构中只有文件夹类型的文件。

文件上传

在上传文件使用ffmpeg会分段生多个文件,并配合redis记录文件的总大小,保证文件的大小不会超过用户的总空间。此时会生成多个临时文件,在最终合并的时候使用io的形式将临时文件的数据全部存储到目标文件中(并完成对目标文件的记录),最终完成文件的分段上传。

优点就是在网络不佳时,可以只上传失败的数据即可。在分段完成之后会通过IO流的形式在服务器对应的地址上生成目标文件。

文件的分享模块

分享链接验证码校验

分享链接是会生成指定或随机的6为验证码,我们可以自定义该验证码的有效时间,将文件id作为key,加密(MD5)后的验证码作为value,并设置对应的ttl。校验时直接将输入的验证码加密后到redis中去匹配校验。

用户支持时获取的邮箱验证码也是基于此方法实现的。

分享残留数据清除

此时数据库会有分享记录残留的问题。我们就会使用xxl-job做定时任务来清除残留的分享记录。

通过在xxl-job中创建执行器和对应的定时任务,此时分享残留数据清除每隔4小时执行一次,设置定时任务的时间。采用默认的轮询路由策略。定时的调用查询过期的发现链接并删除。

配置对应的xxl-job参数

# xxl-job executor配置
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin
xxl.job.executor.appname=my-executor-app
xxl.job.executor.ip=
xxl.job.executor.port=9999
xxl.job.accessToken=
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
xxl.job.executor.logretentiondays=30

创建JobHander指定其名字

import com.xxl.job.core.handler.annotation.XxlJob;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;@Component
public class MyJobHandler {private static final Logger logger = LoggerFactory.getLogger(MyJobHandler.class);@XxlJob("myJobHandler")public void execute() throws Exception {// 任务逻辑logger.info("XXL-Job, Hello World.");// 调用清除过期分享链接的方法}
}

在xxl-job的可视化界面中创建执行器和对应的任务并提供CORN设置定时时间,实现循环定时任务。
 

文件回收模块总结

文件会在一周(7天)后被主动清除,在刚开始制定解决方案的时候,考虑使用线程睡眠来实现延迟任务。缺点很明显,当任务量大时就会大量占用CPU使用权,效率非常低下。

优化方案:使用RabbitMq的延迟队列,通过自定义消息的ttl来实现延迟回收的效果,因为是异步的执行任务,所以在效率上是比较高的。

配置过程还是很简单的,创建死信交换机和死信队列绑定给普通的消息队列,对每个回收消息设置ttl,并将回收消息发送到普通的消息队列中,监听对应的死性队列并消费消息完成回收任务(真正的删除文件及删除对应所有的子文件,并非逻辑删除)。

问:那取消回收,对应的延迟回收任务还会执行吗?
监听器还是会去消费对应的回收消息,但是在回收之前还会做逻辑字段的判断,如果依旧是逻辑删除状态则执行回收,反之就不回收。

问:一直点删除和取消回收岂不是会存储产生大量的消息,最终导致消息堆积,该怎么解决呢?

项目目前是面向小用户,没有考虑百万级的数据,出现这种情况的话,首先会考虑将死性队列的类型升级为惰性队列,增加队列的容量,此时就是使用磁盘作为存储空间,这会导致大量的IO操作,效率上会低一点。

问:如果还原文件的父目录被在删除了,那在文件的还原上是怎么处理的呢?

如果还原文件的父文件被删除了,我们的就会修改被还原文件的父文件id为0,也就是主目录id。如果父目录只是逻辑删除的话,该还原文件的状态取决于父目录的逻辑删除状态。

问:处理使用rabbitMq来解决的,我们还可以使用什么方案呢?

可以考虑使用xxl-job做定时任务。我记得定时任务都有对用的id,我们可以通过id来控制回收任务的执行和取消。具体没有实现过。

自定义日志模块总结

在自定义日志信息上使用 aop + 自定义注解 + log4j来实现的,对log4j的日志功能做了增强。

通过创建自定义注解,使用aop并以自定义注解为切点,使用前置通知对指定方法做增强的效果,也即是我们记录日志信息。

通过添加自定义注解来对指定方法做日志记录,通过log4j生成对应的日志文件。

import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;@Aspect
@Component
public class MyCustomAspect {// 定义切点,指向自定义注解@Pointcut("@annotation(MyCustomAnnotation)")public void annotatedWithMyCustomAnnotation() {}// 使用@Before通知打印日志@Before("annotatedWithMyCustomAnnotation()")public void beforeAdvice() {System.out.println("执行了带有MyCustomAnnotation注解的方法");}// 根据需要添加其他通知,比如 @After, @Around 等
}

问:日志中你通常会记录哪些信息呢?

主要就是记录:日志的级别,错误,时间,调用方法名,方法的参数信息,当前线程的信息。

问:在项目中什么情况下会记录日志信息呢?

当调用重要方法时和发生异常时会记录日志的信息。

 简单的介绍一下你的项目吧?

项目主要就是实现百度云盘的基础功能。主要分为:登录模块,文件列表模块,分享模块,回收站模块,管理员设置模块。这个项目已经为迭代了两个版本。

1.我先给您介绍一下登录模块吧,在旧版本中,我们使用单点登录来实现的,将token存放在s sesion中,我们无法合理的控制token的有效时间。因此在新版本中使用双token三认证来实现的......

2.我们的管理员有特殊权限,由控制标记字段优化为使用RDAB模型来实现的权限系统,提高了扩展性......

3.用户主要操作的就是文件列表,其存在高qps的情况,因此对其做了缓存,为了防止无效字段的重复查询数据也就是缓存穿透问题,我们使用布隆过滤器来解决的......

在上传上使用ffmpeg实现分段上传......

4.回收模块,回收站中文件的有效期为7天,过期后会自动删除。在刚开始考虑解决方案的时候,先是想到使用线程睡眠......
5.分享模块,我们会将分享链接信息存到mysql并提高redis来控制有效期,此时就会存在过期分享的数据残留,我们使用xxl-job来定时的清除残留数据......

6.为了提高日志记录的扩展性,使用 aop + 自定义注解 + Log4j 来实现的,主要就是.......

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/582375.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

国际物流公司科普_集装箱种类区分和介绍_箱讯科技

集装箱运输的不断发展,为适应装载不同种类货物的需要,因而出现了不同种类的集装箱。今天和大家一起来总结一下。 按使用材料分类 根据箱子主体部件(侧壁、端壁、箱顶等)采用什么材料,就叫做什么材料制造的集装箱&…

TPRI-DMP平台介绍

TPRI-DMP平台介绍 TPRI-DMP平台概述 TPRI-DMP为华能集团西安热工院自主产权的工业云PaaS平台,已经过13年的发展和迭代,其具备大规模能源电力行业生产应用软件开发和运行能力。提供TPRI-DMP平台主数据管理、业务系统开发与运行、应用资源管理与运维监控…

【数据结构】C语言实现单链表的基本操作

单链表基本操作的实现 导言一、查找操作1.1 按位查找1.1.1 按位查找的C语言实现1.1.2 按位查找的时间复杂度 1.2 按值查找1.2.1 按值查找的C语言实现1.2.2 按值查找的时间复杂度 二、插入操作2.1 后插操作2.2 前插操作 三、删除操作结语 导言 大家好,很高兴又和大家…

C++ 之LeetCode刷题记录(三)

😄😊😆😃😄😊😆😃 开始cpp刷题之旅,多学多练,尽力而为。 先易后难,先刷简单的。 13、罗马数字转整数 罗马数字包含以下七种字符: I&#xff0c…

ClickHouse基础知识(二):ClickHouse 安装教程

1. 准备工作 1.1 确定防火墙处于关闭状态 1.2 CentOS 取消打开文件数限制 (1)在 hadoop101 的 /etc/security/limits.conf 文件的末尾加入以下内容 sudo vim /etc/security/limits.conf(2)在 hadoop101 的/etc/security/limits.…

Rocky9 1.28安装kubernetes

1.环境准备 二进制安装比较复杂,但是也比较稳定,适用于线上环境使用。   本笔记参考自:https://github.com/cby-chen/Kubernetes ,针对文中内容,有部分镜像无法拉取等,还有一部分有点小问题,…

SQL小技巧5:数据去重的N种方法,总有一种你想不到!

在平时工作中,使用SQL语句进行数据去重的场景非常多。 今天主要分享几种数据去重的SQL写法。 假如有一张student表,结构如下: create table student( id int, name varchar(50), age int, address varchar(100)); 表中的数据…

【解决方案】智能语音模块,东胜物联远场语音解决方案让控制更简单,应用于智能家居等场景

现在的天气真是冷得不想多动一下,又想打开取暖器?有了它,用声音就能遥控,今天我们就来聊聊智能语音模块。 技术概述 远场语音技术,采用了麦克风阵列、信号处理技术以及先进的语音识别引擎,使得设备能够在距…

C++ DAY2作业

1.课堂struct练习&#xff0c;用class&#xff1b; #include <iostream>using namespace std;class Stu { private:int age;char sex;int high; public:double score;void set_values(int a,char b,int c,double d);int get_age();char get_sex();int get_high(); }; vo…

Java开发框架和中间件面试题(8)

目录 82.Mybatis一级缓存&#xff0c;二级缓存&#xff1f; 83.Mybatis如何防止SQL注入&#xff1f; 84.mybatis中resultType和resultMap有什么区别&#xff1f; 85.如何在SpringBoot中禁用Actuator断点安全性&#xff1f; 86.什么是SpringBoot&#xff1f;SpringBoot有哪些…

go 使用 - sync.Metux

[TOC]&#xff08;sync.metux 使用&#xff09; 简介 简述使用metux使用的方法&#xff0c; 使用的注意点&#xff0c; 以及使用情况使用方法 提供的方法 Lock() 方法用于获取锁 Unlock() 方法用于释放锁 TryLock()方法尝试获取锁 对共享资源进行加锁&#xff0c; 例 &#…

数据库(Database)基础知识

什么是数据库 数据库是按照数据结构来组织、存储和管理数据的仓库&#xff0c;用户可以通过数据库管理系统对存储的数据进行增删改查操作。 数据库实际上是一个文件集合&#xff0c;本质就是一个文件系统&#xff0c;以文件的方式&#xff0c;将数据保存在电脑上。 什么是数据…

阿里云 ACK 云上大规模 Kubernetes 集群高可靠性保障实战

作者&#xff1a;贤维 马建波 古九 五花 刘佳旭 引言 2023 年 7 月&#xff0c;阿里云容器服务 ACK 成为首批通过中国信通院“云服务稳定运行能力-容器集群稳定性”评估的产品&#xff0c; 并荣获“先进级”认证。随着 ACK 在生产环境中的采用率越来越高&#xff0c;稳定性保…

leaflet学习笔记-地图图层控制(二)

图层介绍 Leaflet的地图图层控件可控制两类图层&#xff1a;一类是底图图层&#xff08;Base Layers&#xff09;&#xff0c;一次只能选择一个图层作为地图的背景图层&#xff0c;即底图图层&#xff0c;在地图图层控件中用单选按钮控制&#xff1b;另一类是覆盖图层&#xff…

大数据与人工智能|信息技术产业架构、行业发展与前沿技术(第2节)

内容链接&#xff1a;信息技术产业架构、行业发展与前沿技术&#xff08;大数据与人工智能系列课程 第2节&#xff09; 声明&#xff1a;学习使用&#xff0c;侵权必删&#xff01; 主要内容&#xff1a;1. 从算盘到量子计算机&#xff0c;介绍了半导体行业的发展历程和技术原…

吓一跳!哈佛大学最受欢迎的课程,我不敢相信我的眼睛!

文件销毁、硬盘销毁、数据销毁以及物料销毁是四个相互关联且在企业或组织运营中至关重要的环节。这四个方面都涉及信息安全和保密管理的核心内容&#xff0c;关乎企业的商业秘密、客户的个人信息以及各种敏感数据的保护。随着信息化和数字化的快速发展&#xff0c;如何安全、有…

thinkcmf 文件包含 x1.6.0-x2.2.3 已亲自复现

thinkcmf 文件包含 x1.6.0-x2.2.3 CVE-2019-16278 已亲自复现 漏洞名称漏洞描述影响版本 漏洞复现环境搭建漏洞利用 修复建议总结 漏洞名称 漏洞描述 ThinkCMF是一款基于PHPMYSQL开发的中文内容管理框架&#xff0c;底层采用ThinkPHP3.2.3构建。ThinkCMF提出灵活的应用机制&a…

微信小程序登录(生成token,token校验)——后端

写在前面&#xff1a;如果想自己开发微信小程序&#xff0c;需要先到微信小程序官方平台注册账号&#xff0c;地址为&#xff1a;https://mp.weixin.qq.com/wxopen/waregister?actionstep1. 登录流程 其中&#xff0c;开发者服务器就是我们的后端服务器&#xff0c;微信接口服…

传感器基础:传感器使用与编程使用(三)

目录 常用传感器讲解九--雨滴传感器具体讲解电路连接代码实现 常用传感器讲解十--光传感器根据亮度安排灯具体讲解电路连接代码实现 常用传感器讲解七--light cup&#xff08;KY-008&#xff09;具体讲解电路连接代码实现 常用传感器讲解十二--倾斜开关传感器&#xff08;KY-02…

Java版企业电子招标采购系统源码——鸿鹄电子招投标系统的技术特点

在数字化时代&#xff0c;采购管理也正经历着前所未有的变革。全过程数字化采购管理成为了企业追求高效、透明和规范的关键。该系统通过Spring Cloud、Spring Boot2、Mybatis等先进技术&#xff0c;打造了从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通过…