大家好,我是陶然同学,软件工程大三即将实习。认识我的朋友们知道,我是科班出身,学的还行,但是对面试掌握不够,所以我将用这100多天更新Java面试题🙃🙃。
不敢苟同,相信大家和我一样,都有一个大厂梦,作为一名资深Java选手,深知面试重要性,接下来我准备用100天时间,基于Java岗面试中的高频面试题,以每日3题的形式,带你过一遍热门面试题及恰如其分的解答。当然,我不会太深入,因为我怕记不住!!
因此,不足的地方希望各位在评论区补充疑惑、见解以及面试中遇到的奇葩问法,希望这100天能够让我们有质的飞越,一起冲进大厂!!,让我们一起学(juan)起来!!!
左连接、右连接、内连接的区别
1、左连接:left (outer) join
左表的所有行会显示,右表的只有和左表匹配到的行才会显示。即:A表的全集+ AB表的交集
select * from A left Join B on A.key=B.key
2、右连接:right (outer) join
右表的所有行会显示,左表的只有和右表匹配到的行才会显示。即:B表的全集+AB表的交集
select * from A right join B on A.key=B.key
1、内连接:( inner) join
两种表的公共部分进行显示,即:AB表的交集。注:inner 关键字可以省略
select * from A inner join B on A.key=B.key
或
select * from A join B on A.key=B.key
当B表的外键key refer a表的key时,且join表示,用此key关联的时候,那么 inner join 和right join 的结果是一样的!因为B表有的,A表也都有。
Redis和MySQL如何保证数据库一致
方案1:先更新mysql 再更新redis 如果更新redis失败 可能导致数据不一致
方案2:先删除redis缓存数据 再更新mysql 再次查询的时候将数据添加到缓存中 但是在高并发下
性能较低 而且仍然会出现数据不一致的问题 比如线程1删除了Redis缓存数据 正在更新Mysql 此时
另外一个查询在查询 那么就会吧MySQL中老数据又查到Redis中
方案3:延时双删步骤是:先删除Redis缓存数据 再更新MySQL 延迟几百毫秒再删除Redis缓存数
据 这样就算在更新MySQL时 有其他线程读了MySQL 把老数据读到了Redis中 那么也会被删除掉
从而保持数据一致
存储MD5的值应该用varchar还是char
问题分析
MD5是由数字和字母组成的一个16位或者32位长度的字符串,一般在应用开发中都是使用32位。
看起来,我们用varchar(32)或者char(32)都可以存储,那用哪种更好呢?
要回答这个问题,必须要了解这两个类型的功能特性和区别。
- 第一个,char是一个固定长度的字符串,Varchar是一个可变长度的字符串
假设声明一个char(10)的长度,如果存储字符串“abc”,虽然实际字符长度只有3,但是char还是会占10个字节长度。
同样,如果用varchar存储,那它只会使用3个字符的实际长度来存储。 - 第二个,存储的效率不同,char类型每次修改以后存储空间的长度不变,所以效率更高
varchar每次修改数据都需要更新存储空间长度,效率较低 - 第三个,存储空间不同,char不管实际数据大小,存储空间是固定的,而varchar存储空间等于实际数据长度,所以varchar实际存储空间的使用要比char更小
基于他们特性的分析,可以得出一个基本的结论:
- char适合存储比较短的且是固定长度的字符串
- varchar适合存储可变长度的字符串
高手:
我认为应该使用Char类型,原因是:
char类型是固定长度的字符串,varchar是可变长度字符串。
而MD5是一个固定长度的字符,不管数据怎么修改,长度不变,这个点很符合char类型。
另外,由于是固定长度,所以在数据变更的时候,不需要去调整存储空间大小,在效率上会比varchar好。