一、Redis

1、特性

** 速度快**

redis所有数据结构是放在内存中的

Redis是C语言实现的

Redis使用了单线程架构

**基于键值对的数据结构服务器**

REmote Dictionary Server

**丰富的功能**

键过期

发布订阅

支持Lua脚本

简单的事务功能

流水线

**简单稳定**

代码少

Redis使用单线程模型

Redis不依赖操作系统的类库

**客户端语言多**

Java

PHP

Python

C

C++

Nodejs

**持久化**

RDB

AOF

**主从复制**

**高可用和分布式**

2、使用场景

缓存

键过期

排行榜系统

有序集合

计数器应用

单线程、字符串

社交网络

集合

消息队列系统

发布订阅、阻塞功能

##2、数据类型

* 字符串

应用场景:缓存功能、计数、共享session、限速

* 列表

应用场景:消息队列、文章列表

* 哈希

应用场景:缓存

* 集合

应用场景:标签

* 有序集合

* 排行榜系统 

* 位图

* HyperLogLog

* GEO

3、持久化方式

AOF

追加写命令到文件实现持久化

优点:实时持久化

缺点:AOF文件体积过大,需要定期执行重写操作来降低提交

应用场景:实时持久化

RDB

RDB使用一次性生成内存快照的方式持久化

优点:生成的文件紧凑压缩比更高,读取RDB恢复速度更快

缺点:生成RDB开销较大,无法做到实时持久化

应用场景:数据冷备和复制传输

4、集群

cluster

虚拟槽分区:0 ~ 16383

特点:

* 解耦数据和节点之间的关系,简化了节点扩容和缩容的难度

* 节点自身维护槽的映射关系,不需要客户端或者代理维护槽分区元数据

* 支持节点、槽、键之间的映射查询,用于数据路由、在线伸缩等业务

5、高可用

主备

哨兵

6、版本

6.2.11

二、MySQL

1、InnoDB和MyISAM的区别

1)InnoDB支持事务,MyISAM不支持,这一点是非常之重要。事务是一种高级的处理方式,如在一些列增删改中只要哪个出错还可以回滚还原,而MyISAM就不可以了。

 2)MyISAM适合查询以及插入为主的应用,InnoDB适合频繁修改以及涉及到安全性较高的应用

 3)InnoDB支持外键,MyISAM不支持

 4)从MySQL5.5.5以后,InnoDB是默认引擎 

5)InnoDB不支持FULLTEXT类型的索引 

6)InnoDB中不保存表的行数,如select count() from table时,InnoDB需要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count()语句包含where条件时MyISAM也需要扫描整个表 

7)对于自增长的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中可以和其他字段一起建立联合索引 

8)清空整个表时,InnoDB是一行一行的删除,效率非常慢。MyISAM则会重建表 

