一、Redis 相关
Redis 请求变慢的判断以及原因排查
首先,慢是一个相对的概念,要根据机器都常规延迟和当下延迟做比较如果是常规延迟的两倍就可以认为变慢了,如果不使用相对只延迟可能有机器差异。
原因 1 可能是因为慢查询或者大量 key 过期导致的清空过期 key 的连续操作,慢查询问题可以通过优化查询方法解决。
对于大量 key 同时失效的问题可以在设置过期时间都时候增加一个随机值来解决,增加随机性。
原因 2 可能是因为文件系统,虽然 AOF 是由后台线程操作,但是如果频繁 AOF 后台进程阻塞也会导致问题,或者因为使用了同步的写 AOF,或者导致 AOF 频繁重写,如果业务可以接受可以降低写 AOF 的频率。
原因 3 可能是因为操作系统的内存频繁的换入换出,swap,因为 Redis 是内存数据库,所以一定是受 swap 影响的。
二、项目相关
1.定时器的实现(cpp webserver)
定时器通过双向的升序链表实现,按照过期时间从最近到之后去排序,然后向内核注册一个每五秒的信号,处理操作是写一个缓冲区触发 epoll 的 EPOLLIN 事件,然后主线程去链表逐个清除过期的连接。
2.关于注册 epollout
这个解决的是大文件在发送的过程中不能一次发完,因为 socket 的缓冲区有限限制了,首先要记录每次发送的文件的偏移位置,避免不能继续发送,其次是注册写事件之后可写的时候继续发送。
用这种方法可以解决不能一次发送完成的大的资源。
三、cpp 相关
1.左值和右值的区别
左值是有身份、可以取地址的;右值不能取地址。左值不能被移动,右值可能即将被移动。
2.移动和赋值的区别。
赋值是把原对象复制一份,放在当前的位置。而移动是直接交接它的空间,原对象有效,但是不能确保其状态。
3.虚析构函数的意义。
虚析构函数可以在使用父类的指针或者引用指向堆上的子类对象,然后用父类的指针释放空间的时候。可以调用正确的虚析构函数。
总结 Redis 的排查这个感觉像是会面试问到的类型,因为很全面的问题而且排查问题也是常用场景。