一、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、聚簇索引和非聚簇索引的区别
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、消费组
分区 节点的关系