![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c++
蜗牛^^O^
这个作者很懒,什么都没留下…
展开
-
vector和map迭代器删除
vector和map迭代器删除原创 2023-02-14 20:46:39 · 357 阅读 · 0 评论 -
一致性hash
普通的hash函数是和机器个数n相关的。hash(val)=key,得到key之后,key%n就找到对应的机器。但是如果机器个数变化就会导致大量的数据迁移。一致性hash算法通过一个叫作一致性hash环的数据结构实现。这个环的起点是0,终点是2^32 - 1,并且起点与终点连接,环的中间的整数按逆时针分布,故这个环的整数分布范围是[0, 2^32-1],如下图所示:假设现在我们有4个对象,分别为o1,o2,o3,o4,使用hash函数计算这4个对象的hash值(范围为0 ~ 2^32-1):hash原创 2021-09-22 15:49:18 · 195 阅读 · 0 评论 -
统计日志ip top50
cat log.log |awk -F ‘{print $2}’ | sort | uniq -c |sort | -n limit 50原创 2021-09-18 12:46:31 · 105 阅读 · 0 评论 -
未解决的算法题
vector={100,400,500,700};map<int,int> 里面有数据 <50,1>,<70,2>,<450,4>,map的第二个字段表示这个第一个字段的数据希望插入vector的指定位置。要求O(N)时间复杂度直接往vector里insert会导致vector后面的数据移动,时间复杂度是O(N*M);有没有其他方法。...原创 2021-09-17 10:22:10 · 101 阅读 · 0 评论 -
es底层如何存储上百亿网页文档
,原创 2021-09-17 10:18:08 · 325 阅读 · 0 评论 -
mysql的锁
一、从属性分共享锁(读锁)在一个事务中,对数据加上读锁之后,其他事物只能加读锁,不能加写锁。排它锁(写锁)在一个事务中,对数据加写锁后,其他事物不能加任何锁。二、从粒度分表锁,行锁,页锁(BDB引擎独有),记录锁,间隙锁,临键锁三、从锁的状态分意向共享锁,意向排他锁...原创 2021-09-11 16:53:14 · 210 阅读 · 0 评论 -
内存碎片与malloc
linux提供了brk,sbrk系统调用来申请释放内存。linux系统通过一个指针来管理内存,如图所示堆区向上生长,使用一个指针指向堆顶。每次申请内存,使用系统调用把brk指针向上移动,释放内存就把brk指针向下移动。但是如果不想释放data2直接释放data1,这是做不到的。不需要的数据data1,必须等上面的数据都释放后才能释放。不需要的内存无法归还给操作系统,这就是内存碎片。1、malloc优化malloc函数会直接从linux内核申请一大块内存,供程序员使用,malloc内部进行内存的维护原创 2021-09-08 16:52:51 · 351 阅读 · 0 评论 -
正排索引与倒排索引
1、正排索引正排索引就是以文档id为key,文档的所有分词和所有特征为val做的数据库。2、倒排索引倒排索引就是以每个分词为key,文档id为val做的数据库。原创 2021-09-03 15:35:39 · 181 阅读 · 0 评论 -
360搜索引擎架构
1、首先根据请求使用分词器进行分词。2、根据每个分词使用倒排索引得到包含这个分词的文档集合。3、所有分词的文档集合进行求交集,得到doclist。4、原创 2021-09-03 15:33:01 · 178 阅读 · 0 评论 -
聚簇索引和非聚簇索引
1、聚簇索引按照主键来建的索引一定是聚簇索引,其他列也可以建聚簇索引。索引和数据一起构建索引,非叶子结点保存key,叶子结点保存行数据。2、非聚簇索引(辅助索引)数据与索引分开存储,叶子结点保存了行数据的主键。拿到主键之后再去聚簇索引查找得到行数据。使用聚集索引可以减少访问磁盘的次数。因为聚集索引的叶子结点保存了行数据,每次访问磁盘不只是把对应的行数据加载进内存,而是一块包含了多行(连续主键)数据加载进内存。如果没有聚簇索引,非聚簇索引的叶子结点直接保存行数据在磁盘位置。每次查找都需要去磁盘原创 2021-09-01 17:03:19 · 648 阅读 · 0 评论 -
零拷贝技术
在网络传输文件时,涉及到大量的io操作。发送端:read函数读取文件到用户缓冲区,先把文件从磁盘拷贝到linux内核(DMA来完成,不占用cpu),再从linux内核拷贝到用户缓冲区(cpu来完成),涉及到了两次数据拷贝。然后把用户缓存区数据使用send发送,cpu把用户区数据拷贝到linux内核,再把数据从linux内核拷贝到socket缓冲区,DMA再把linux内核中的数据拷贝到网卡。总共需要五次拷贝才能把磁盘文件发送出去。解决办法:一、使用mmap函数而不是用read,DMA把文件拷贝到原创 2021-08-31 19:43:29 · 203 阅读 · 0 评论 -
O(n)时间复杂度排序
长度为n的数据num进行排序使用数组count[n+1];保存每个数据出现的次数;然后从左到右遍历count即可原创 2021-08-31 18:34:01 · 151 阅读 · 0 评论 -
B站一面。。。
1、限流算法2、如果使用nginx多服务器,断点续传,如何让客户端连接已经保存了对应临时文件的服务器。3、内存分段和分页,内存碎片有什么区别4、原创 2021-08-25 15:07:34 · 67 阅读 · 0 评论 -
美团一面面经
1、多个索引列,如何建B+树2、手撕lru3、原创 2021-08-18 15:44:35 · 62 阅读 · 0 评论 -
奇安信二面
1、字节对齐除了可以减少访问内存次数,加快效率,还有什么优点。2、内存分区的优点。3、time_wait发生在c还是s,除了修改配置文件,修改time_wait时间,还有什么办法。原创 2021-08-17 16:53:20 · 512 阅读 · 1 评论 -
mysql并发与事务隔离级别
多线程同时操作mysql肯定会涉及到安全问题。使用读写锁来保证线程安全。事务只是把一组sql命令打包成一个,原子性操作。事务执行过程中一直在操作mysql,最后进行提交,如果没有提交则会进行回滚,恢复到执行之前的数据。但是还会有事务并发问题。也就是说会有很多事务同时在进行。如果不加锁来进行互斥,事务的并发会带来以下问题。脏读问题一个事务A执行完之后,还没有提交,另一个事务B或线程读到了新数据。然后事务没有提交,数据库回滚。事务B读到的就是脏数据,无效的数据。不可重复读问题事务A先查询了,然后其他原创 2021-07-28 17:35:13 · 300 阅读 · 0 评论 -
du和df
linux 删除文件只是会从文件系统中摘除,文件并不一定会被清理。如果有其他进程正在访问这个文件,就算删除这个文件,也只是文件系统不可见了,这个文件还存在磁盘上,等所有进程都不在访问此文件,linux内核才会清理。du查看磁盘使用情况(只能看到文件系统中的文件),已经删除了的但还没有清理的文件是看不到的。df可以查看磁盘上的所有文件,包括未删除,和已经删除但是被其他进程占用没有被清理的文件。...原创 2021-07-23 12:33:27 · 63 阅读 · 0 评论 -
速盘项目(speed盘)
1、客户端与服务器连接成功后,都执行相同的业务逻辑,(任务队列中的任务都是相同的)。首先判断是什么请求。如果是登录请求,查询mysql,查询在线用户set集合,如果此用户已经在线了,返回客户端已经异地登录关闭连接。防止多机同时登录。如果是上传下载文件请求,客户端传给服务器自己的user对象,服务器判断set集合有没有这个用户,是否在线,如果不在线,认为此请求是网络攻击。如果此用户已经在线,此请求合法,客户端查询本地文件如果存在此文件名,则进行断点续传,否则进行文件上传。2、为什么要保持长连接?因.原创 2021-07-22 18:18:18 · 268 阅读 · 0 评论 -
内存泄漏如何排查
一、使用mtrace工具程序引入mcheck头文件#include<mcheck.h>在程序入口第一行调用mtrace()函数,函数会监控之后申请堆区资源,写到/home/root下的trace.log日志。然后将执行文件compile-run和trace.log放在linux系统的同一路径下;再使用命令mtrace compile-run trace.log 就可以显示没有释放的内存地址(addr)、大小(size)和调用者(caller);...原创 2021-07-22 12:23:20 · 226 阅读 · 0 评论 -
成员变量的初始化顺序
构造函数中,成员变量的初始化顺序,与构造函数内部谁先执行无关,初始化顺序与变量的定义顺序一样。原创 2021-07-21 19:14:26 · 154 阅读 · 0 评论 -
redis
ww原创 2021-07-17 13:16:43 · 687 阅读 · 0 评论 -
mysql集群读写分离与数据一致性
类似于redis集群,mysql也可以搭建集群与分布式。一主多从mysql,主机只进行修改插入操作(写操作),丛机只进行查询操作(读操作),读写分离来提高并发量。主从复制过程:主机mysql进行写操作时,会把操作命令写入binlog日志文件中。当主机进行了写操作,会立即将binlog日志文件发送给所有丛机丛机接受到binlog文件,读取命令,完成数据修改。数据一致性问题:(1)主机在向丛机发送binlog日志文件之前宕机了,丛机没有接受到完成的binlog日志文件,造成主机和丛机数据不一致原创 2021-07-17 11:27:31 · 481 阅读 · 0 评论 -
进程线程上下文切换
暂停当前进程执行流程,将各个寄存器内容存到内存中;从内存中取出下一个将要执行的进程的上下文,存进各个寄存器中;返回程序计数器记录的指令地址,用于恢复进程执行。原创 2021-07-07 14:29:09 · 134 阅读 · 0 评论 -
Hadoop架构
hadoop包括三部分HDFS文件分布式存储MapReduceYARNHDFS原理管家节点NameNode(只有一个namenode节点)用来保存各个节点的存储情况,以及所有文件的文件路径(文件树),而且保存日志。有点类似于fastdfs的tracker节点。但是如果namenode宕机,HDFS就无法提供服务,fastdfs是有很多的tracker平等地位。HDFS是还有SecondaryNode对NameNode进行备份。存储节点datanode负责保存文件,需要不断的与namenod原创 2021-07-05 16:20:04 · 82 阅读 · 0 评论 -
fastdfs架构
1、fastdfs集群分为tracker集群和storage集群。2、tracker集群中所有tracker地位平等,功能相同。负责管理所有的storage节点,类似于注册中心,记录storage节点服务器的存储空间,状态,负载等。3、storage节点负责保存文件。所有的storage节点分为不同的组,不同组的storage保存不同的内容,实现纵向扩容。同一个组的所有storage节点都保存相同的内容,实现横向扩容(备份),同一个组下的所有storage节点地位平等,没有主从之分。4、客户端先访问t原创 2021-07-03 15:38:39 · 276 阅读 · 0 评论 -
构造与析构与继承
类如果没有写构造函数,都有一个默认构造函数(无 参数),如果有有参构造,就必须写无参构造,就没有默认构造函数了。创建子类对象会先调用父类的无参构造函数,在调用子类对应的构造函数。销毁子类对象,会先调用子类的析构函数,再调用父类的析构函数。但是如果使用父类指针指向子类对象,delete父类指针,只会调用父类的析构函数。因此要把父类的析构函数设置为虚函数。子类继承了父类,把析构函数地址设置为子类自己析构函数的地址。...原创 2021-06-25 12:32:27 · 345 阅读 · 0 评论 -
c++ 指针后移
int a=10;int *p=&a;cout<<++p<<endl;若a的地址为100,p++之后,p不是指向101,而是104(32位系统),108(64位系统)。对指针后移++,默认是对类型++后移,指针加上类型的长度原创 2021-06-25 10:53:08 · 1998 阅读 · 0 评论 -
static
隐藏全局变量,全局函数多cpp文件编译,每个文件中的全局变量,全局函数对于其他文件都是可以使用的。如果加上static关键字,全局变量和全局函数仅对本文件可见,其他文件不可使用。改变生命周期加了static的变量生命周期为整个程序运行。...原创 2021-06-24 12:23:19 · 59 阅读 · 0 评论 -
对称加密和非对称加密
1、对称加密服务器和客户端有相同的一个密钥。通过这个密钥来加密和解密。服务器生成密钥A,把A发给客户端,就可以进行加密通信了。但是网络传输密钥被截获,就不安全。解决办法:服务器生成密钥A,发给客户端,客户端生成密钥B,发给服务器。客户端和服务器都得到密钥B(A),即对A再次使用B加密。2、非对称加密服务器和客户端都有两个密钥,公钥和私钥。公钥加密,私钥解密。或者私钥加密,公钥解密。公钥只能解私钥,私钥只能解公钥加密的数据。服务器生成公钥和私钥,把私钥发给客户端。...原创 2021-06-22 17:09:33 · 176 阅读 · 0 评论 -
归并与快排
1、归并把数组二等分,把两个半数组递归归并排好序后,融合出一个新数组返回。2、快排把第一个元素作为基准,先从后往前找到一个小于基准的数,再从前往后找到一个大于基准的数,这两个数交换。void quickort(vector&nums,int l,int r){while(i<j){while(i<j&&nums[j]>=nums[l])j–;while(i<j&&nums[i]<=nums[l])i++int tem原创 2021-06-17 15:22:11 · 57 阅读 · 0 评论 -
结构体,类对象字节对齐
字节对齐可以提高cpu访问速度原创 2021-06-17 11:01:44 · 168 阅读 · 0 评论 -
std::future与std::async
std::future是一个类模板(class template),其对象存储未来的值,一个std::future对象在内部存储一个将来会被赋值的值,并提供了一个访问该值的机制,通过get()成员函数实现。但如果有人视图在get()函数可用之前通过它来访问相关的值,那么get()函数将会阻塞,直到该值可用。...原创 2021-06-16 16:19:42 · 322 阅读 · 0 评论 -
协程原理剖析
线程是在时间片内切换来实现高并发,这是抢占式调度,时间用尽被剥夺处理机。而协程是非抢占式调度,一个协程必须主动调用函数释放处理机,否则一直占用处理机执行此协程,其它协程得不到执行。协程就是一种特殊的函数,普通函数只能执行一次,返回一次,生命周期结束。而协程类似于goto语句,可以在函数执行期间某一行代码让出处理机,去执行其他协程,之后又从这一行代码恢复执行。所有协程都是在一个线程上运行的,同一时间只能有一个协程在运行,对于共享资源不需要加锁。因为多线程严格来说也是分时间片轮流执行,但是cpu是多核多处原创 2021-06-16 10:47:02 · 478 阅读 · 0 评论 -
读写锁原理
读写锁是写独占,读共享,若有一个线程正在写,占了写锁,其他线程写锁读锁都拿不到。读写锁高2字节保存读锁,低2字节保存写锁。1 、如果一个线程用读锁锁定了临界区,那么其他线程也可以用读锁来进入临界区,这样可以有多个线程并行操作。这个时候如果再用写锁加锁就会发生阻塞。写锁请求阻塞后,后面继续有读锁来请求时,这些后来的读锁都将会被阻塞。这样避免读锁长期占有资源,防止写锁饥饿。2、 如果一个线程用写锁锁住了临界区,那么其他线程无论是读锁还是写锁都会发生阻塞。...原创 2021-06-15 09:07:13 · 1347 阅读 · 0 评论 -
如何提高服务器性能
1、多线程2、同步io改为使用异步io3、是用协程原创 2021-06-11 14:00:23 · 175 阅读 · 1 评论 -
滴滴面试笔记
1、如何防止大量客户占线不下线,占用fd2、如何防止黑客不停发请求,占用大量fd3、nignx为什么用多进程,而不用多线程4、智能指针原理,unique_ptr5、指针和引用的区别,什么情况只能用指针,什么情况只能用引用6、双11抢购使用消费者生产者模型解决,消息队列。...原创 2021-06-10 20:38:34 · 67 阅读 · 0 评论 -
网络传输如何限速
通过获取时间戳,规定每秒只能传1M,速度就是1M/s.原创 2021-06-10 18:49:58 · 255 阅读 · 0 评论 -
线程睡眠sleep和wait
sleep()睡眠时,保持对象锁,仍然占有该锁;其他线程无法访问而wait()睡眠时,释放对象锁。其他线程可以访问原创 2021-06-10 15:37:56 · 453 阅读 · 1 评论 -
udp丢包与tcp发送缓存区爆满
如果接收端接收处理数据很慢,接收端缓存区就会数据堆积处理不过来,udp由于没有滑动窗口机制,发送过来的数据盛不下,就会丢包,发送过来直接不管。tcp由于有滑动窗口机制不会发生丢包现象,但是会让发送端发送的很慢,而产生数据有很快,同样会造成发送端发送缓存区数据堆积,直到发送缓存区爆满,再使用send往发送缓存区放数据就会报错。1、tcp发送端发送缓存区爆满解决办法再额外自己定义一个缓存区,产生的数据不要直接send,而是都放到自己的缓存,在适当的时候,再把自己缓存中的数据send放到发送缓存区。2、ud原创 2021-06-09 13:58:12 · 3391 阅读 · 0 评论 -
linux进程调度
1、先来先服务算法(FCFS,first come first serve)进程队列先进先出的原则,不断拿出队列首部进程,直至进程处理完毕,进程退出,再继续执行下一个进程。基本废弃。2、短作业优先算法从进程队列中,不断拿出一个估计运行时间最短的进程,直至进程处理完毕,进程退出,在继续执行下一个进程。基本废弃。3、时间片轮转算法进程队列按照先进先出原则,不断拿出队首进程执行一个时间片,再把进程放到队尾,再执行下一个进程。时间片到了会剥夺进程的处理机。4、多级反馈队列调度算法进程队列不只有一个,而原创 2021-06-09 12:21:16 · 310 阅读 · 0 评论