中间件
一、缓存为什么要使用缓存(一)性能如下图所示,我们在碰到需要执行耗时特别久,且结果不频繁变动的SQL,就特别适合将运行结果放入缓存。这样,后面的请求就去缓存中读取,使得请求能够迅速响应。
sequenceDiagram
participant A as 用户
participant B as 系统A
participant C as 执行SQL
A->>B:发起请求
B->>C:调用sql
C->>B:返回sql运算结果
B->>A:返回系统运行结果
Note right of C:我非常耗时,并且执行结果接下来几个小时都不会改变
(二)并发如下图所示,在大并发的情况下,所有的请求直接访问数据库,数据库会出现连接异常。这个时候,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问数据库。
flowchart LR
A(用户1)
B(用户2)
C(用户3)
D(用户...)
E(用户n)
F[系统A]
G[数据库]
H>"你们同时来这么多请求,我会挂的"]
A--发起请求-->F
B--发起请求-->F
C--发起请求-->F
D--发起请求-->F
E- ...
分布式
一、大型网站系统的特点高并发,大流量需要面对高并发用户,大流量访问。Google日均PV35亿,日IP访问数3亿;腾讯QQ的最大在线用户数1.4亿(2011年数据)。
高可用系统7×24小时不间断服务。
海量数据需要存储、管理海量数据,需要使用大量服务器。Facebook每周上传的照片数量接近10亿,百度收录的网页数目有数百亿,Google有近百万台服务器为全球用户提供服务。
用户分布广泛,网络情况复杂许多大型互联网网站都是为全球用户提供服务的,用户分布范围广,各地网络情况千差万别。在国内,还有各个运营商网络互通难的问题。
安全环境恶劣由于互联网的开放性,使得互联网网站更容易受到攻击,大型网站几乎每天都会被黑客攻击。
需求快速变更,发布频繁和传统软件版本发布频率不同,互联网产品为快速适应市场,满足用户需求,其产品发布频率极高。一般大型网站的产品每周都有新版本发布上线,中小型网站的发布更频繁,有时候一天会发布几十次。
渐进式发展几乎所有的大型互联网网站都是从一个小网站开始,渐进的发展起来的。Facebook是扎克伯格同学在哈佛大学的宿舍里开发的;Google的第一台服务器部署在斯坦 ...
字节暑期实习面经
记录暑期实习字节跳动的面试经历
一面一面时间比较长了,有些问题不记得了
自我介绍
list和数组的区别
list的查询、插入、删除的时间复杂度
http的方法
http状态码401、404
c++什么是虚函数
算法:合并两个有序数组
二面
项目经验无
算法:k个有序数组,找到有序数组中第m小的数
http的请求过程
http1.0、1.1、2.0区别
c++什么情况下出现内存泄漏
避免内存泄露的开发原则、设计模式
网络I/O模型
内存池
算法:数组的最大区间和
三面
http协议
http包的拆分
http有哪些方法
get和post的区别
cookie和session
cookie的存放位置
cookie每次http请求都会发送吗
算法1:爬楼梯(每次1,2,3步),一句话(一行代码)完成
算法2:找到链表中环的入口节点(推导这个算法,证明正确性)
数据库索引,b+树,b树,红黑树,为什么用b+树
网络I/O
学习网络I/O模型
阻塞式I/O非阻塞式I/OI/O多路复用信号驱动式I/O异步I/O
C/C++
记录c++一些基础知识和面试常考点
语言基础
C++三大特性:封装、继承、多态
C++可复用性高,引入了模板的概念
struct和class区别
struct一般用于描述一个数据结构集合,class是对一个数据对象的封装
struct中的默认访问控制权限是public,class中默认访问控制权限是private
在继承关系中,struct默认公有继承,class默认私有继承
公有继承:公有继承时,对基类的公有成员和保护成员的访问属性不变,派生类的新增成员可以访问基类的公有成员和保护成员访问不了私有成员。派生类的对象只能访问派生类的公有成员
私有继承:基类的公有成员和保护成员都被派生类继承下来变成私有成员,派生类的新增成员可以访问基类的公有成员和保护成员,访问不了积累的私有成员。派生类的对象不能访问基类的任何成员
c++编译过程
预编译
编译
汇编
链接
预编译
删除所有的#define,展开所有的宏定义
处理所有的条件预编译指令,如#if、#ifndef
处理#include预编译指令,将被包含的文件插入到预编译指令的位置
过滤所有的注释
添加行号和文件名标识
编译 ...
LeetCode 146.LRU缓存
传送门
设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。实现 LRUCache 类:
LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存
int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。
void put(int key, int value)如果关键字key 已经存在,则变更其数据值value ;如果不存在,则向缓存中插入该组key-value 。如果插入操作导致关键字数量超过capacity ,则应该 逐出 最久未使用的关键字。
函数 get 和 put 必须以 O(1) 的平均时间复杂度运行。
代码12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485class LRUCach ...
数据库
事务ACID
原子性:事务被视为不可分割的最小单元,事物的全部操作要么全部提交,要么全部失败
一致性:数据库在事务执行的前后都保持一致状态。在一致状态下,不同事务对同一个数据的读取结果是相同的
隔离性:一个事务所做的修改在提交前,对其它事务是不可见的
持续性:事务对数据库的修改是永久的
并发一致性问题
丢失修改
脏读
不可重复读
幻读
封锁粒度表级、行级
互斥锁(X锁,写锁)
共享锁(S锁,读锁)
兼容关系
X
S
X
N
N
S
N
Y
三级封锁协议
一级封锁协议:事务在修改数据前需要加X锁,事务结束后释放
可以解决丢失修改的问题
二级封锁协议:在一级封锁协议的基础上,数据在读取数据时要为其加S锁,读取完之后释放
可以解决脏读问题
三级封锁协议:在二级封锁协议的基础上,事务在读取数据前要为其添加S锁,事务完成后释放S锁
可以解决不可重复读问题
两端锁协议事务的加锁和解锁分两个阶段进行
隔离级别隔离级别能够解决的问题
脏读
不可重复读
幻读
未提交读
×
×
×
读提交
√
×
×
可重复读
√
√
×
可串行化 ...
网络原理
概述ISP互联网服务提供者ISP,又称互联网服务提供商
电路交换建立连接、通话、释放连接
特点
在通话的全部时间内,通话的两个用户始终占用端到端的通信资源
线路传输效率低
分组交换存储转发
优点高效、灵活、迅速、可靠
计算机网络的性能指标
速率:数据的传输速率,bit/s(bps),也称为数据率
带宽:1、信号具有的频带宽度,单位赫兹;2、单位时间内网络中某信道所能通过的“最高数据率”,单位bit/s
吞吐量:单位时间内通过某个网络的实际数据量
时延:数据从网络的一端传送到另一端所需的时间。也成为延迟或迟延
发送时延主机或路由器发送数据帧所需要的时间,也称传输时延发送时延=数据帧长度(bit)/发送速率(bit/s)
传播时延电磁波在信道中传播一定距离需要花费的时间传播时延=信道长度(m)/电磁波在信道上的传播速率(m/s)
处理时延主机或路由器在收到分组时需要花费一定时间进行处理
排队时延分组进入路由器后要先在输入队列中排队等待处理,路由器确定转发接口后,还要在输出队列中排队等待转发
计算机网络 ...
操作系统
进程的描述与控制内核态与用户态什么时候进入内核态:系统调用、异常、中断
为什么要有线程在不引入线程概念的操作系统中,进程是资源分配和独立调度的单位。进程的创建、撤销和切换需要较大的时空开销,因此系统中进程的数量和进程切换的频率受到限制,影响系统并发性的提高。引入线程作为独立调度和分派的单位,不独立占有资源,而是与其他线程共享统一进程的资源,减小了系统的时空开销
进程和线程的区别
进程是资源分配的基本单位,线程是独立调度的基本单位
地址空间资源:不同进程的地址空间是相互独立的;同一进程的不同线程共享同一地址空间
通信:进程的通信需要使用操作系统提供的进程间通信机制;同一进程的不同线程可以通过读写全部变量通信
系统开销:创建和撤销进程时,需要系统为之分配和回收资源,操作系统付出的开销远大于创建和撤销线程时的开销。进程切换时,涉及到整个当前进程的CPU环境的保存的新的CPU环境的设置;切换线程时,只需保存和设置少量寄存器的内容,开销很小
孤儿进程一个父进程退出后,它的一个或多个子进程还在运行,那么这些子进程将成为孤儿进程,孤儿进程将被init进程收养
进程中断的过程
保护现场,保护中 ...
珂学上网
记录珂学上网的一些方法,主要是使用vps搭建珂学上网服务。
环境:vultr购买vps,系统centos7。
Shadowsocks首先安装shadowsocks所需工具,在终端中输入以下指令
12345yum update -yyum install wget -yyum install gcc -yyum install make -yyum install python36 -y
接下来下载shadowsocks
1wget --no-check-certificate -O shadowsocks.sh https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks.sh
配置安装shadowsocks
12chmod +x shadowsocks.sh./shadowsocks.sh 2>&1 | tee shadowsocks.log
根据提示设置端口密码等。
v2ray直接傻瓜式安装,执行指令
1bash <(curl -s -L https://g ...