杂乱笔记24年

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优化:

  1. 索引失效的情况:
    1. where条件中有or,in,not in关键字,不命中索引。
    2. like查询以%开头,同样不命中索引。
    3. 索引列上有函数或者数字运算。
  2. join少用,最好大表驱动小表,on字段建立索引。
  3. 查询必须进行模糊匹配时,若表不大,可以在代码里使用分词组件,通过分词结果查询。若表数据量大,可以适当引入全文索引。
  4. 列尽量不要为null,因为count(*)时会统计为null的列,但是count(列名)会将null列排除。

全文索引:

myISAM和innerDB的区别:

myISM会使用变量保存表的具体行数,count计算时直接返回。innerDB要进行全表扫描。

InnerDB有事务,有外键,MyISM没有外键。

InnerDB使用聚集索引,索引直接指向保存数据的文件。MyISM非聚集索引,只保留索引像文件的指针。

mybatis:

sql注入问题:

  1. #{}方式能够很大程度防止sql注入,${}方式无法防止Sql注入。
  2. 动态sql语句
    1. 使用if语句可以帮助我们在运行时动态生成SQL语句,并且可以防止SQL注入攻击。
    2. choose语句可以帮助我们在不同的条件下生成不同的SQL语句。
  3. 使用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:

  1. 每个事务开启时都会对每条数据存储两个我们看不到的字段:
    1. 操作这条数据的事务id
    2. 操作数据之前这条数据的指向(保存在undo log里)。
  2. ReadView保存当前事务id(creator_trx_id),未提交事务id集合(min_trx_id),未开始的事务(max_trx_id)
  3. 通过比较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

事务失效场景:

  1. 未指定遇到异常回滚,解决是需要修改参数:@Transactional(rollbackFor = Exception.class)
  2. 异常被try{}catch(){}捕获同样会失效。解决是直接trows exception
  3. 方法内部调用:不包含@Transactional注解的方法中调用包含@Transactional注解的方法时候,有@Transactional注解的方法的事务会被忽略,则不会发生回滚。
  4. 错误的事务传播机制
  5. 方法被private或者final修饰也会失效。
  6. 数据库不支持事务。

事务底层?

redis:?

各大数据类型,什么场景下使用。

redis分布式事务

Es:?

数据索引类型都有哪些

es

mysql常用索引,什么情况下使用?

使用过的加密算法?

摘要(hash)加密:?

        md5加密,SHA加密,BCrypt加密

对称加密?

AES加密,PBE加密(password based、口令加密)

非对称加密?

RSA加密,包括公钥和私钥,加解密分开。

DSA加密。

8/21

java.juc包下处理并发的包

分布式事务

rdb快照如何实现的,缓存持久化

锁升级

分库分表的工具

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值