java-面试题扩展

java基础

MarkDown语法说明

二、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.根据需求,场景来优化,比如循环 可以使用 并行流。有些增删操作,可以用异步方式去进行。
或者说通过线程池去进行。

4.

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值