java:
sqlSession?
全文索引?普通索引?
脏读?幻读?
HashMap 数组的长度为什么保证数组的长度是2的幂?为什么设计成数组+链表的结构?用到了红黑树解决了什么问题?
位运算性能较取模运算快,其实可以不一定是2的幂,但这样会导致利用率较低。比如15,最后一位永远是0,任意hash值与其做与运算得到的索引永远是偶数,这样就会导致只有一半的利用率。所以为2的幂才是最合适的。
解决hash冲突
synchronized和lock的区别?
线程池?
并发包?
数据库:
1,数据库我们一般都会建立索引,可我们怎么知道这个索引有没有被用到?
在select语句前加上explain
2,sql语句优化?
(1)建立索引,在经常使用到的字段建立索引
(2)尽量避免使用select *,select 需要的字段
(3)尽量避免使用in 和not in,会导致数据库引擎放弃索引进行全表扫描
(4)用exists代替in
(5)尽量避免使用or,会导致数据库引擎放弃索引进行全表扫描
(6)尽量避免进行null值的判断,会导致数据库引擎放弃索引进行全表扫描
(7)like 以%开头会导致数据库放弃索引进行全表扫描
(8)尽量避免在where条件中等号的左侧进行表达式、函数操作,会导致数据库引擎放弃索引进行全表扫描
3,mysql 自增主键和唯一索引的区别?
主键:字段唯一不为空值的列。
自增主键:字段类型为数字、自增、并且是主键。
主键索引:索引列的值必须唯一,但允许有空值。主键是唯一索引,这样说没错。但反火来说唯一索引也是主键就错误了,因为唯一索引允许空值,主键不允许有空值,所以不能说唯一索引也是主键。
springboot:
1,@SpringBootApplication包含了哪些注解?都有什么作用?
@SpringBootConfiguration @EnableAutoConfiguration @ComponentScan
@SpringBootConfiguration
这个注解的作用与@Configuration
作用相同,都是用来声明当前类是一个配置类.可以通过@Bean
注解生成IOC容器管理的bean
@EnableAutoConfiguration
是springboot实现自动化配置的核心注解,通过这个注解把spring应用所需的bean注入容器中,把所有符合自动配置的bean都加载到IOC容器中
@ComponentScan指定包路径进行扫描,把
扫描到bean添加到IOC容器中。
2,约定大于配置?
mybatis:
1,mybatis中,#{}和${}的区别?怎么实现动态的切换表名?
我们一般会使用#{},${}会引起sql注入,动态切换表名的字段使用${},如果使用#{},该参数会被' '俩个单引号包围导致报错,比如 update 'table'
2,mybatis缓存机制
redis:
问了redis4和6版本之间的区别?
1,redis和数据库数据一致性问题?redis缓存穿透问题?redis缓存雪崩问题?
redis和数据库数据一致性问题:
情景:数据发生改变,redis缓存和数据库数据不正确时。
这个问题真的要搞明白的话建议看看别的大神解答,简单操作:当数据发生改变时,我们首先应该先删除缓存,更新数据库的数据操作,这样下次进接口时,去缓存中查发现没有再去数据库查并备份一份到缓存中。
redis缓存穿透解决方案:
情景:比如恶意使用一个id<=0的参数查询接口,redis缓存显示不会有数据,然后去数据库查询显示也不会有数据,多次请求数据库,提高数据库压力。
常见的使用布隆过滤器,把可能要传入的参数值存储起来,进行比较,会有一定的误判率。第二种把从redis查不到再去数据库查时,结果也为空,把结果也放到缓存中,并设置个过期时间,假如继续恶意查找,直接从redis查询并返回。
redis缓存雪崩问题:
情景:redis缓存的数据大量失效,同一时间有大量的请求过来,由于缓存中没有数据,都去请求数据库了,提高数据库的压力以至于不可用。
设置某些key永不失效(比如产品库中的产品数据轻易不会改变);
key失效时间尽量错开;