大家好,我是陶然同学,软件工程大三即将实习。认识我的朋友们知道,我是科班出身,学的还行,但是对面试掌握不够,所以我将用这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表也都有。
方案1:先更新mysql 再更新redis 如果更新redis失败 可能导致数据不一致
方案2:先删除redis缓存数据 再更新mysql 再次查询的时候将数据添加到缓存中 但是在高并发下
性能较低 而且仍然会出现数据不一致的问题 比如线程1删除了Redis缓存数据 正在更新Mysql 此时
另外一个查询在查询 那么就会吧MySQL中老数据又查到Redis中
方案3:延时双删步骤是:先删除Redis缓存数据 再更新MySQL 延迟几百毫秒再删除Redis缓存数
据 这样就算在更新MySQL时 有其他线程读了MySQL 把老数据读到了Redis中 那么也会被删除掉
从而保持数据一致
问题分析
MD5是由数字和字母组成的一个16位或者32位长度的字符串,一般在应用开发中都是使用32位。
看起来,我们用varchar(32)或者char(32)都可以存储,那用哪种更好呢?
要回答这个问题,必须要了解这两个类型的功能特性和区别。
基于他们特性的分析,可以得出一个基本的结论:
高手:
我认为应该使用Char类型,原因是:
char类型是固定长度的字符串,varchar是可变长度字符串。
而MD5是一个固定长度的字符,不管数据怎么修改,长度不变,这个点很符合char类型。
另外,由于是固定长度,所以在数据变更的时候,不需要去调整存储空间大小,在效率上会比varchar好。