自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(104)
  • 资源 (2)
  • 收藏
  • 关注

原创 windows的shadow copy技术

虽然这样会导致备份的数据并不是事实更新的,但是如果不使用shadow copy,进行数据备份时就需要停机停止对备份数据的操作,这样从用户角度就会感知到明显的额外时间花费。通过使用shadow copy,在数据备份时shadow copy会自动冻结文件的io,这个时间非常短暂,shadow copy结束后会继续开启文件io,所以从用户角度并没有在备份过程中停止服务。注意:shadow copy保证的数据一致性并不是像redis的aof全量备份的aof重写缓存的一致性作用(可以使开始备份时的数据与。

2024-04-30 11:52:11 618

原创 大型dll编译手册

导入后会发现dll入口源文件无法include新导入的文件,因为新导入的文件并不是把文件复制进此项目,而是一种类似隔离环境下引用的关系。(dllmain.cpp文件是编译器默认编译dll入口函数,如果项目中没有dllmain.cpp函数则编译器会自动选择含有dll对外接口定义的.h和.cpp文件作为dll的入口函数编译)在项目的属性,中的C++选项,里的附加包含目录导入现有项的工作目录。但是编译引用了许多cpp文件或者lua脚本或其他dll的大型dll项目却无从下手。打开项目属性页,取消预编译头。

2024-04-22 16:02:21 452

原创 C++内联函数

要定义一个内联函数,你需要在函数声明前加上inline。

2024-04-18 13:40:44 362

原创 云原生数据库特征

一般多租户采用一组租户以数据库系统,或者多租户共享以数据库系统,通过命名空间等方式隔离,但是比较负责。云原生场景下,数据库可以为多个租户绑定相应的计算节点和存储节点实现资源的隔离和吗,面向不同租户的资源调度。下层分布式共享存储,上层是分布式共享计算池,中间层用于计算存储解耦,可以提供弹性高可用能力,做到分布式技术集中式部署。采用一致性协议可以保证发生异常时多个节点存储的数据达成一致。虚拟化技术实现资源池化,按需按量使用,弹性调度资源。存储服务层负责数据缓存与事务处理。共享存储层负责数据的持久化存储。

2024-04-03 22:36:50 794

原创 分布式理论

具体是指“当部分节点出现消息丢失或者分区故障的时候,分布式系统仍然能够继续运行”,即系统容忍网络出现分区,并且在遇到某节点或网络分区之间网络不可达的情况下,仍然能够对外提供满足一致性和可用性的服务。:数据一致性模型可以分为强一致性和弱一致性,强一致性也叫做线性一致性,除此以外,所有其他的一致性都是弱一致性的特殊情况。在互联网领域的绝大多数场景中,都需要牺牲强一致性来换取系统的高可用性,系统往往只需要保证“最终一致性”,只要这个最终时间是在用户可以接受的范围内即可。,绝对的内部一致性是没有意义的。

2024-02-20 18:57:15 756

原创 乐观锁与悲观锁

乐观锁与悲观锁

2024-02-19 10:47:24 213

原创 mysql锁

行级锁:InnoDB 引擎支持行级锁,而 MyISAM 引擎不支持行级锁。共享锁(S锁)满足读读共享,读写互斥。Next-Key Lock临键锁:Record Lock + Gap Lock 的组合,锁定一个范围,并且锁定记录本身。在可重复读隔离级别下,行级锁的种类除了有记录锁,还有间隙锁,Next-key-lock锁。在读已提交隔离级别下,行级锁的种类只有记录锁,也就是仅仅把一条记录锁上。表级锁:分为表锁、元数据锁(MDL)、意向锁、AUTO-INC锁。锁是对索引的锁,事务提交后才解锁。

2024-02-19 10:45:15 699

原创 MVCC简记

MVCC:多版本并发控制,控制事务能看到哪些版本的数据,哪些看不到。MVCC采用undolog链存储历史数据,每条记录有两个隐藏列id和undolog指针字段,每次查询生成readview,readview记录相对于该事务未提交的数据,通过readview与undolog比较,可以判断哪些数据是当前事务可见的。MVCC属于数据库事务中的技术,通过MVCC可以在无锁情况(死锁会减少)下实现mysql的可重复读与读已提交两种事务隔离级别。

2024-02-18 11:33:42 636

原创 mysql事务简记

mysql事务隔离级别,脏读、幻读、不可重复读

2024-02-18 11:14:29 335

原创 redis的hash数据结构底层简记

hash与底层hashtable

2024-02-17 18:21:02 560

原创 mysql查询分析explain

使用EXPLAIN| DESCRIBE查看语句具体执行计划,并不真正执行语句(在估计大致数据量时可以使用explain)

2024-02-17 18:13:31 495

原创 mysql索引简记

只在更新时,唯一索引必须读入内存判断索引是否唯一,普通索引可以把更新操作缓存在 change buffer 中,在下次查询需要访问这个数据页的时候,将数据页读入内存,然后执行 change buffer 中与这个页有关的操作。主键是聚集索引,索引的叶子节点存放表中一整行完整记录,索引组织表对比堆表,在海量并发的OLTP业务中能有更好的性能表现;:条件判断的字段在二级索引的B+树里,就会下推到存储引擎层过滤,再回表,减少了回表次数。中的索引都是二级索引,哪怕是主键索引也是二级索引,都要进行回表。

2024-02-16 20:30:47 1048

原创 mysql存储范式简记

范式与反范式,范式追求不同表中的不重复存储,反范式可以重复存储一张表里。每张表一定要有一个主键,自增主键只推荐用在非核心业,核心业务表推荐使用 UUID 或业务自定义主键,可以通过 JSON 数据类型进行反范式设计。

2024-02-16 20:25:29 319

原创 mysql分库分表

跨库跨表的合并和排序问题:数据分散存储到不同的数据库和表中,如果查询指定数据列表,或者需要对数据列表进行排序时,就变得异常复杂,可以依赖开源的分库分表中间件来处理。双写双读阶段:采用灰度策略,一部分流量读老表,一部分流量读新表,读新表的部分在一开始,还可以同时多读一次老表数据,本阶段建议施行至少两周;水平分库: 可以把一个表的数据(按数据行)分到多个不同的库,每个库只有这个表的部分数据,这些库可以分布在不同服务器。如果不停服,怎么保证数据一致性?写新读新阶段:已经完成了分表的迁移,老表数据可以做个冷备。

2024-02-15 21:24:06 424

原创 mysql读写分离

主从复制原理:从库数量增加,从库连接上来的 I/O 线程也多,主库要创建同样多的 log dump 线程来处理复制的请求,对主库资源消耗比较高,一般一主两从一备主。:异步把 binlog 复制到所有从库上,每个从库把 binlog 写到暂存日志中。:1、配置数据源并在代码中判断发给指定数据源。2、使用中间件代理如mycat。:主库写 binlog (二进制)日志,提交事务,并更新本地存储数据。:回放 binlog,并更新存储数据。:主从延迟影响读取从库的实时性。

2024-02-15 21:22:28 1636

原创 I/O多路复用简记

数据结构用户态与内核态共享解决select的第三个缺点,使用事件驱动,只复制发生变化的socket(通过重排把有数据的socket添加到双向链表中,应用程序可以通过遍历链表来获取就绪的文件描述符)解决了select的第四个缺点。(多线程处理每一个socket但上下文切换消耗太大)不断循环里(全量拷贝到内核,由内核判断)判断bitmap以处理多路IO。select使用bitmap存socket文件描述符,由bitmap槽位的每一位为0或1决定对应序的socket连接是否有数据到来。

2024-02-11 22:17:23 300

原创 sync.Map底层简记

sync.Map是采用两个不同的map空间换时间实现的可并发读写性能平衡map

2024-02-11 22:10:58 297

原创 redis持久化

持久化:可以理解为mit6.824教的主从备份机制,状态转移对应RDB,复制状态机对应AOF,RDB是全部数据的二进制快照文件,AOF是文本追加的日志。RDB拷贝全部数据慢,是分钟级别的恢复机制但恢复更快,AOF通常设置1秒保存一次。

2024-02-08 12:12:49 329

原创 Window环境下使用go编译grpc最新教程

网上的grpc教程都或多或少有些老或者有些问题,导致最后执行生成文件时会报很多错。这里给出个人实践出可执行的编译命令与碰到的报错与解决方法。最后看了官网,果然只有官网的教程不会太老导致不可用。下载protoc不做介绍请自行下载下载后执行输出类似以下信息则安装成功,否则卸载重新安装下载go编译proto插件下面的命令已废弃!不要使用请使用下面命令!观察GOPATH目录的bin下有两个文件编写search.proto文件执行编译命令以上是煎鱼的grpc教程,可能由于版本或者环境导致现在。

2024-02-08 12:07:30 1761

原创 分布式锁简记

分布式锁:跨进程跨物理节点需要一把公共的锁,单机锁并不能应对这种场景。通过分布式锁把分布式场景下并发混乱的操作退化成串行有序的操作。

2024-02-07 10:49:58 296

原创 缓存异常与一致性

缓存穿透、缓存击穿、缓存雪崩

2024-02-07 10:46:18 1364

原创 Mysql日志简记

缓存在 redo log buffer 里的 redo log 还是在内存中,redo log 会每秒刷盘,提交事务时也会刷盘,数据页和 undo 页都是靠这个机制保证持久化的。的方式,相当于一个环形,InnoDB 用 write pos 表示 redo log 当前记录写到的位置,用 checkpoint 表示当前要擦除的位置,如下图:write pos 追上了 checkpoint,mysql会阻塞刷盘并删除再更新checkpoint。:是 Innodb 存储引擎层生成的日志,实现了事务中的。

2024-02-06 15:07:05 1171

原创 行为型设计模式—备忘录模式

Editor实现,Undo、Redo方法即回退、前进方法在实现的时候就是依赖的它内部记录的一组Memento对象,通过指向不同的Memento对象来实现回退和前进功能。即利用快照的思想实现对象的版本更替。Caretaker(管理人):Caretaker是保存着多条备忘录的对象,并维护着备忘录的索引,在需要的时候会返回相应的备忘录 – 类比理解为博客系统中的编辑器对象。Originator(发起者):Originator是当前的基础对象,它会将自己的状态保存进备忘录,此角色可以类比博客系统中的文章对象。

2024-02-06 15:02:54 1052

原创 行为型设计模式—中介者模式

机场的控制塔是一个典型的中介者角色, 飞机在起飞和降落前都会向控制塔发出问询,控制塔会给飞机发送指令协调它们的起飞降落时间,避免造成事故。中介模式与观察者模式在结构上有些相似,观察者模式中的EventDispatcher 和 中介模式中的 Mediator 看起来很想,都是把多个组件之间的关系,维护到自身,实现组件间的间接通信达到解构效果。方法里都会去跟作为中介者的指挥塔发出问询,看是否能够降落,如果跑道正在被占用,那么会等待指挥塔调用它自己的。而其他占用跑道的飞机在起飞后会通过中介者提供的。

2024-02-05 17:30:08 1064

原创 行为型设计模式—解释器模式

实现一个加减的运算器,我们对每种运算定义对应的Expression对象,在方法里实现具体的运算规则,避免所有的运算操作放到一个函数中,这体现了解释器模式的核心思想,将语法解析的工作拆分到各个小类中,以此来避免大而全的解析类。解释器模式:用来在程序里创建针对一个特点领域语言的解释器,用于处理解释领域语言中的语句。在更高级的情况下,解释器模式可用于解析和解释自然语言,不过这通常会涉及想机器学习这样的更复杂的技术。创建一个表达式解析器,它会根据输入表达式构造抽象语法树,使用创建的抽象语法树和上下文解释表达式。

2024-02-05 17:29:22 354

原创 行为型设计模式—命令模式

命令模式作用可以类比于一个场景—在市中心逛了很久的街后, 你找到了一家不错的餐厅, 坐在了临窗的座位上。命令模式:它通过将请求封装为一个独立的对象即命令对象,来解耦命令的调用者和接收者,使得调用者和接收者不直接交互。在这种情况下, 命令用于对目标对象执行各种不同的操作, 备忘录用来保存一条命令执行前该对象的状态。通过命令模式,我们把PS5抽象成命令发送者、CPU对象作为执行业务逻辑的命令接收者,然后引入引入Command 接口把两者做解耦,来满足开闭原则。假设PS5的CPU支持A、B、C三个命令操作,

2024-01-31 10:25:52 803

原创 行为型设计模式—访问者模式

访问者模式通过将算法与对象结构分离来工作,这里说的算法指的是对对象的操作。该接口将为对象结构中的每个类(一般称为元素类)提供一个方法。当Accpet方法被调用时,访问者实例对应的方法就会被调用,通过访问者完成对元素类实例的操作。有点像迭代器模式的结构,可以把迭代器看成访问者模式的特例,迭代器是吧遍历操作与具体数据结构解耦,而访问者模式把任何操作与一类对象解耦。访问者模式:将数据结构对象与数据操作分离的设计模式,可以在不改变数据结构对象类结构的前提下定义作用于这些对象的新的操作。接受方法添加至形状接口中。

2024-01-31 10:25:04 617

原创 行为型设计模式—迭代器模式

迭代器模式:也叫作游标模式,能在不暴露复杂数据结构内部细节的情况下遍历其中所有的元素。在迭代器的帮助下, 客户端可以用一个迭代器接口以相似的方式遍历不同集合中的元素。迭代器模式在平时编程的时候使用的并不多,像Java、C#编程时都自带了迭代器模式的实现,也支持实现语言内置的。接口来给自定义集合创建迭代器。

2024-01-30 18:36:50 636

原创 raft实现心得-核心设计

角色分为leader、candidate、follower存在leader时其他节点都为leader的followerfollower一段时间检测不到leader的心跳heartbeat就会变成candidate,并开始投票election选出新的leader。

2024-01-30 18:34:16 626

原创 行为型设计模式—状态模式

当系统中某个对象存在多个状态,这些状态之间可以进行转换,而且对象在不同状态下行为不相同时可以使用状态模式,把特定于状态的代码抽象到一组独立的状态类中避免过多的状态条件判断,减少维护成本。状态实现类在内部确定了状态可以转换的下个状态,这样就把系统流程的状态机留在了内部,避免让客户端代码再去做状态链初始化和转换的判断,符合高内聚的设计原则,从而解放了客户端。首先针对交通红绿灯,每种灯状态下都有亮灯、变灯、测速的行为,首先定义出交通灯的状态接口。主要由环境类角色、抽象状态角色和具体状态角色,三个角色构成。

2024-01-13 09:42:50 560

原创 行为型设计模式—职责链模式

即能为请求创建一条由多个处理器组成的链路,每个处理器各自负责自己的职责,相互之间没有耦合,完成自己任务后请求对象即传递到链路的下一个处理器进行处理。这也是职责链跟装饰器模式的一个区别,装饰器模式无法在增强实体的过程中停止,只能执行完整个装饰链路。职责链模式与模板模式的区别在于,模板模式的业务流程通常是规定不变的,而职责链模式业务是可拓展的。方法的参数都是流程中要处理的请求。利用责任链模式,实现这个流程中的每个步骤,且相互间不耦合,还支持向流程中增加步骤。定义职责链要处理的请求,实现处理逻辑和请求传递的。

2024-01-13 09:41:28 575

原创 行为型设计模式—策略模式

策略模式与模板模式解耦维度不同,策略模式是让完成某个任务的具体方式可以相互切换,而模版模式则是针对一个流程的共性梳理出固定的执行步骤,二者经常配合使用。策略模式:定义一类算法族,将每个算法分别封装起来,让他们可以互相替换,此模式让算法的变化独立于使用算法的客户端。有了策略的实现后,还要上下文来协调,以及持有完成这个任务所必需的那些入参。下面使用策略模式实现一个支付功能的支付策略。参考公众号网管叨bi叨。

2024-01-10 10:45:28 358

原创 行为型设计模式—模板模式

模版模式惯常的用法是,在一个方法模版方法中定义一个算法或者逻辑的流程和步骤,比如先调内部的方法A 再调内部方法B,满足某个条件了不调方法 C 等等,而这个流程中每个步骤对应的方法都可以推迟到子类中去实现,这就给了程序在不改变大流程、步骤的情况下,完成相似性业务的能力。银行柜台办理业务,存款、取款、购买理财等这些业务的流程中都会有:取号、排位等号、处理业务、服务评价这几个步骤,如果你是金葵花之类的VIP用户,有可能有专属窗口不用排队,检查用户是不是VIP这样步骤叫做钩子方法。参考公众号网管叨bi叨。

2024-01-10 10:43:59 606

原创 行为型设计模式—观察者模式

观察者模式:订阅(Publish/Subscribe)模式,定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知,依赖对象在收到通知后,可自行调用自身的处理程序,实现想要干的事情,比如更新自己的状态。观察者模式的订阅是在事件类中添加自己的事件函数,而发布是事件改变时,事件类遍历自己存储的所有事件函数逐一执行。观察者模式主要是用来实现事件驱动编程。事件驱动编程的应用广泛,除了能用来解耦:用户修改密码后,给用户发短信进行风险提示之类的典型场景。参考公众号网管叨bi叨。

2024-01-08 12:04:23 562

原创 建造型设计模式—桥接模式

如果用常规的继承来实现这个数据库导出模块,模块中首先要有一个类似抽象基础类的基类,然后再用继承分别实现:MySQL-CSV导出类、MySQL- JSON导出类、Oracle-CSV导出类、Oracle-JSON导出类,如果以后模块再加一种支持的数据库SQLServer和导出格式XML,那么系统里实现类就更多了。如果有N个维度,每个维度有M种变化,则最少需要M * N个实现类,类非常多,并且实现类中有非常多的重复功能。的引用,即通过组合的方式来完成我们的数据导出器在导出格式和数据源类型两个维度上的自由搭配。

2024-01-08 12:03:08 399

原创 建造型设计模式—外观模式

外观模式为子系统中的功能接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这些子系统更加容易使用。把电脑拥有的CPU、RAM内存和硬盘视为子系统,调用方想启动电脑要启动这三个子系统,所以在子系统上增加一个外观对象,让调用方直接调用外观对象,由外观对象再分别对接子系统最终完成电脑的启动。外观模式的优点外观模式的缺点。

2024-01-05 10:49:56 312

原创 建造型设计模式—享元模式

享元可以理解为可复用的对象,即可以是对象级别的复用,也可以是对象的字段进行复用(把可复用的字段单独提炼成一个更精细的对象)。节省内存的前提是享元对象是不可变对象,不可变对象指的是初始化之后,对象的状态不会改变了,也就是不会存在被修改的情况。如果在平台中每创建一个牌局就需要初始化对应的卡牌,这样显然很浪费,因为一套扑克牌里的卡牌是固定的,不管多少个牌局使用的扑克牌都是一样的,扑克牌在这里就相当于不可变对象,创建后即不可改变。享元模式的优点是能减少对象的创建,降低内存中对象的数量,降低系统的内存,提高效率。

2024-01-05 10:46:55 362

原创 结构型设计模式—组合模式

组合模式:通过将单个对象(叶子节点)和组合对象(树枝节点)用相同的接口进行表示,使得客户对单个对象和组合对象的使用具有一致性首先定义一个组织的行为接口,这个接口大到总公司小到一个部门都得实现:接口里提供两个方法,一个是打印出自己的组织结构的方法display()另外一个是展示组织职责的方法duty()。定义和实现组合对象组合对象用来表示有下属部门的组织,在代码里可以看到,它持有一个类型的列表,这里存放的是它的下属组织。组合对象的displayduty。

2024-01-04 08:51:30 382

原创 GC与内存管理简记

GC

2024-01-04 08:49:36 394

原创 调度器GMP简记

线程是有pcb的内核级线程,协程是用户级线程。goroutinue占内存更小(几kb)调度更灵活(runtime调度)

2024-01-03 09:17:56 747

空空如也

空空如也

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

TA关注的人

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