Mysql面经
MySQL面试题-文稿
面试官:MySQL中,如何定位慢查询?
候选人:
嗯~,我们当时做压测的时候有的接口非常的慢,接口的响应时间超过了2秒以上,因为我们当时的系统部署了运维的监控系统Skywalking ,在展示的报表中可以看到是哪一个接口比较慢,并且可以分析这个接口哪部分比较慢,这里可以看到SQL的具体的执行时间,所以可以定位是哪个sql出了问题
如果,项目中没有这种运维的监控系统,其实在MySQL中也提供了慢日志查询的功能,可以在MySQL的系统配置文件中开启这个慢日志的功能,并且也可以设置SQL执行超过多少时间来记录到一个日志文件中,我记得上一个项目配置的是2秒,只要SQL执行的时间超过了2秒就会记录到日志文件中,我们就可以在日志文件找到执行比较慢的SQL了。
面试官:那这个SQL语句执行很慢, 如何分析呢?
候选人:如果一条sql执行很慢的话,我们通常会使用mysql自动的执行计划explain来去查看这条sql的执行情况,比如在这里面可以通过key和key_len检查是否命中了索引,如果本身已经添加了索引,也可以判断索引是否有失效的情况,第二个,可以通过type字段查看s ...
索引的数据结构
1 为什么使用索引索引是存储引擎用于快速找到数据记录的一种数据结构,就好比一半教科书的目录部分,通过目录中找到对应文章的页码,便可快速定位到需要的文章,Mysql中也是一样的道理,进行数据查找时,首先查看查询条件是否命中某条索引,符合则通过索引查找相关顺序,如果不符合则需要全表扫描,即需要一条一条底地查询记录,知道找到与条件符合的记录如上图所示,如果没有索引,数据离散分布,那么找到数据将会非常消耗时间,如果数据顺序摆放,那么也需要从1开始找到第6个,依然非常耗时,如果我们不借助任何索引结构帮助我们快速定位数据的话,我们查找Col2=89这条记录,就要逐行去查找
假如给数据使用二叉树这样的数据结构进行存储,如下图
这时再去查找Col2=89这条记录,只需要查找两次,查询速度提高了
这就是为什么我们要建索引,目的就是为了减少磁盘I/O的次数,加快查询速率
2 索引及其优缺点Mysql官方对索引的定义为:索引(index)是帮助Mysql高效过去数据的数据结构
索引的本质:索引是数据结构,可以简单理解为排好序的快速查找数据结构,满足特定查找算法,这些数据结构以某 ...
Java八股文
现代八股
1 Redis篇
Redis使用场景
缓存(穿透,击穿,雪崩 | 双写一致,持久化 | 数据过期,淘汰策略)
分布式锁(setnx,re’disson)
计数器
保存token
消息队列
延迟队列
1.1 缓存穿透
例如,一个get请求: api/new/getById/1
缓存穿透:查询一个不存在的数据,mysql查询不到数据也不会直接写入缓存,就会导致每次请求都查数据库
穿透穿透,可以理解为请求的数据穿透了redis,还是动用了mysql,导致缓存没起到作用
解决方案一:缓存空数据,查询返回的数据为空,扔把这个空结果进行缓存优点:简单缺点:消耗内存,可能会发生不一致的问题
解决方案二:布隆过滤器优点:内存占用较少,没有多余的key缺点:实现复杂,存在误判
布隆过滤器bitmap(位图):相当于一个以(bit)位为单位的数组,数组中每个单元只能存储二进制数0或1布隆过滤器的作用:布隆过滤器可以用于检索一个元素是否在一个集合中两种实现:redisson,guava
但是布隆过滤器也存在误判的可能误判率:数组越小误判率就越大,数组越大误判率就越小,但是同时也带来了更 ...
Redis面经
Redis相关面试题缓存穿透
面试官:什么是缓存穿透 ? 怎么解决 ?
候选人:
嗯~~,我想一下
缓存穿透是指查询一个一定不存在的数据,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到 DB 去查询,可能导致 DB 挂掉。这种情况大概率是遭到了攻击。
解决方案的话,我们通常都会用布隆过滤器来解决它
面试官:好的,你能介绍一下布隆过滤器吗?
候选人:
嗯,是这样~
布隆过滤器主要是用于检索一个元素是否在一个集合中。我们当时使用的是redisson实现的布隆过滤器。
它的底层主要是先去初始化一个比较大数组,里面存放的二进制0或1。在一开始都是0,当一个key来了之后经过3次hash计算,模于数组长度找到数据的下标然后把数组中原来的0改为1,这样的话,三个数组的位置就能标明一个key的存在。查找的过程也是一样的。
当然是有缺点的,布隆过滤器有可能会产生一定的误判,我们一般可以设置这个误判率,大概不会超过5%,其实这个误判是必然存在的,要不就得增加数组的长度,其实已经算是很划分了,5%以内的误判率一般的项目也能接受,不至于高并发下压倒数据库。
缓存击穿
面试官:什 ...
Java线程
补一下线程的知识.
创建和启动线程概述JVM允许程序运行多个线程,使用java.lang.Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例
Thread类的特性
每个线程都是通过某个特定Thread对象的run()方法完成操作的,因此把run()方法体称为线程执行体
通过该Thread对象的start()方法来启动这个线程,而非直接调用run()
要想实现多线程,必须在主线程中创建新的线程对象
继承Thread类
创建一个继承Thread类的子类
重写Thread类的run()方法,将此线程要执行的操作,声明在此方法体中
创建当前Thread的子类对象
通过对象调用start()方法
创建线程,打印100以内的偶数
12345678910111213141516171819202122public class Test1 { public static void main(String[] args) { Thread1 t1 = new Thread1(); /** * start( ...
MySql搭建主从复制-读写分离
主从复制基础配置准备准备两台虚拟机,如果是克隆的虚拟机,注意修改:
修改静态的ip地址
修改mac地址
修改UUID
修改mysql的uuid
修改主机名(可选)
配置修改配置文件后要进行服务重启
主机配置文件:
这个有坑,感觉log-bin只要换成文件夹指定报错/mysql-bin,也不懂是为啥123456789101112131415#主服务器唯一IDserver-id=1###启用二进制日志log-bin=mysql-bin###设置不要复制的数据库(可设置多个)#binlog-ignore-db=mysql#binlog-ignore-db=information_schema###设置需要复制的数据库。注意:MySQL是从接入点开始复制操作的binlog-do-db=zzmr-master-slave###设置logbin格式binlog_format=STATEMENT
然后在主机中新建用户:
1234567create user 'slave'@'%' identified by '010203' ...
苍穹外卖
2023年8月25日 16点04分
这应该是写在简历上的项目了,待好好对待啊
1 项目概述&环境搭建技术选型
前端环境搭建?好像也没搭建啥,直接打开资料,双击nginx就ok了
后端环境搭建这后端代码已经写好一大部分了啊
sky-take-out:maven父工程,统一管理依赖版本,聚合其他子模块
sky-common:子模块,存放公共类,例如:工具类,常量类,异常类等
sky-pojo:子模块,存放实体类,VO,DTO等
sky-server:子模块,后端服务,存放配置文件,Controller,Service,Mapper等
sky-pojo模块介绍
Entity:实体,通常和数据库中的表对应
DTO:数据传输对象,通常用于程序中各层之间传递数据
VO:视图对象,为前端展示数据提供的对象
pojo:普通Java对象,只有属性和对应的getter和etter
使用Git进行版本控制
害,这比网,推了半天都推不到github上
推上去了,仓库地址
数据库环境搭建这个比较好哎,有一个sql外加一个数据库设计文档
各个表介绍
前后端联调后端的初始工程中已经实现了登录 ...
Hexo Algolia配置
注册Algolia账号Algolia官网
进入然后注册账号,可以用github或者gmail
新建Indices,新版网站在get Started处
新建Index,命名为hexo(随意)
在settings中找到API Keys:
_config.yml配置
首先在主题配置文件中开启algolia12345678# Algolia searchalgolia_search: enable: true hits: per_page: 6 tags: # - 前端 # - Hexo
然后将以下内容配置到_config.yml中,**注意别配置到主题配置文件中了,不然会报错12345678910111213141516# algolia搜索: https://github.com/LouisBarranqueiro/hexo-algoliasearchalgolia: appId: "your appId" apiKey: "your apiKey" adminApiKey: "your adminApiK ...
SpringCloud
2023年3月15日 20点02分
SpringCloud开始SpringCloud的学习
分布式微服务架构?所以说学这个一定要懂得SpringBoot
技术要求:java8+maven+git,github+Nginx+RabbitMQ+SpringBoot2.0
完了,两个没学
那算了,先把Nginx和RabbitMQ学完再来了
bye
2023年3月26日 11点58分
花了11天,才把RabbitMQ看完,后面的Nginx用到的时候再现学吧
绝了,阳哥建议关弹幕学习哈哈哈哈,弹幕还是太杂了
不在能知,乃在能行
1 微服务架构与SpringCloud
微服务架构的概念
微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调,互相配合,为用户提供最终价值.每个服务运行在独立的进程中,服务与服务之间采用轻量级的通信机制互相协作(通常是HTTP协议的RESTful API),每个服务都围绕着具体业务进行构建,并且能够被独立的部署到生成环境,类生产环境等.另外,应当尽量避免统一的,集中式的服务管理机制,对具体一个服务而言,应根据业务上下文,选择合适的语言 ...
Github Pages绑定域名
直接看最后,前面别看了
购买域名这里以namesilo为例,因为namesilo购买的域名不需要备案就可以使用
来到namesilo官网注册账号,购买域名.
挑选自己想要的顶级域名:
可以使用支付宝支付
配置DNS解析
来到域名管理界面
点击域名后的蓝色小球:
把默认的配置全部删除
往下翻,找到Github的模板,应用该模板:
ADDRESS/VALUE填自己pages的ip地址,可以通过ping的方式来获取
再添加一个CNAME:
格式为:
Pages添加自定义域名
进入pages的仓库,点击Settings
找到Pages项,在Custom domain处添加你的域名,并在下方勾选Enforce HTTPS
此时就可以通过域名来访问Pages了
解决Hexo d更新博客后自定义域名失效的问题由于绑定了自定义域名,仓库中会自动在根目录添加一个CNAME文件,文件内里是你的域名,但是本地仓库中是没有这个文件的,所以每次执行hexo d都会使自定义域名失效
解决办法:
在博客的source目录下,新建一个CNAME文件,文件内容就是你的域名:
这样每次执行he ...