什么是ES倒排索引
ES倒排索引,也称为反向索引,是单词到文档ID的映射关系。它记录了每个单词(或词项)在哪些文档中出现,以及出现的位置和频率等信息。
- 分词:首先,对文档内容进行分词处理,将连续的文本拆分为多个单词或词项。
- 建立索引:然后,为每个单词或词项建立索引,记录包含该单词的所有文档的ID、词频、位置等信息。
- 查询处理:当用户输入查询关键词时,系统通过查询单词词典快速定位到对应的倒排列表,然后遍历倒排列表中的文档ID,获取包含查询关键词的文档列表。
ES索引的分片
分片(Shard):在Elasticsearch中,分片是索引的最小工作单元,它保存了索引中所有数据的一部分。一个索引可以存储超出单个节点硬件限制的大量数据,为了应对这种情况,ES将一个索引划分成了多个分片,每个分片都是功能完善且独立的索引,这些分片被分配到集群中的各个节点上。
- 主分片(Primary Shard):负责处理文档的索引、删除等写操作,并将这些操作的结果复制到副本分片。每个索引至少有一个主分片,且主分片的数量在索引创建时指定,之后不能更改。
- 副本分片(Replica Shard):主分片的一个副本,用于提供读请求,防止硬件故障导致数据丢失,并在主分片异常时提供故障转移。副本分片的数量可以动态调整。
- 水平扩展:通过增加分片数量,可以实现索引的水平扩展,提高查询性能和并发能力。
- 数据分布:分片机制使得索引数据可以分布在集群中的多个节点上,实现数据的负载均衡。
- 高可用性和容错性:副本分片提供了数据的高可用性和容错性,防止单点故障导致的数据丢失。
mysql的索引类型都有哪些
主键索引,唯一索引,非空索引,普通索引
聚集索引,非聚集索引
联合索引,前缀索引
使用索引的优点缺点
优点:
加快查询速度
加快分组、排序、连接速度
支持唯一性约束
缺点:
额外空间
写操作需要额外维护索引
事务隔离级别
读未提交,可能读到事务未提交的数据,即脏数据。
读已提交,读写锁解决脏读,可能出现不可重复读,即一个事务内多次读取结果不一样。
可重复读,MVCC解决不可重复读,但可能出现幻读。
串行化,串行执行,效率低。
什么是幻读
范围查询时,多次查到的数据量不同
那怎么去解决幻读
临键锁
有一个慢查询,有哪些方式去优化它
使用explain分析
查看type字段,看是all还是index还是range,如果没有走索引,分析索引失效原因,如隐式类型转换、函数、模糊查询、not in、or、!=、不满足最左匹配原则等。
什么场景下需要去做分库分表呢
高并发且单表数据量大
Redis的数据类型有哪些
String、Hash、List、Set、Zset、Bitmap、Bloom Filter、GEO、HyperLogLog、Stream
假如做一个排行榜,用redis哪个数据类型来实现
zset
说一下zset的底层实现原理
跳表
底层原理是多级链表,第一层是完整的链表,每个节点在上一层也存在的概率是0.25,采用近似平衡,搜索时,找到每一层最后一个小于目标的节点,再向下。期望时间复杂度为O(nlogn),最坏时间复杂度O(n^2),期望空间复杂度O(n),最坏时间复杂度O(nlogn)
缓存穿透
缓存穿透是指查询一个数据库中一定不存在的数据
解决办法:
缓存空对象
布隆过滤器
数据预热
限流
Redis是怎么实现分布式锁的
Redis实现分布式锁的机制主要依赖于其原子性操作和内存存储的特性。
Redis持久化机制
RDB持久化:将Redis在内存中的数据以快照的形式写入磁盘。redis默认。
触发机制:
使用SAVA或BGSAVE。
SAVE m n,m秒内发生n次修改
Redis关闭时
从节点第一次连接时
AOF持久化:将Redis在内存中的每个写命令以追加的方式写入磁盘。
always
(每次写操作都同步到磁盘)、everysec
(每秒同步一次磁盘)和no
(由操作系统决定何时同步磁盘)。当AOF文件过大时,可以通过bgrewriteaof命令进行重写,以减小文件大小。
混合持久化:首先使用RDB持久化将内存中的数据快照存储到磁盘上,然后再使用AOF持久化将所有新的写操作追加到AOF文件中。
http和https的区别
安全性:http明文,https通过TLS加密
端口:http80,https443
证书:http不需要,https需要证书确认身份以及加密通信
开销:http开销小,https需要额外开销。
https交换密钥的过程是怎么样的
在HTTPS交换密钥之前,首先需要完成TCP三次握手,以建立客户端和服务器之间的可靠连接。
客户端发送请求
服务端返回CA
客户端验证并用公钥加密随机码,发送给服务端
服务端用私钥解密,之后用这个随机码作为密钥进行对称加密。
浏览器访问一个网站,完整地描述一下这个网站访问的全过程
- 浏览器首先检查自己的缓存中是否有该域名的IP地址记录。
- 如果没有,浏览器会检查操作系统的DNS缓存。
- 如果仍未找到,操作系统会将请求发送到本地DNS服务器(通常是ISP提供的)。
- 本地DNS服务器可能会递归查询根域名服务器、顶级域名服务器和权限域名服务器,最终获取到域名的IP地址。
- 获取到IP地址后,本地DNS服务器将其返回给浏览器,同时缓存该记录以便后续使用。
浏览器通过TCP/IP协议与服务器建立连接。
浏览器封装HTTP请求报文,并通过TCP连接发送给服务器。
服务器接收并解析HTTP请求报文。生成HTTP响应报文发送给浏览器。
浏览器接收HTTP响应报文,并解析其内容。
在数据传输完成后,浏览器和服务器之间通过TCP四次挥手过程断开连接。(短连接)
TCP三次握手过程
为什么不是两次,为什么不是四次
第一次:客户端发送同步请求报文,生成随机序列号,进入SYN_SENT。
第二次:服务端发送同步确认报文,生成随机序列号,并确认客户端的序列号,进入SYN_RCVD。
第三次:客户端发送ACK报文,序列号为第一次+1,确认服务端序列号,进入ESTABLISHED。
为什么不是两次:两次会导致旧连接问题以及第二次握手丢失后一直等待。
为什么不是四次:三次已经足够确认双方通信能力以及序列号。
说一说进程和线程
进程包含了程序的代码、数据和堆栈空间,以及系统资源如文件描述符、内存等。
线程共享进程的全部资源,包括虚拟地址空间、文件描述符和信号处理等,但每个线程都有自己的调用栈、寄存器环境和线程本地存储。
调度:线程是CPU调度的基本单位,进程是资源分配的基本单位,一个进程对应一个或线程。
切换:线程上下文切换比进程上下文切换要快得多。一个进程中的多个线程共享进程的地址空间,进程切换开销小。
开销:创建或撤销进程时,系统都要为之分配或回收系统资源,如内存空间,I/O设备等,OS所付出的开销显著大于在创建或撤销线程时的开销
一个服务启动四个进程,一个请求平均耗时200ms,理论上这个服务可以承受多大qps
- 单个进程每秒可以处理的请求数:0.21=5(次/秒),因为每个请求耗时0.2秒。
- 四个进程每秒可以处理的请求数:5imes4=20(次/秒)。
算法题:
二叉树的层序遍历