技术栈
2021-06-09 10:49:15 20 举报
AI智能生成
技术栈
作者其他创作
大纲/内容
git
运维部署
docker
Linux 的 Namespaces 对不同的容器实现了隔离
网络
Docker 服务器在主机上启动之后会创建新的虚拟网桥 docker0,随后在该主机上启动的全部服务在默认情况下都与该网桥相连
namespaces
分离进程树、网络接口、挂载点以及进程间通信等资源的方法
chroot
能够改变当前的系统根目录结构
CGroups
能够隔离宿主机器上的物理资源,例如 CPU、内存、磁盘 I/O 和网络带宽
虚拟化/kvm
ELK
web服务器
nginx
进程模型
master->workers
异步非阻塞epoll
多个子进程解决惊群
不让多个进程在同一时间监听接受连接的socket
apache
tomcat
jboss
负载均衡常用算法
轮询
加权轮询
值越大意味着该服务器的性能越好
IP 哈希
缓存
redis
持久化
AOF
执行过的写指令记录下来
每秒钟 fsync 一次
文件体积比RDB大
AOF重写
RDB
快照式
启子进程来持久化
先数据写入到一个临时文件中
定时持久化(可能导致数据丢失)
AOF/RDB可同时开启,保证
可靠
可靠
多路 I/O 复用模型,非阻塞 IO
数据类型
string
list
hash
set
zset有序集合
跳表实现
优点
采用单线程,避免了不必要的上下文切换和竞争条件
支持事务,Redis的所有操作都是原子性的,同时Redis还支持对几个操作合并后的原子性执行
支持主从复制,主机会自动将数据同步到从机,可以进行读写分离
操作
设置过期
expire key 5
过期策略
定时删除
设置键的过期时间的同时,创建定时器
惰性删除
放任过期不管,每次从键空间获取时再判断,如果过期就删除,没过期返回
定期删除
每隔一段时间,就对数据库进行一次检查
sentinel哨兵
主观下线
发送PING
客观下线
只有过半的哨兵判断 master已下线
哨兵之间通过__sentinel__频道互相发现
哨兵通过master获取slave信息
数据丢失的情况
主从同步
重新选举master
只能做到尽量少的数据丢失
四种模式
redis主从和集群区别
主从:每个redis存储的内容都是完整的数据
集群:每台存储不同的内容
集群:每台存储不同的内容
单机
主从
数据的复制是单向的,只能由主节点到从节点
哨兵
在复制的基础上,哨兵实现了自动化的故障恢复
哨兵+多个主从=集群
hash一致算法
雪崩
概念
1.数据未加载到缓存中,
2.缓存同一时间大面积的失效
2.缓存同一时间大面积的失效
解决办法
事前:redis 高可用,主从+哨兵,redis cluster,避免全盘崩溃。
事中:本地 ehcache 缓存 + hystrix 限流&降级,避免 MySQL 被打死。
事后:redis 持久化,一旦重启,自动从磁盘上加载数据,快速恢复缓存数据。
事中:本地 ehcache 缓存 + hystrix 限流&降级,避免 MySQL 被打死。
事后:redis 持久化,一旦重启,自动从磁盘上加载数据,快速恢复缓存数据。
缓存击穿
概念
1.查询一个不存在的数据
2.热点缓存数据失效,直接到数据库
2.热点缓存数据失效,直接到数据库
解决办法
每次系统 A 从数据库中只要没查到,就写一个空值到缓存里去,
比如 set -999 UNKNOWN。然后设置一个过期时间,这样的话,
下次有相同的 key 来访问的时候,在缓存失效之前,都可以直接从缓存中取数据
比如 set -999 UNKNOWN。然后设置一个过期时间,这样的话,
下次有相同的 key 来访问的时候,在缓存失效之前,都可以直接从缓存中取数据
缓存预热
缓存预热就是系统上线后,将相关的缓存数据直接加载到缓存系统
缓存并发
概念
多个redis的client同时set key引起的并发问题
解决办法
把操作放在队列中使其串行化(或者合并操作)
分布式锁
SETNX
设置超时时间,避免程序挂掉未释放锁一直无效
memcache
消息队列
kafka
java/Scala
kafka存储
topic来进行消息管理,每个topic包含多个partition,每个partition对应一个逻辑log
topic相当于消息存放目录,partition是topic物理上的分组,一个topic可分为多个partition,每个partition是一个有序的队列
producer将消息推送到broker,consumer从broker拉取消息
rabbitMQ
操作系统
语言
c/c++
指针/引用
引用必须初始化,之后不能改变指向其它变量,指针不用
不要返回一个临时变量的引用
“sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身(所指向的变量或对象的地址)的大小;
引用自增是真实值的自增,指针则是地址自增
多态
virtual
修饰成员函数,让父类指针动态能访问派生类的成员函数
修饰析构函数,析构时先调用子类析构函数->父类析构(构造相反)
虚基类,保证多重继承时只有一个基类
模版
c++11
&&右值引用
右值一般是不可寻址的常量,或在表达式求值过程中创建的无名临时对象,短暂性的
左值和右值主要的区别之一是左值可以被修改,而右值不能。
std::move()可以避免无谓的复制
可变参数模板
lambda
auto, decltype
unordered_map
实现hash_ table
智能指针
unique_ptr
shared_ptr
weak_ptr
auto_ptr废弃
结构体对齐
内联函数和宏定义
volatile
局部变量能否和全局变量重名
java
golang
interface
实现多态
goroutine
GMP模型
https://learnku.com/articles/41728
并发: 逻辑上具有处理多个同时性任务的能力。
并行: 物理上同一时刻执行多个并发任务。
并行: 物理上同一时刻执行多个并发任务。
channel
子主题
子主题
go defer
先进后出,后进先出
select
监听 IO 操作
上下文context
数据结构
数组
切片
哈希表
解决哈希碰撞
开放寻址
写入新的数据时,如果发生了冲突,就会将键值对写入到下一个索引不为空的位置
拉链法
字符串
反射
reflect.TypeOf 能获取类型信息
reflect.ValueOf 能获取数据的运行时表示
panic/recover
panic
panic 能够改变程序的控制流,调用 panic 后会立刻停止执行当前函数的剩余代码,并在当前 Goroutine 中递归执行调用方的 defer
panic 只会触发当前 Goroutine 的 defer
recover
recover 可以中止 panic 造成的程序崩溃。它是一个只能在 defer 中发挥作用的函数,在其他作用域中调用不会发挥作用;
recover 只有在 defer 中调用才会生效
同步
Mutex
WaitGroup
Once
Cond
SingleFlight
够限制对同一个键值对的多次重复请求,减少对下游的瞬时流量
redis缓存击穿
垃圾回收
标记清除
三色标记
内存屏障
让 CPU 或者编译器在执行内存相关操作时遵循特定的约束
防止cpu乱序执行,导致数据不一致
防止cpu乱序执行,导致数据不一致
volatile实现
go tool trace
记录了运行时的信息,能提供可视化的 Web 页面。
python
vuejs
vuex
状态管理
router
响应式数据原理
2.x
Object.defineProperty
3.x
Proxy
Computed和Watch
Computed本质是一个具备缓存的watcher
适用于计算比较消耗性能的计算场景
适用于计算比较消耗性能的计算场景
Watch没有缓存性,更多的是观察的作用,可以监听某些数据执行回调
v-if/v-show
v-if不会渲染DOM元素
v-show操作的是样式(display),切换当前DOM的显示和隐藏
Vue 组件 data
必须是一个函数, 每个实例可以维护一份被返回对象的独立的拷贝
js/html/css
shell
框架
python
django
flask
pyqt
爬虫
BeautifulSoup
java
springboot
springcloud
golang
beego
revel
electron
c/c++
tode/tosf
网络
协议
tcp
三次握手
四次挥手
TIME_WAIT
客户端接收到服务器端的 FIN 报文后进入此状态,此时并不是直接进入 CLOSED 状态,还需要等待一个时间计时器设置的时间 2MSL
粘包、拆包
消息定长
设置消息边界
将消息分为消息头和消息体
滑动窗口
用于网络数据传输时的流量控制,以避免拥塞的发生
本质上是描述接受方的TCP数据报缓冲区大小的数据,发送方根据这个数据来计算自己最多能发送多长的数据
拥塞控制
慢开始
拥塞避免
快重传
快恢复
udp
网络编程
IO多路复用
epoll
水平触发LT(Level Trigger)
只要这个fd还有数据可读,每次 epoll_wait都会返回它的事件,提醒用户程序去操作
边缘触发ET(Edge Trigger)
它只会提示一次,直到下次再有数据流入之前都不会再提示了,无 论fd中是否还有数据可读
epoll_create,epoll_ctl和epoll_wait
epoll没有这个限制,它所支持的FD上限是最大可以打开文件的数目
select
1024 fd限制
poll
没有最大fd限制,采用链表结构
总结
(1)select,poll实现需要自己不断轮询所有fd集合,直到设备就绪,期间可能要睡眠和唤醒多次交替。而epoll其实也需要调用epoll_wait不断轮询就绪链表,期间也可能多次睡眠和唤醒交替,但是它是设备就绪时,调用回调函数,把就绪fd放入就绪链表中,并唤醒在epoll_wait中进入睡眠的进程。虽然都要睡眠和交替,但是select和poll在“醒着”的时候要遍历整个fd集合,而epoll在“醒着”的时候只要判断一下就绪链表是否为空就行了,这节省了大量的CPU时间。这就是回调机制带来的性能提升。
(2)select,poll每次调用都要把fd集合从用户态往内核态拷贝一次,并且要把current往设备等待队列中挂一次,而epoll只要一次拷贝,而且把current往等待队列上挂也只挂一次(在epoll_wait的开始,注意这里的等待队列并不是设备等待队列,只是一个epoll内部定义的等待队列)。这也能节省不少的开销。
(2)select,poll每次调用都要把fd集合从用户态往内核态拷贝一次,并且要把current往设备等待队列中挂一次,而epoll只要一次拷贝,而且把current往等待队列上挂也只挂一次(在epoll_wait的开始,注意这里的等待队列并不是设备等待队列,只是一个epoll内部定义的等待队列)。这也能节省不少的开销。
socket
fcntl()设置阻塞和非阻塞(O_NONBLOCK)
TCP_NODELAY
禁用Nagle算法
设计模式
https://refactoringguru.cn/design-patterns
DDD
领域建模
分析
事件风暴
BC 限界上下文
设计
实现
数据库
mysql
Innodb引擎: 提供了对数据库ACID事务的支持。并且还提供了行级锁和外键的约束。
MyIASM引擎: 不提供事务的支持,也不支持行级锁和外键
MyIASM引擎: 不提供事务的支持,也不支持行级锁和外键
覆盖索引指一个查询语句的执行只用从索引中就能够取得,不必从数据表中读取。也可以称之为实现了索引覆盖。
如果一个索引包含了(或覆盖了)满足查询语句中字段与条件的数据就叫做覆盖索引
如果一个索引包含了(或覆盖了)满足查询语句中字段与条件的数据就叫做覆盖索引
MyISAM索引与InnoDB索引的区别?
最左前缀原则
连接
左连接
以左表为基准,右表补NULL
右连接
以右表为基准,左表补NULL
内连接
返回两个相关联的所有列
不支持全链接
回表查询
当所要查找的字段不在非主键索引树上时,需要通过叶子节点的主键值去主键索引上获取对应的行数据,这个过程称为回表操作。
ICP索引下推
(Mysql5.6及之后版本) 5.6分区表不能支持索引条件下推(ICP) 5.7支持
索引下推主要是减少了不必要的回表操作。对于查找出来的数据,先过滤掉不符合条件的,其余的再去主键索引树上查找
聚簇索引/非聚簇索引
聚簇索引
不是一种单独的索引类型,而是一种数据存储方式
其按照每张表的主键来构建一个B+树
在Innodb中,聚簇索引默认就是主键索引
自增主键和uuid作为主键的区别
由于主键使用的是聚簇索引,如果主键为自增id的话,其数据也是对应相邻的存放到磁盘上的,这种方式不用频繁移动磁盘,写入性能高;如果是uuid的形式的话,频繁的插入会频繁的移动磁盘,写入性能较低。
由于主键使用的是聚簇索引,如果主键为自增id的话,其数据也是对应相邻的存放到磁盘上的,这种方式不用频繁移动磁盘,写入性能高;如果是uuid的形式的话,频繁的插入会频繁的移动磁盘,写入性能较低。
非聚簇索引
聚簇索引基础上重新生成了一颗B+树。因此,每新增一个索引,其表的体积就会增加,占用的磁盘空间更大。非聚簇索引其叶子节点并非直接是真实数据,其叶子节点依旧是索引节点,其存放的值是创建非聚簇索引的字段和聚簇索引的主键(主键索引)
主键/非主键索引
主键索引在底层的数据存储是通过 B+ 树来实现,
除叶子节之外的其他节点都存储的是主键值。而叶子节点上存储的是整行的数据。
除叶子节之外的其他节点都存储的是主键值。而叶子节点上存储的是整行的数据。
除了主键索引外,其它的索引都被称为非主键索引。与主键索引不同的是,
非主键索引的叶子节点上存储的是主键的值
非主键索引的叶子节点上存储的是主键的值
索引失效的几种情况
MySQL主要提供2种方式的索引:B-Tree索引,Hash索引
B+树一个节点的大小设为一页(16k)或页的倍数最为合适
oracle
es
0 条评论
下一页