mysql
mysql索引最左?
索引的底层是一颗 B+ 树,联合索引当然还是一颗 B+ 树,只不过联合索引的键值数量不是一个,而是多个。构建一颗 B+ 树只能根据一个值来构建,因此数据库依据联合索引最左的字段来构建 B+ 树。
mysql事务回滚机制?
undo log 将每条执行语句记录一条相反的sql,执行前就持久化,需要回滚时执行相反的sql操作。(实现原子性)
redo log 将每条sql语句提前存储,即使执行过程中出错。(实现的是持久性)
底层,innerdb怎么将同一事务的三个语句全部回滚的?
MVCC多版本并发控制?
实现原理是通过每列的隐藏字段,DB_TRX_ID
(当前事务id,最近执行事务影响此列的事务id),与当前事务的id进行比较。
什么情况下使用分库分表:
1:MySQL单库数据量在5000万以内性能比较好,超过阈值后性能会随着数据量的增大而变弱
2:因为单个服务的磁盘空间是有限制的,如果并发压力下,所有的请求都访问同一个节点,肯定会对磁盘IO造成非常大的影响。
3:数据库连接是非常稀少的资源,如果一个库里既有用户、商品、订单相关的数据,当海量用户同时操作时,数据库连接就很可能成为瓶颈。
mysql的sql优化:
- 索引失效的情况:
- where条件中有or,in,not in关键字,不命中索引。
- like查询以%开头,同样不命中索引。
- 索引列上有函数或者数字运算。
- join少用,最好大表驱动小表,on字段建立索引。
- 查询必须进行模糊匹配时,若表不大,可以在代码里使用分词组件,通过分词结果查询。若表数据量大,可以适当引入全文索引。
- 列尽量不要为null,因为count(*)时会统计为null的列,但是count(列名)会将null列排除。
全文索引:
myISAM和innerDB的区别:
myISM会使用变量保存表的具体行数,count计算时直接返回。innerDB要进行全表扫描。
InnerDB有事务,有外键,MyISM没有外键。
InnerDB使用聚集索引,索引直接指向保存数据的文件。MyISM非聚集索引,只保留索引像文件的指针。
mybatis:
sql注入问题:
- #{}方式能够很大程度防止sql注入,${}方式无法防止Sql注入。
- 动态sql语句
- 使用if语句可以帮助我们在运行时动态生成SQL语句,并且可以防止SQL注入攻击。
- choose语句可以帮助我们在不同的条件下生成不同的SQL语句。
- 使用sql注入过滤器
<configuration> <plugins> <!-- 插件需要实现Interceptor接口,并在调用时接受参数 --> <plugin interceptor="org.mybatis.example.ExamplePlugin"> <property name="someProperty" value="100"/> </plugin> </plugins> </configuration>
线程
线程的实现方式:
继承thread类型
实现runable接口
实现callable接口
线程池的实现方式:
ThreadPoolExecutor:
public ThreadPoolExecutor(int corePoolSize,//线程池中核心线程数的最大值
int maximumPoolSize,//线程池中能拥有最多线程数
long keepAliveTime,//
TimeUnit unit,
BlockingQueue<Runnable> workQueue,//用于缓存任务的阻塞队列
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
MQ
mq消息堆积如何处理。
websocket:
websocket是什么,都有哪些作用:
是一种在单个 TCP 连接上进行 全双工 通信的协议,它可以让客户端和服务器之间进行实时的双向通信
websocket有哪些事件:
onopen:打开链接时
onmessage:发送消息时
onerror:发生错误时
onclose:关闭链接时触发
websocket方法:
send(data):
close(code,reason):
webSocket心跳:
1.使用setInterval定时发送心跳包。对服务器造成很大的压力,因为即使WebSocket连接正常,也要定时发送心跳包,从而消耗服务器资源。
2.在前端监听到WebSocket的onclose()事件时,重新创建WebSocket连接。减轻了服务器的负担,但是在重连时可能会丢失一些数据。
7/31:
redis缓存set类型时key和value
redis缓存穿透
redis的淘汰策略
mysql分库分表都用在哪些场景
mysql分布式事务
es单机还是分布式
es多字段聚合
es分页有什么问题
es插入修改问题
8/1:
mq什么情况下使用推模式,什么情况下使用拉模式?
mq消息的流程。
哪些mq能保证消息的顺序?
redis的分布式
redis部署模式有几种?如何扩容?
redis存储点赞数据,排名为什么用zset,key存什么,value存什么,为什么不用String,会有什么问题。点赞数据如何存储到数据库,如何截断。
8/13:
java实现百万级数据从Excel导入到数据库
Java实现百万级数据从Excel导入到数据库_java 百万数据导入数据库-CSDN博客
问题:内存溢出的情况:
百万级数据量,一次性都读取到内存中,肯定是不现实的,那么好的办法就是基于流式读取的方式进行分批处理(一般一次性执行1000条)。
在技术选型上,我们选择使用EasyExcel,他特别针对大数据量和复杂Excel文件的处理进行了优化。在解析Excel时EasyExcel不会将Excel一次性全部加载到内存中,而是从磁盘上一行行读取数据,逐个解析。
2、性能问题
百万级数据的处理,如果用单线程的话肯定是很慢的,想要提升性能,那么就需要使用多线程。
多线程的使用上涉及到两个场景,一个是用多线程进行文件的读取,另一个是用多线程实现数据的插入。这里就涉及到一个生产者-消费者的模式了,多个线程读取,然后多个线程插入这样可以最大限度的提升整体的性能。
而数据的插入,我们除了借助多线程之外,还可以同时使用数据库的批量插入的功能,这样就能更加的提升插入速度。(多线程核心线程数是需执行数的二倍)
8、15:
redis设计分布式锁
es倒排索引:字段指向文章,而非mysql索引中,文章包含字段。
es修改其实就算删除再添加
mysql的mvcc:
- 每个事务开启时都会对每条数据存储两个我们看不到的字段:
- 操作这条数据的事务id
- 操作数据之前这条数据的指向(保存在undo log里)。
- ReadView保存当前事务id(creator_trx_id),未提交事务id集合(min_trx_id),未开始的事务(max_trx_id)
- 通过比较readView内的数据,进行比对事务是否通过。
8、16:
幂等:
多次执行后结果于一次执行的结果一致,避免重复点击、爬虫攻击、高并发等问题
设计模式,哪些常用例子?
用过哪些加密方式?
8、20:
jdk 1.8 stream流 , Optional 类
Stream流常见方法?
中间操作:
filter过滤,排除一些元素,
distinct:去重
limit(long maxSize):截断,使得返回结果不超过maxSize
skip(long n):跳过,返回去掉了前n个元素的结果。
sorted():产生新的流,并排序。
map(function f)接收函数,将结果映射成新的元素。
终止操作:
count():返回流内总数。
max();返回流中最大值。
min():返回流中最小值。
forEach():循环迭代。
collect():归纳收集为另一个对象
Optional 类?
避免空指针问题引入的一个容器类。optional<T>
Spring?
注入注解:@autowride(单例模式)和@resource(原型模式)
@autowried是Spring内置的springframework.bean包下的
@resource是jdk内javax包下的
@autowried查找时先按照bean的类型进行查找,后续再根据name查找
@resource是按照name参数找找bean的name
@autoWried支持构造注入,属性注入,setter注入
@reourec只支持属性和setter注入
@autowried支持类、属性、构造方法、Setter方法和配置方法
@resouce支持属性和方法。
事务注解:
@Transaction
事务失效场景:
- 未指定遇到异常回滚,解决是需要修改参数:@Transactional(rollbackFor = Exception.class)
- 异常被try{}catch(){}捕获同样会失效。解决是直接trows exception
- 方法内部调用:不包含@Transactional注解的方法中调用包含@Transactional注解的方法时候,有@Transactional注解的方法的事务会被忽略,则不会发生回滚。
- 错误的事务传播机制
- 方法被private或者final修饰也会失效。
- 数据库不支持事务。
事务底层?
redis:?
各大数据类型,什么场景下使用。
redis分布式事务
Es:?
数据索引类型都有哪些
es
mysql常用索引,什么情况下使用?
使用过的加密算法?
摘要(hash)加密:?
md5加密,SHA加密,BCrypt加密
对称加密?
AES加密,PBE加密(password based、口令加密)
非对称加密?
RSA加密,包括公钥和私钥,加解密分开。
DSA加密。
8/21
java.juc包下处理并发的包
分布式事务
rdb快照如何实现的,缓存持久化
锁升级
分库分表的工具