目录
今日总结
- java随征录------Maven依赖版本冲突问题,代码生成器生成基本代码架构,生成接口文档
- 科研随探录------
- 八股随笔录------Redis面试篇(3/7)
- 代码随想录------
详细内容
java随征录
Maven依赖版本冲突问题
项目依赖A和C,但是A依赖B的1.0,C依赖B的2.0。对于这种版本冲突问题,有一下两种办法
-
使用exclusions排除依赖版本
-
使用dependencyMangement锁定版本号,通常在父工程对依赖的版本统一管理。
代码生成器生成基本代码架构
java
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 引擎,默认 Velocity
mpg.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();
}
}
整体架构介绍


-
api包中用于定义接口类,用于接受客户端发送的请求。
-
dto包用于定义数据传输对象。将请求体中的数据封装成对象,用来发送数据对象。
-
po包用于定义数据库实例类对象。里面封装好了各个数据库中需要的对象属性。
-
vo包用于定义视图层传输的对象。专为前端展示设计的定制化数据结构。
生成接口文档
在前后端分离开发中通常由后端程序员设计接口,完成后需要编写接口文档,最后将文档交给前端工程师,前端工程师参考文档进行开发。本项目通过Swagger生成接口在线文档。

科研随探录
八股随笔录
- Redis怎么实现的io多路复用?
因为redis是跑在单线程中的,所有的操作都是按照顺序性执行的,但是由于io操作在一半情况下不能直接返回,这会导致某一文件io操作堵塞导致整个进程无法进行。为了让单线程的服务端应用同时处理多个客户端的事件,Redis采用了IO多路复用机制。I/O 多路复用其实是使用一个线程来检查多个 Socket 的就绪状态,在单个线程中通过记录跟踪每一个 socket。
- Redis有哪2种持久化方式?分别的优缺点是什么?
Redis的读写操作都是在内存中,所以Redis性能才会高,但是当redis重启后,内存中的数据就会丢失,为了保证内存中的数据不会丢失,redis实现了数据持久化的机制,这个机制会把数据存储到磁盘。
- AOF日志:每执行一条写操作命令,就把该命令以追加的方式写入到一个文件里
redis提供了三种写回硬盘的策略,如下
- RDB快照:将某一时刻的内存数据,以二进制的方式写入磁盘
因为 AOF 日志记录的是操作命令,不是实际的数据,所以用 AOF 方法做故障恢复时,需要全量把日志都执行一遍,一旦 AOF 日志非常多,势必会造成 Redis 的恢复操作缓慢。为了解决这个问题,redis增加了RDB快照。
RDB 快照就是记录某一个瞬间的内存数据,记录的是实际数据,而 AOF 文件记录的是命令操作的日志,而不是实际的数据。
- AOF和RDB的优缺点。
AOF:
优点:提供更高的数据安全性,支持多种同步策略
缺点:记录每一个写操作,消耗更多的磁盘空间。频繁的io操作对redis的写入性能造成一定影响。
RDB:
优点:以快照的形式保存数据,文件体积小,备份和恢复的速度快。由于是定期快照,RDB文件通常比AOF文件小得多。
缺点: RDB方式在两次快照之间,如果Redis服务器发生故障,这段时间的数据将会丢失。并且,如果在RDB创建快照到恢复期间有写操作,恢复后的数据可能与故障前的数据不完全一致
代码随想录