java后端工程师进修ing(研一版‖day49)
目录
今日总结
详细内容
java随征录
编辑Maven依赖版本冲突问题
代码生成器生成基本代码架构
整体架构介绍
生成接口文档
科研随探录
八股随笔录
代码随想录
今日总结
- java随征录——Maven依赖版本冲突问题,代码生成器生成基本代码架构,生成接口文档
- 科研随探录——
- 八股随笔录——Redis面试篇(3/7)
- 代码随想录——
详细内容
java随征录
Maven依赖版本冲突问题
项目依赖A和C,但是A依赖B的1.0,C依赖B的2.0。对于这种版本冲突问题,有一下两种办法
1. 使用exclusions排除依赖版本
2. 使用dependencyMangement锁定版本号,通常在父工程对依赖的版本统一管理。
代码生成器生成基本代码架构
public class ContentCodeGenerator {// TODO 修改服务名以及数据表名private static final String SERVICE_NAME = "content";//数据库账号private static final String DATA_SOURCE_USER_NAME = "root";//数据库密码private static final String DATA_SOURCE_PASSWORD = "mysql";//生成的表private static final String[] TABLE_NAMES = new String[]{
// "mq_message",
// "mq_message_history""course_base","course_market","course_teacher","course_category","teachplan","teachplan_media","course_publish","course_publish_pre"};// TODO 默认生成entity,需要生成DTO修改此变量// 一般情况下要先生成 DTO类 然后修改此参数再生成 PO 类。private static final Boolean IS_DTO = false;public static void main(String[] args) {// 代码生成器AutoGenerator mpg = new AutoGenerator();// 选择 freemarker 引擎,默认 Velocitympg.setTemplateEngine(new FreemarkerTemplateEngine());// 全局配置GlobalConfig gc = new GlobalConfig();gc.setFileOverride(true);//生成路径gc.setOutputDir(System.getProperty("user.dir") + "/xuecheng-plus-generator/src/main/java");gc.setAuthor("itcast");gc.setOpen(false);gc.setSwagger2(false);gc.setServiceName("%sService");gc.setBaseResultMap(true);gc.setBaseColumnList(true);if (IS_DTO) {gc.setSwagger2(true);gc.setEntityName("%sDTO");}mpg.setGlobalConfig(gc);// 数据库配置DataSourceConfig dsc = new DataSourceConfig();dsc.setDbType(DbType.MYSQL);dsc.setUrl("jdbc:mysql://192.168.101.65:3306/xcqdd_" + SERVICE_NAME+ "?serverTimezone=UTC&useUnicode=true&useSSL=false&characterEncoding=utf8");
// dsc.setDriverName("com.mysql.jdbc.Driver");dsc.setDriverName("com.mysql.cj.jdbc.Driver");dsc.setUsername(DATA_SOURCE_USER_NAME);dsc.setPassword(DATA_SOURCE_PASSWORD);mpg.setDataSource(dsc);// 包配置PackageConfig pc = new PackageConfig();pc.setModuleName(SERVICE_NAME);pc.setParent("com.xuecheng");pc.setServiceImpl("service.impl");pc.setXml("mapper");pc.setEntity("model.po");mpg.setPackageInfo(pc);// 设置模板TemplateConfig tc = new TemplateConfig();mpg.setTemplate(tc);// 策略配置StrategyConfig strategy = new StrategyConfig();strategy.setNaming(NamingStrategy.underline_to_camel);strategy.setColumnNaming(NamingStrategy.underline_to_camel);strategy.setEntityLombokModel(true);strategy.setRestControllerStyle(true);strategy.setInclude(TABLE_NAMES);strategy.setControllerMappingHyphenStyle(true);strategy.setTablePrefix(pc.getModuleName() + "_");// Boolean类型字段是否移除is前缀处理strategy.setEntityBooleanColumnRemoveIsPrefix(true);strategy.setRestControllerStyle(true);// 自动填充字段配置strategy.setTableFillList(Arrays.asList(new TableFill("create_date", FieldFill.INSERT),new TableFill("change_date", FieldFill.INSERT_UPDATE),new TableFill("modify_date", FieldFill.UPDATE)));mpg.setStrategy(strategy);mpg.execute();}}
整体架构介绍
1. api包中用于定义接口类,用于接受客户端发送的请求。
2. dto包用于定义数据传输对象。将请求体中的数据封装成对象,用来发送数据对象。
3. po包用于定义数据库实例类对象。里面封装好了各个数据库中需要的对象属性。
4. vo包用于定义视图层传输的对象。专为前端展示设计的定制化数据结构。
生成接口文档
在前后端分离开发中通常由后端程序员设计接口,完成后需要编写接口文档,最后将文档交给前端工程师,前端工程师参考文档进行开发。本项目通过Swagger生成接口在线文档。
科研随探录
八股随笔录
- Redis怎么实现的io多路复用?
因为redis是跑在单线程中的,所有的操作都是按照顺序性执行的,但是由于io操作在一半情况下不能直接返回,这会导致某一文件io操作堵塞导致整个进程无法进行。为了让单线程的服务端应用同时处理多个客户端的事件,Redis采用了IO多路复用机制。I/O 多路复用其实是使用一个线程来检查多个 Socket 的就绪状态,在单个线程中通过记录跟踪每一个 socket。
- Redis有哪2种持久化方式?分别的优缺点是什么?
Redis的读写操作都是在内存中,所以Redis性能才会高,但是当redis重启后,内存中的数据就会丢失,为了保证内存中的数据不会丢失,redis实现了数据持久化的机制,这个机制会把数据存储到磁盘。
1. AOF日志:每执行一条写操作命令,就把该命令以追加的方式写入到一个文件里
redis提供了三种写回硬盘的策略,如下
2. RDB快照:将某一时刻的内存数据,以二进制的方式写入磁盘
因为 AOF 日志记录的是操作命令,不是实际的数据,所以用 AOF 方法做故障恢复时,需要全量把日志都执行一遍,一旦 AOF 日志非常多,势必会造成 Redis 的恢复操作缓慢。为了解决这个问题,redis增加了RDB快照。
RDB 快照就是记录某一个瞬间的内存数据,记录的是实际数据,而 AOF 文件记录的是命令操作的日志,而不是实际的数据。
- AOF和RDB的优缺点。
AOF:
优点:提供更高的数据安全性,支持多种同步策略
缺点:记录每一个写操作,消耗更多的磁盘空间。频繁的io操作对redis的写入性能造成一定影响。
RDB:
优点:以快照的形式保存数据,文件体积小,备份和恢复的速度快。由于是定期快照,RDB文件通常比AOF文件小得多。
缺点: RDB方式在两次快照之间,如果Redis服务器发生故障,这段时间的数据将会丢失。并且,如果在RDB创建快照到恢复期间有写操作,恢复后的数据可能与故障前的数据不完全一致
代码随想录