自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(27)
  • 收藏
  • 关注

原创 C++实现生产者和消费者模型

头文件 和 全局变量消费者生产者main函数代码#include <iostream>#include<thread>#include<mutex>#include<condition_variable>#include<queue>using namespace std;//任务队列queue<int>products ;mutex m ;condition_variable cond ;boo

2022-03-27 22:01:07 318

原创 redis知识点汇总,Redis事务

为什么Redis是单线程的Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程Redis优点基于内存操作。内存读写速度快支持持久化。Redis支持RDB和AOF两种持久化机制,持久化功能可以有效地避免数据丢失问题。支持事务。Redis的所有操作都是原子性的,同时Redis还支持对几个操作合并后的原子性执行支持主从复制。主节点会自动将数据同步到从节点,可以进行读写分离I

2022-03-07 23:10:27 438

原创 CAS和ABA

https://zhuanlan.zhihu.com/p/400817892CAS(Compare & Set/Compare & Swap)CAS是解决多线程并行情况下使用锁造成性能损耗的一种机制,类似于乐观锁,在提交操作时检查是否一致CAS操作包含三个操作数——内存位置(V)、预期原值(A)、新值(B)。如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值。否则,处理器不做任何操作。无论哪种情况,它都会在CAS指令之前返回该位置的值。CAS有效地说明了“

2022-02-11 21:08:54 130

原创 线程资源,线程通信,线程锁相关

用户模式下的方法有:原子操作(例如一个单一的全局变量),临界区。内核模式下的方法有:事件,信号量,互斥量。原子操作:指不会被线程调度机制打断的一个或一系列操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程)临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。互斥量:为协调共同对一个共享资源的单独访问而设计的。信号量:为控制一个具有有限数量用户资源而设计。事件:用来通知线程有一些事件已发生,从而启动后继任务的开始

2022-02-11 16:59:58 439

原创 常用算法简记