9)InnoDB支持行锁(某些情况下还是锁整表,如 update table set a=1 where user like ‘%lee%’。

2、数据库事务隔离级别

事务基本要素

1、原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。

2、一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。

3、隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。

4、持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。

事务并发的问题

1、脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据

2、不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。

3、幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。

小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表

MySQL事务的隔离级别

事务隔离级别脏读不可重复读幻读
读未提交(read-uncommitted)
不可重复读(read-committed)
可重复读(repeatable-read)
串行化(serializable)

mysql默认的事务隔离级别为repeatable-read

3、索引类型

问题1:mysql索引类型normal,unique,full text的区别是什么?

normal:表示普通索引

unique:表示唯一的,不允许重复的索引,如果该字段信息保证不会重复例如身份证号用作索引时,可设置为unique

full textl: 表示 全文搜索的索引。 FULLTEXT 用于搜索很长一篇文章的时候,效果最好。用在比较短的文本,如果就一两行字的,普通的 INDEX 也可以。

总结,索引的类别由建立索引的字段内容特性来决定,通常normal最常见。

问题2:在实际操作过程中,应该选取表中哪些字段作为索引?

为了使索引的使用效率更高,在创建索引时,必须考虑在哪些字段上创建索引和创建什么类型的索引,有7大原则:

1.选择唯一性索引

2.为经常需要排序、分组和联合操作的字段建立索引

3.为常作为查询条件的字段建立索引

4.限制索引的数目

5.尽量使用数据量少的索引

6.尽量使用前缀来索引

7.删除不再使用或者很少使用的索引

4、聚簇索引和非聚簇索引的区别

https://blog.csdn.net/sc9018181134/article/details/104885076

5、表级锁和行级锁的

InnoDB 行级锁是通过给索引上的索引项加锁来实现的,所以,只有通过索引条件检索的数据,InnoDB 才会使用行级锁。否则,使用表级锁。总结下来:不通过索引条件查询时,InnoDB 一定会使用表锁,而不是行锁(因为没有索引只能全表扫描)
	查询时,不论是使用主键索引、唯一索引或者普通的索引,InnoDB 都会使用行锁来对数据加锁
对于第二条,在有些特殊情况下是不成立的。例如,对于数据量很少的表,MySQL 会认为全表扫描更快,此时,即使使用索引字段查询,InnoDB 也会使用表锁,而不是行锁。因此,如果想确定当前使用的是哪一种锁,检查下 SQL 的执行计划(EXPLAIN),确认是否在查询时使用了索引。

版本

5.6.51

三、Nginx

1、应用场景

Web服务器

负载均衡

反向代理

2、Upstream 

重试机制

“`

upstream youlishipin {

    server 127.0.0.1:9066 max_fails=1 fail_timeout=30s;

    server 127.0.0.1:9055 max_fails=1 fail_timeout=30s backup;

    keepalive 64;

}

“`

url匹配

匹配的优先级顺序

(localtion =) > (localtion完整url) > (localtion ^~) > (localtion ~,~*) > (lcoaltion部分起始路径) > (/)

= 表示精确匹配

^~ 表示指定的路径开头

~ 表示区分大小写的正则匹配

~*表示不区分大小写的正则匹配

/ 通用匹配,所有的URL都是以此为开头

3、重写

rewrite

4、变量

$http_var

5、版本

nginx version: nginx/1.20.1

6、全局参数

worker_processes

worker_cpu_affinity

events

use epoll

worker_connections

http

sendfile on;

keepalive_timeout 60;

keepalive_requests 10000;

gzip on;

log_format

location

proxy_set_header Upgrade $http_upgrade;

proxy_set_header Connection “”;

proxy_http_version 1.1;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_set_header Host $host;

proxy_pass http://app;

7、防盗链

“`

Nginx可以很好的做这个工作,先介绍防盗链的nginx location配置:

location ~* \.(jpg)$ {

    root        html;

    valid_referers   192.168.42.135;

    if ($invalid_referer){

        rewrite ^/   http://192.168.42.135/images/loading.png;

    }

}

“`

8、nginx快的原因

多进程 Master/Worker架构

异步非阻塞方式(IO多路复用epoll)

9、499 502 504状态码的区别

499客户端超时

502 tcp无法连接

504 网关超时

10、nginx并发限制

“`

http:
##zone=one或allips 表示设置名为"one"或"allips"的存储区,大小为10兆字节
##rate=2r/s 允许1秒钟不超过2个请求
limit_conn_log_level error;
limit_conn_status 503; 
limit_conn_zone $binary_remote_addr zone=one:10m;
limit_conn_zone $server_name zone=perserver:10m;
limit_req_zone $binary_remote_addr zone=allips:100m rate=2r/s;  

server:
##burst=5 表示最大延迟请求数量不大于5。如果过多的请求被限制延迟是不需要的,这时需要使用nodelay参数,服务器会立刻返回503状态码。
limit_conn  one  100;   ##表示最大并发连接数100                                          
limit_conn perserver 1000; 
limit_req   zone=allips  burst=5  nodelay; 

参数解释:
$binary_remote_addr限制同一客户端ip地址;
$server_name限制同一server最大并发数;
limit_conn为限制并发连接数;
limit_rate为限制下载速度;
```

11、keepalive keepalive- timeout keepalive- request知识

12、负载均衡方式

* 轮询

* 权重weight

* ip_hash

四、LVS

1、分类

DLVS

五、Zookeeper

1、协议

ZAB协议

六、Kafka

1、生产者

分区 节点关系

2、消费组

分区 节点的关系

七、Rocketmq