java基础
二、mysql
1.主键生成
主键自增。
不过我一般都用 mybatisplus的雪花算法
那假设我不用
m
y
s
q
l
的自增主键呢,有什么问题吗?
\color{red}{那假设我不用mysql的自增主键呢,有什么问题吗?}
那假设我不用mysql的自增主键呢,有什么问题吗?
唯一性,空间尽可能短
像uuid类似的主键,插入的性能比自增要差的。
因为生成的uuid,在插入时有可能需要移动磁盘块(比如,块内的空间在当前时刻已经存储满了,但新生成的uuid需要插入已满的块内,就需要移动块的数据)
2.如何线程安全的修改某一条数据
lock in share mode或select…for update是在事务内起作用的,涉及行锁的概念。能保证当前session事务锁定的行不被其他session所修改。前者属于共享锁,允许其他事务添加共享锁,不允许其他事务修改或者加排它锁。后者属于排它锁,不允许其他事务添加共享锁和排它锁,也不允许修改。
一般情况下推荐使用select…for update。使用lock in share mode时需要注意死锁的问题,就是如果两个session同时对一行加锁,那么将无法执行修改,必须等一个session退出以后才能执行。如果有两个session加锁后同时修改一行,那么将有一个session被引擎强制关闭并重启,这样另一个session的修改就可以顺利执行。如果只有一个session修改,另一个session不做修改动作,那么这个尝试修改的session将会一直等待锁被释放才能继续执行。
三、线程
四、redis
1. redis底层(数据结构-简单动态字符串)
String数据结构类型
Redis使用了SDS作为默认的字符串表示,SDS是简单动态字符串(Simple Dynamic String)的缩写。SDS结构如下所示:
struct sdshdr {
int len; //buf已使用的长度
int free; //buf未使用的长度
char buf[]; //buf表示字节数组,用来存储字符串
};
项目难点介绍
1.重复提交
描述:一个接口,同一个时间,请求多次,插入数据时,可能会导致重复。
或者说 第一次接口没走完代码,第二次请求又进来了
解决:用的redis分布式锁,先让一个进来,其他的在外面等着,等当前接口执行完毕后。再点击按钮出发接口
2.日志链路追踪
描述:你调取其他项目,比如你这边项目报错了,怎么能快速定位到问题。
通过Slf4j中的MDC。
被掉项目可以 请求头传给他们,就这样一条条日志 从开始到结束一条链路就下来了。
3.这个接口有点慢(优化)
1.根据需求,场景来优化,比如循环 可以使用 并行流。有些增删操作,可以用异步方式去进行。
或者说通过线程池去进行。