- Redis
- 1、如何使用Redis实现秒级接口限流
- 2、redis常用命令
- string:
- hash:
- list:
- set:
- zset:
- 计算机基础
- 1、tcpdump抓包 (ack,ip)
- 2、常用Linux命令
- 3、ping的原理
- 4、rpc、tcp相关知识
- 传输协议
- 传输效率
- 性能消耗,主要在于序列化和反序列化的耗时
- 负载均衡
- 服务治理(下游服务新增,重启,下线时如何不影响上游调用者)
- 5、SSL握手过程
- 6、协程的原理
- 7、strace ltrace 区别
- 8、nohup & 区别
- 9、Nagle算法
- C++
- 1、智能指针及底层实现
- 2、参数入栈顺序
- 3、系统调用和函数调用的区别
- 系统调用
- 函数调用
- 4、空类大小
- 5、Stl容器底层数据结构
- 6、vector扩容
- 其他
- 如何排查问题,如果进行性能优化
Redis 实现限流的三种方式
- 基于Redis的setnx的操作(分布式锁实现)
- 第二种:基于Redis的数据结构zset
- 第三种:基于Redis的令牌桶算法
get/set、mget/mset、incr、strlen key、append key value 、getset key value、getrange key start end
hash:hset key field value、hget key field、hdel key field、hlen key、Hmget key field[field …]、Hmset key field value [field value]、hexists key field、hkeys key、hvals key、hgetall key、hstrlen key field
list:rpush key value、lpush key value、linsert key before|after pivot value、lrange key start end、lindex key index、llen key、rpop key、lpop key、lrem key count value、lset key index newValue、blpop key [key …] timeout、brpop key [key …] timeout、
set:sadd key element、srem key element、Scard key scard、Sismember key element 、Srandmember key、Spop key、Smembers key
zset:zadd key score member、zcard key scard、zsore key member、zrank key member、zrem key member、zincrby key increment member、zrange key start end、zrevrange key start end、zrange key min max、zrevrange key max min、zcount key min max、zremrangebyrank key start end、zremrangebystore key min max
计算机基础 1、tcpdump抓包 (ack,ip)tcpdump -i eth0 dst port 80 -c 1000 | awk -F “.” ‘{print $1".“$2”.“$3”."$4}’ | sort | uniq -c
2、常用Linux命令cd、mkdir、rm、ls、ln、cp;chmod、chown、chgrp;
kill、top、ps、sudo、su、awk、sort、uniq
history、man、help、grep、ifconfig
netstat:用于显示网络连接、路由表和网络接口信息
uptime:用于查看系统的负载信息
ping是一种计算机网络工具,用来测试数据包能否透过IP协议到达特定主机。ping的运作原理是向目标主机传出一个ICMP echo@要求数据包,并等待接收echo回应数据包。程序会按时间和成功响应的次数估算丢失数据包率(丢包率)和数据包往返时间(网络时延,Round-trip delay time)。
地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。
RPC,可以基于TCP协议,也可以基于HTTP协议
HTTP,基于HTTP协议
RPC,使用自定义的TCP协议,可以让请求报文体积更小,或者使用HTTP2协议,也可以很好的减少报文的体积,提高传输效率
HTTP,如果是基于HTTP1.1的协议,请求中会包含很多无用的内容,如果是基于HTTP2.0,那么简单的封装以下是可以作为一个RPC来使用的,这时标准RPC框架更多的是服务治理
RPC,可以基于thrift实现高效的二进制传输
HTTP,大部分是通过json来实现的,字节大小和序列化耗时都比thrift要更消耗性能
RPC,基本都自带了负载均衡策略
HTTP,需要配置Nginx,HAProxy来实现
RPC,能做到自动通知,不影响上游
HTTP,需要事先通知,修改Nginx/HAProxy配置
第一步,Client给出协议版本号、一个客户端生成的随机数(Client random),以及客户端支持的加密方法。
第二步,Server确认双方使用的加密方法,并给出数字证书、以及一个服务器生成的随机数(Server random)。
第三步,Client确认数字证书有效,然后生成一个新的随机数(Premaster secret),并使用数字证书中的公钥,加密这个随机数,发给Server。
第四步,Server使用自己的私钥,获取Client发来的随机数(即Premaster secret)。
第五步,Client和Server根据约定的加密方法,使用前面的三个随机数,生成"对话密钥"(session key),用来加密接下来的整个对话过程。
协同程序(coroutine)与多线程情况下的线程比较类似:有自己的堆栈,自己的局部变量,有自己的指令指针(IP,instruction pointer),但与其它协同程序共享全局变量等很多信息。
协程(协同程序): 同一时间只能执行某个协程。开辟多个协程开销不大。协程适合对某任务进行分时处理。
线程: 同一时间可以同时执行多个线程。开辟多条线程开销很大。线程适合多任务同时处理。
1.协程,即协作式程序,其思想是,一系列互相依赖的协程间依次使用CPU,每次只有一个协程工作,而其他协程处于休眠状态。协程实际上是在一个线程中,只不过每个协程对CPU进行分时,协程可以访问和使用unity的所有方法和component
2.线程,多线程是阻塞式的,每个IO都必须开启一个新的线程,但是对于多CPU的系统应该使用thread,尤其是有大量数据运算的时刻,但是IO密集型就不适合;而且thread中不能操作unity的很多方法和component
线程和协同程序的主要不同在于:在多处理器情况下,从概念上来讲多线程程序同时运行多个线程;而协同程序是通过协作来完成,在任一指定时刻只有一个协同程序在运行,并且这个正在运行的协同程序只在必要时才会被挂起。
7、strace ltrace 区别strace常用来跟踪进程执行时的系统调用和所接收的信号。 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通 过系统调用访问硬件设备。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。
strace —— Trace system calls and signals。 跟踪进程的系统调用或信号产生的情况。
ltrace —— A library call tracer。 跟踪进程调用库函数的情况。
nohup指后台不间断运行,&指后台运行会随ssh链接断开退出。
可以用两个命令结合nohup command &
Nagle算法要求在网络中只能存在唯一的没有被确认的小段报文段。这就是说,如果已经发送了一个小报文段,在没有收到接收端对它的确认报文前,不能发送其他的小分组或小报文段。也就是说网路中某一个时刻只存在一个报文数据在传递。同时,发送端也会继续收集这些小分组,等收到上一个确认报文后,再将收集到的小分组组装成一个分组发送出去。这样做能减少网络中小分组数量,较少网络拥塞。并且接收端发送确认报文速度越快,接收端发送下个分组也越快。相比禁用Nagle算法的连接,启用Nagle算法的连接发送报文数量少,但总通信时间更长。
缺点:对于实时性要求很高的系统,Nagle算法不适合。因为Nagle算法在某一个时刻只有一个报文在传输,会导致数据传递的不够及时。
通常情况下c/c++默认入栈方式:__cdel,也就是以右到左将参数压入堆栈
c/c++参数入栈顺序和参数计算顺序
- 使用INT和IRET指令,内核和应用程序使用的是不同的堆栈,因此存在堆栈的切换,从用户态切换到内核态,从而可以使用特权指令操控设备
- 依赖于内核,不保证移植性
- 在用户空间和内核上下文环境间切换,开销较大
- 是操作系统的一个入口点
1.使用CALL和RET指令,调用时没有堆栈切换
2.平台移植性好
3.属于过程调用,调用开销较小
4.一个普通功能函数的调用
是为了区分空类定义出来的不同对象,空类同样可以被实例化,每个实例在内存中都有一个独一无二的地址,编译器给一个空类隐含的加一个字节,这样空类在实例化后在内存就可以得到独一无二的地址,所以空类所占的内存大小是1个字节。
5、Stl容器底层数据结构1)vector 底层数据结构为数组 ,支持快速随机访问
2)list 底层数据结构为双向链表,支持快速增删
3)deque 底层数据结构为一个中央控制器和多个缓冲区,详细见STL源码剖析P146,支持首尾(中间不能)快速增删,也支持随机访问
4)stack 底层一般用list或deque实现,封闭头部即可,不用vector的原因应该是容量大小有限制,扩容耗时
5)queue 底层一般用list或deque实现,封闭头部即可,不用vector的原因应该是容量大小有限制,扩容耗时
(stack和queue其实是适配器,而不叫容器,因为是对容器的再封装)
6)priority_queue 的底层数据结构一般为vector为底层容器,堆heap为处理规则来管理底层容器实现
7)set 底层数据结构为红黑树,有序,不重复
8)multiset 底层数据结构为红黑树,有序,可重复
9)map 底层数据结构为红黑树,有序,不重复
10)multimap 底层数据结构为红黑树,有序,可重复
11)hash_set 底层数据结构为hash表,无序,不重复
12)hash_multiset 底层数据结构为hash表,无序,可重复
13)hash_map 底层数据结构为hash表,无序,不重复
14)hash_multimap 底层数据结构为hash表,无序,可重复
1)重新申请空间;2)数据移动;3)原空间释放
其他 如何排查问题,如果进行性能优化总结篇:性能问题分析及优化的一般方法,工具速查