优先级队列小顶堆priority_queue <int,vector<int>,greater<int> > q;大顶堆priority_queue <int,vector<int> > q;组合问题(每个元素只能使用一次)for循环每次从startIndex开始遍历,下一层搜索要从i+1开始void backtracking(int n, int k, int startIndex){ if(终止条件){} for (int

2022-01-30 23:27:58 473

原创 CAP理论

一致性(所有节点在同一时间具有相同的数据)可用性 (保证每个请求不管成功或者失败都有响应)分隔容错性(系统中任意信息的丢失或失败不会影响系统的继续运作)关于P,在整个系统中某个部分,挂掉了,或者宕机了,并不影响整个系统的运作或者说使用,而可用性是,某个系统的某个节点挂了,但是并不影响系统的接受或者发出请求,CAP 不可能都取,只能取其中2个原因是:如果一致性是第一需求,要数据同步,不然请求结果会有差异,但是数据同步会消耗时间,期间可用性就会降低。如果可用性是第一需求,那么只要有一个服务在,.

2022-01-26 19:46:01 1473

原创 go map底层

实现map底层为哈希表,采用拉链法解决哈希冲突,主要出现的结构体有两个,一个叫hmap,一个叫bucket(bmap)Golang的map中用于存储的结构是bucket数组。hmap和bucket的关系是这样的而bucket又是一个链表,所以,整体的结构应该是这样的:go中数据经过hash后,得到一个hash值,Gol会把hash值分为高位和低位,低位用于寻找当前key属于hmap中的哪个bucket,高位用于寻找bucket中的哪个key。扩容会创建一个扩大一倍的bucket数组,并旧

2021-12-29 19:15:11 254

原创 go slice底层

slice的数据类型Go 中数组为值类型,因此数组赋值和函数传参都是值复制的,即每次传参都用数组,那么每次数组都要被复制一遍,会导致大量内存占用。如果用指针传递,万一原数组的指针指向更改了,那么函数里面的指针指向都会跟着更改。因此slice采用引用类型,用切片传数组参数,既可以达到节约内存的目的,也可以达到合理处理好共享内存的问题。slice的数据结构切片的结构体由3部分构成,Pointer 是指向一个数组的指针,len 代表当前切片的长度,cap 是当前切片的容量。cap 总是大于等于 len

2021-12-29 16:55:10 166

原创 rpc及和http对比

Day1实现了一个简易的客户端和服务端,支持消息的编码解码。对于rpc来说,双方在确定传输协议后(tcp),需要确定报文的编码格式(项目支持gob和json)。编码格式的确认:以客户端举例,采用gob进行编码,而服务端并不知道客户端的编码方式,因此可以在请求报文前添加一个固定的json编码,编码内容:1. 标记请求是否为rpc请求。2. 报文的编码方式。...

2021-12-22 17:59:28 1325

原创 常用设计模式的作用

单例模式保证一个类只生成唯一的实例对象,因为对象是唯一的,所以构造方法为私有,不可以通过new来创建。因此要提供一个静态的公开的方法,让外部类获取对象。实现方式简单工厂模式(不是设计模式)通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。优点:工厂类包含必要的判断,可以根据外界给的信息,决定究竟该创建哪个具体的类的对象,用户使用时可以直接根据工厂类去创建所需要的实例,无需了解这些对象是如何创建的。缺点:由于工厂类中集中了所有实例的创建逻辑,“高内聚”方面做得不好;当系统

2021-11-13 17:46:16 275

原创 redis过期键删除策略

redis过期键删除策略

2021-11-11 21:25:15 662

原创 redis数据结构,zest为什么不用红黑树

5种基本数据结构string,list,hash,set,zsetstring表示的是一个可变的字节数组,采用预分配冗余空间的方式来减少内存的频繁分配list表示双向链表,随机定位性能较弱,首尾插入删除性能较优hash第一维是数组,第二维是链表,采用拉链法解决哈希冲突。扩容 当hash内部的元素比较拥挤时(hash碰撞比较频繁),就需要进行扩容。扩容需要申请新的两倍大小的数组,然后将所有的键值对重新分配到新的数组下标对应的链表中(rehash)。如果hash结构很大,比如有上百万个键值对,那

2021-11-11 21:05:53 1630

原创 channel底层实现,无缓存和有缓存区别

Channel,发送一个数据到Channel 和 从Channel接收一个数据 都是 原子性的。而且Go的设计思想就是:不要通过共享内存来通信,而是通过通信来共享内存,前者就是传统的加锁,后者就是Channel。也就是说,设计Channel的主要目的就是在多任务间传递数据的,这当然是安全的原因channel内部维护了一个互斥锁,来保证线程安全type hchan struct { qcount uint // total data in the queue data.

2021-11-04 23:36:17 721

原创 go中make和new的区别,为什么小对象多了会造成gc压力,无缓冲 Chan 的发送和接收是否同步

区别make和new都是内存的分配(堆上),但是make只用于slice、map以及channel的初始化(非零值),会返回一个相应类型的值;而new用于类型的内存分配,并且内存置为零,会返回一个相应类型的指针 。make返回的是引用类型本身;而new返回的是指向类型的指针。make是引用类型的初始化方法...

2021-11-04 23:26:35 703

原创 进程间通信效率比较

匿名管道没有名字标识,匿名管道是特殊文件只存在于内存,没有存在于文件系统中,shell 命令中的「|」竖线就是匿名管道,通信的数据是无格式的流并且大小受限,通信的方式是单向的,数据只能在一个方向上流动,如果要双向通信,需要创建两个管道,再来匿名管道是只能用于存在父子关系的进程间通信,匿名管道的生命周期随着进程创建而建立,随着进程终止而消失命名管道突破了匿名管道只能在亲缘关系进程间的通信限制,因为使用命名管道的前提,需要在文件系统创建一个类型为 p 的设备文件,那么毫无关系的进程就可以通过这个设备

2021-11-03 21:57:19 1064

原创 Redis缓存穿透,缓存雪崩,缓存击穿

缓存穿透缓存穿透是指查询一个不存在的数据,由于缓存是不命中时被动写的,如果从DB查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到DB去查询,失去了缓存的意义。在流量大时,可能DB就挂掉了。缓存空值,不会查数据库。采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,查询不存在的数据会被这个bitmap拦截掉,从而避免了对DB的查询压力。布隆过滤器的原理:当一个元素被加入集合时,通过K个散列函数将这个元素映射成一个位数组中的K个点,把它们置为1。查询时,将元素通过散列

2021-11-02 23:32:28 110

原创 如何保证缓存与数据库双写时的数据一致性

1、先删除缓存再更新数据库进行更新操作时,先删除缓存,然后更新数据库,后续的请求再次读取时,会从数据库读取后再将新数据更新到缓存。存在的问题:删除缓存数据之后,更新数据库完成之前,这个时间段内如果有新的读请求过来,就会从数据库读取旧数据重新写到缓存中,再次造成不一致,并且后续读的都是旧数据。2、先更新数据库再删除缓存进行更新操作时,先更新MySQL,成功之后,删除缓存,后续读取请求时再将新数据回写缓存。存在的问题:更新MySQL和删除缓存这段时间内,请求读取的还是缓存的旧数据,不过等数据库更新完成

2021-11-02 22:27:06 191

原创 Redis 持久化机制,AOF重写阻塞原因,RDB阻塞

定义持久化就是把内存的数据写到磁盘中,防止服务宕机导致内存数据丢失RDB的方式会根据指定的规则定时将内存中的数据存储在硬盘上RDB是 Redis 默认的持久化方案。RDB持久化时会将内存中的数据写入到磁盘中,在指定目录下生成一个dump.rdb文件。Redis 重启会加载dump.rdb文件恢复数据,将数据从硬盘载入内存。通过 RDB 方式的持久化,一旦Redis异常退出,就会丢失最近一次持久化以后更改的数据。优点:Redis 加载 RDB 恢复数据远远快于 AOF 的方式。使用单独

2021-11-02 22:11:57 402

原创 红黑树特性, 红黑树和AVL树区别

(1)每个节点或者是黑色,或者是红色。(2)根节点是黑色。(3)每个叶子节点(NIL)是黑色。 【注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!】(4)如果一个节点是红色的,则它的子节点必须是黑色的。(5)从一个节点到该节点的叶子节点的所有路径上包含相同数目的黑节点。【确保没有一条路径会比其他路径长出俩倍。因而,红黑树是相对是接近平衡的二叉树】...

2021-10-29 08:47:11 86

原创 go垃圾回收GC,内存泄漏

link

2021-10-12 10:14:26 100

原创 Golang调度器GPM原理与调度分析

简单详细

2021-10-12 10:11:11 275

原创 海量数据去重,10亿取前100

链接: linkhttps://www.cnblogs.com/cjsblog/p/11613708.html

2021-08-18 22:14:19 514

原创 智力题汇总

64匹马1000瓶药水找毒药灯泡开关抢30

2021-08-18 16:00:42 571

原创 mysql索引介绍,使用原则,乐观锁实现,哈希索引不能范围查找的原因,explain,联合索引建立原则,最左前缀

覆盖索引覆盖索引是指,索引上的信息足够满足查询请求,不需要再回到主键上去取数据。当一条查询语句符合覆盖索引条件时,sql只需要通过索引就可以返回查询所需要的数据,这样避免了查到索引后再返回表操作,减少I/O提高效率。使用覆盖索引Innodb比MyISAM效果更好----InnoDB使用聚集索引组织数据,如果二级索引中包含查询所需的数据,就不再需要在聚集索引中查找了注:遇到以下情况,执行计划不会选择覆盖查询  1.select选择的字段中含有不在索引中的字段 ,即索引没有覆盖全部的列。  2

2021-07-21 19:01:41 385

原创 DNS浏览器输入url后经历的过程

链接: linkhttps://blog.csdn.net/du5006150054/article/details/81776183

2021-06-28 10:19:45 526

原创 设计模式之单例模式

链接: linkhttps://www.jianshu.com/p/edab2673ee6c

2021-06-25 16:45:13 141

原创 B树和B+树

B树和B+树链接: linkhttps://segmentfault.com/a/1190000020416577b+树相比于b树的查询优势:b+树的中间节点不保存数据,所以磁盘页能容纳更多节点元素,更“矮胖”,单一节点存储的元素更多,使得查询的IO次数更少,查询速度更快;b+树查询必须查找到叶子节点,b树只要匹配到即可不用管元素位置,因此b+树查找更稳定;对于范围查找来说,b+树所有的叶子节点形成了一个有序链表,只需遍历叶子节点链表即可,更加便于查找,b树却需要重复地中序遍历;...

2021-05-27 15:02:03 181

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除