- 博客(233)
- 资源 (1)
- 收藏
- 关注
原创 Redis的zset的zrem命令可以做到O(1)吗?
事情是这样的,当我用zrem命令去移除value的时候,我想算法复杂度为什么一定要是LogN
2024-07-06 01:23:09 464
原创 “n&-n“得到n最低位的2的幂的数的理解
n是一个整数,最近看一些文章说可以用"n&-n"得到n最低位的2的幂的数。这个"n&-n"原理我花了很长时间才能理解,分享一下。
2024-07-04 00:23:36 186
原创 redis集群的多key原子性操作如何实现?
在单实例redis中,我们知道多key原子性操作可以用lua脚本或者multi命令来实现。比如说有一个双删场景,要保证原子性同时删除k1和k2。可以用lua双删也可以用事务双删但是在redis的集群中,key被hash到不同的slot,slot又被分配到多个不同redis实例。那么多key原子性操作如何实现呢?
2023-10-28 15:03:11 1546 1
原创 零拷贝摘录
在看kafka的时候看到kafka的高效的原因,是因为用了0拷贝技术.这里看了https://developer.ibm.com/articles/j-zerocopy/这篇文章简单做一下笔记在web场景中,我们需要将硬盘的数据传输到socket中做网络推送.我们编写的应用程序作为媒介,如果使用传统的文件拷贝技术的话将会出现4次拷贝,非常影响效率.1、传统的数据拷贝方式,经历了4次拷贝在上图中,application buffer存在是没有意义的.而且这几个过程需要经历两次内核态切换数据不需要
2022-04-09 23:37:05 362
原创 InnoDB的“无用”知识
一、本文目的一个新的OLTP项目不使用InnoDB将是多么愚蠢.这篇文章是介绍InnoDB的体系架构与工作机制,在平时我们工作中也许不会用到这些知识的内容,但对我们去认识InnoDB却是一份好的材料.在这篇文章里,我没有关注版本间的不同信息,而是关注其内在的工作机制,总体来说,包含了内存+工作线程两部分知识,来阐述InnoDB的工作机制.二、体系架构如图所示,InnoDB的体系架构如上图所示,是由多条后台线程+内存池+文件系统组合而成.1、线程概述我们先看看后台线程的分类.它包括:主线程(
2021-11-14 23:07:49 622 1
原创 从《从小工到专家》的“道”到大厂的“法术器”-实效篇
上一篇哲学篇在公司内部论坛发布后被推荐到首页、也用了那篇文章给组内同事分享,得到的大家的认可与大家的讨论,借着这股劲,继续完成《从小工到专家》本书第二章内容的梳理与自己经验的复盘回顾,思考成长的灯塔一、本文的内容本文的内容是根据《从小工到专家》这本书的第二章内容梳理编写的,其中印象最深刻的点是“曳光弹”这一节,讲的是我们开发的时候就像是在黑暗中寻找打击目标,需要借助“曳光弹”来照亮黑暗,来寻找到目标的位置.正如这个小故事,书的作者告诉我们在研发中如何提高效率,途径,借着他的观点,我们一起反思.二、.
2021-11-01 02:05:18 227
原创 从《从小工到专家》的“道”到大厂的“法术器”-哲学篇
《从小工到专家》这本书之前看过一章内容觉得平平无奇,直到最近在CSDN的首页看到了这本书做为好书推荐,抽空又翻阅了一次,这一次让我觉得“醍醐灌顶”.作者在去年加入某大厂,进来了之后一直在思考着如何利用这个平台学习一些有用和值得思考的知识,苦于一直没有找到合适的“灯塔”.看了这本书之后发现原来我想要去寻求的“道”一直就发生在我的身边以各种方式表现出来.所以作者想跟着《从小工到专家》这本书里面提到的思想,结合作者的亲生经历来复盘总结我所在的大厂是如何践行这些“道”.一来我希望以此来向读者推广这本有趣的厕所.
2021-10-17 19:31:21 603
原创 InnoDB索引不能只知道B+树
本文主要总结介绍InnoDB索引的相关知识点,其中涉及算法部分尽量使用动图演示,储备好相关知识,为后面的问题排查定位做准备1、了解索引的重要性我们都知道索引只能在事前增加,不能事后添加.因为随着数据的增加,online DDL消耗的性能与时间就会越来越多.而不正确的使用索引会导致io变大,插入修改缓慢.所以我们需要抱着正确使用索引的目的,来探究InnoDB索引的奥秘2、了解B+树算法终归了解InnoDB还是先从B+树入手.B+树,这其中的B是平衡的意思,B+树是从二叉平衡树演化而来的多叉平衡.
2021-10-15 01:50:20 175
原创 设计模式这样玩泰简单(Golang版)-状态模式
场景老板:我们现在要开发一个文档系统,支持多种模式,在预览模式下只支持预览操作.编辑模式下,支持增删改查操作,你有什么好的方案你:好的老板,那就使用状态模式方案状态模式:我们通过状态对象封装了对上下文的动作.用不同的状态对象维护着对上下文对象操作的不同实现,达到可以横向扩展的效果.在这个例子中,我们把文档系统当成如图所示的上下文,里面维护几个不同的状态,预览状态、编辑状态,再把我们的增删改查的动作封装到这些状态里面,通过上下文对象去使用它们.以后我们如果要扩张其他的模式,增加一个状态即可.
2021-09-26 00:17:58 147
原创 InnoDB事务不能只懂ACID
本文主要是对MySQL事务的知识点进行归纳总结,除了ACID之外的一些比较重要的知识点,多了解对我们对数据库的使用有一定的帮助数据库事务是数据库系统与文件系统的重要区别之一,就是因为有了事务,数据库系统才成为大众存储数据的重要组件.接下来先介绍一下事务是什么,再介绍事务的分类,再谈谈事务是怎么实现的,一条龙梳理清楚事务的知识点.一、事务是什么事务是访问并更新数据库数据的一个程序执行单元.事务具有以下四个特性原子性:要么成功,要么失败一致性:让数据库系统从一种状态变更为另一种状态,但是事务开始.
2021-09-21 23:51:26 134
原创 MySQL有多少文件你知道吗?
MySQL里面的文件多且杂,与我们业务开发相关的也不多,但是对MySQL的整体理解还是需要懂这些知识点,当遇到问题或需要对MySQL做调优时间可以找到对应的切入点.本文对各种常见的MySQL文件做知识点总结,方便以后可以及时查阅复盘一、文件分类MySQL里面的文件大体可以分为两类,一类是MySQL通用的文件,一类是存储引擎自己独特文件.这里主要是记录MySQL通用的文件和InnoDB的两种文件.二、MySQL通用文件MySQL通用文件主要有日志文件、配置文件、表结构定义文件、进程文件、套接字文件.
2021-09-06 01:35:54 414
原创 你真的认识InnoDB OnlineDDL吗?
最近在给一个大表增加字段的时候用到了Online DDL,在操作时有些疑问,带着这些问题查阅了官方文档并做一些总结,方便后面可以对DDL操作做好安全风险评估.一、定义先说说几个名词的定义DDL:数据定义或数据描述语言.比如使用如下语句去修改表的结构信息,类似的语句成为DDL语句ALTER TABLE abcmouse_qq_ugc.t_upload_audio ADD COLUMN file_score_detail varchar(500) default '',ALGORITHM=INPL.
2021-08-15 19:42:08 404
原创 通过12334说说InnoDB里面的锁
前段时间我们在生产遇到MySQL阻塞的问题,后面经过排查发现是锁竞争导致的长时间阻塞,导致应用服务出现异常.这两周通过相关数据与官方文档对InnoDB引擎做了深入了解,掌握了锁的概念,输出本篇文章,旨在说清楚锁相关的概念,并总结好相关知识,为以后问题排查留一个底,方便以后即使查阅复盘先说说锁的概念指的是InnoDB为了保护数据在并发访问情况下,防止数据错误而制作出来的一套数据保护机制.类似Java里面读写锁,Java里面读写锁保护的是内存共享变量.而在InnoDB这里,锁保护的是数据的库、表、页、行.
2021-08-12 00:57:25 259
原创 设计模式这样玩泰简单(Golang版)-观察者模式
场景老板:我们现在想要做一个监控系统,去监控一个对象的状态变化,设计一个方案你:好的老板,那就是使用观察者模式方案观察者模式,顾名思义就是用一些对象去观察另一些对象的行为.在这个设计模式中,观察方法是通过“主动”通知的形式.即在 被观察者 的对象中注册一批观察者,当 被观察者 自身的状态发生变化的时候,主动去通知观察者,并把自身的引用或者某些状态信息传递给观察者完成整个通知流程.观察者拿到目标对象的状态信息后就可以做相关的事宜.用聚合的方式解耦掉观察者与被观察者两者的逻辑.常用与监控,或者是
2021-07-18 23:52:24 124
原创 设计模式这样玩泰简单(Golang版)-备忘录模式
场景老板:对我们的现有记录做存档,后面可以恢复,设计一个代码的方案你:好的,老板.那就是使用备忘录模式方案备忘录模式,指的是用一个备忘录对象来记录原始对象的内部状态信息.原始对象利用备忘录对象对自己的属性做一次存档,然后可以通过这个备忘录对象对自己的属性做回滚.备忘录对象没有任何的功能,只是充当一个数据记录的作用.当然有人会说我们也可以通过深拷贝一个原始对象来做存档,但这样的话可能会导致这个克隆对象被误用.把存档的功能单独抽离出来是最好的,我也可以在原始对象的内部维护这个备忘录对象,这样就不会
2021-07-03 16:50:54 151
原创 设计模式这样玩泰简单(Golang版)-中介模式
场景老板:如果我们现在要实现一个群通知功能,群中的所有成员都能通知其他人,你觉得用什么设计模式比较好你:好的老板,那就使用中介模式方案中介模式,指的是用一个对象来封装一批成员对象,并暴露同一的接口,这个接口可以对这些成员对象施加一些动作.就如它的名称一样,像一个中介代理着他的成员对象去做一些事情,当然了,真正动手的是被他代理的实例.在这个场景中,我们用中介模式来代理被代理实例的功能,我们建立一个中间者,然后向中介者发一起一起群通知,然后中介者帮我们向所有注册的成员发起通知,这样就可以完成我们
2021-06-20 16:14:37 125
原创 设计模式这样玩泰简单(Golang版)-迭代器模式
场景老板:现在有一个对象拥有一个私有的属性,是一个列表.设计一个方案,在列表指针不暴露出去的情况下让这个列表能被迭代访问你:好的老板,那就使用迭代器模式方案迭代器模式,指的是用对象来封装访问一个列表的行为,其效果与for循环是一样的,但是保护了真正的列表可以不被外界访问,又能访问到列表的真正内容.在Java中我们也很经常用迭代器来做操作,像常用的List,Set,Map都可以通过那个对象创建一个迭代器对象,但是在golang中却没有,所以golang入门的同学了解这知识点可能比较陌生,下面我们
2021-06-19 13:23:23 206
原创 今天说说go多协程并发访问map导致的fatal error
1.背景描述最近写了一个批量查询的接口,因为泰慢,改用goroutine进行并发操作,代码是大概这样的func foo(rsp Rsp){ for _,i:=range rsp.Items { go func(){ //一大堆业务操作,然后得到key跟value rsp.Map[key]=value }() }}结果这段代码在测试环境玩的好好的,上到生产就立刻崩了.2.问题定位在生产的机器中找到错误日志如下:很明显的一个错误,是并发访问map异常.在Java中,并
2021-06-16 22:22:14 1172
原创 设计模式这样玩泰简单(Golang版)-解释器模式
场景老板:现在我们要实现自己的一套规则引擎,解释自定义的语法,你有什么好的方案你:好的老板,那就是使用解释器模式方案解释器模式,用一波对象封装了对某种语法解析过程的实现.在这个设计模式中,使用统一的解释器接口规范了解释器的行为.使用不同的解释器实现不同的语法解析.除此之外,在这个模式中,还引入了上下文对象这个概念,是因为我们在对语法解析的过程不是某个对象一次就能处理完,所以引入了上下文对象去缓存处理过程中暂存数据,结果等.看的设计模式越多觉得每个模式越像,都是利用了对象之间的组合,依赖倒置来
2021-06-06 21:00:00 131
原创 设计模式这样玩泰简单(Golang版)-命令模式
场景老板:我们有一个业务的组件实现是第三方,他们暴露的接口非常细粒度,我们要根据不同的接口组成一个指令,并且指令能复用,你有什么好的方案你:好的,老板,那就使用命令模式方案命令模式,就是利用一些实现同一接口的对象对真正的业务对象行为进行封装,成为一个可以复用的、另外组合的实现方式.如图所示,我们可以针对某一个业务对象定义一个命令接口,再创造不同的命令实现,在这些命令实现中,每个都聚合了真正的业务对象,通过实现接口方法,完成对业务对象行为的封装.所以能达到场景的要求.命令模式看起来很像外观模式
2021-06-05 15:19:15 118
原创 设计模式这样玩泰简单(Golang版)-责任链模式
场景老板:最近在开发工作流,里面涉及一个逐级审批的场景,你有什么好方案你:好的老板,那就是使用责任链模式方案责任链模式,实现同一接口的不同对象通过聚合聚合在一起,在逻辑处理过程中,可自行选择是否交给上一级进行处理.像链条的每一个节点一样,一环扣一环,可以在某一环进行断路控制非法参数或者直接完成流程,或从头到尾做完全部处理再走下一步逻辑,类似过滤链的逻辑.在类似这个逐层审批的场景中,每一层级的审批就是责任链中的节点,我们可以在节点中进行逻辑判断,直接审批、拒绝、或者向上一级汇报.还可以很轻松的增
2021-05-30 03:21:28 427
原创 分布式面试必问题!为什么说CAP不能兼顾?
1.名词定义我们先来认识一下分布式里面说的CAP是什么?分别是一致性(Consistency)、可用性(Availability)和分区容错性(Partition-tolerance)一致性(Consistency):指的是一个节点的主节点跟副本之间数据的一致性,可以想象一下MySQL的主从同步一致性.可用性(Availability):指的是一个系统对外服务的质量.我们常把系统可用性量化为几个9,也即是99.99…%小数点后的几个9,通常可以通过系统的不可用时间,可用时间,总服务时间计算得出来.
2021-05-10 00:42:15 259
原创 设计模式这样玩泰简单(Golang版)-代理模式
场景老板:如何不动声色的在一个对象干活的时候做些其他事情,比如监控他的启动,收集他的完成情况等等你:好的老板,那就使用代理模式方案代理模式,即创建一个代理类,将真正实现服务的对象聚合在其内部,然后暴露接口让真正的对象去干活,这时,便可以真正对象干活的前置后置做一些事情,可以做监控,采集日志等一系列东西.代理模式也是才用聚合代替继承的方法来给对象增加能力,有很好的扩展性.感觉设计模式研究多了,几乎都是面向接口编程,用聚合代替继承,也是跟go语言设计的初衷一致.用go来玩设计模式实在是泰简单了.
2021-05-09 16:46:45 114
原创 设计模式这样玩泰简单(Golang版)-蝇量模式
场景老板:我们系统中会重复使用一个不可变的类对象,想个办法,让整个系统都使用这同一个对象你:好的老板,那就是使用蝇量模式方案蝇量模式也称为享元模式,如名字说的一样,就是系统里面不同场景使用某个不可变对象时,都使用那同一个对象.这里强调不可变,是因为整个对象会被全局使用,所以他的状态不能被外部所改变.使用一个蝇量工厂,工厂缓存着蝇量对象,每当客户端需要使用的时候,直接返回缓存中的那个对象.看起来跟之前说过的单例模式非常相似,是的,单例模式也是一个享元模式.实现see:https://gith
2021-05-04 02:55:31 126
原创 设计模式这样玩泰简单(Golang版)-外观模式
场景老板:想个办法,封装一套复杂的流程,给一个接口方便对接的厂商调用你:好的,老板,那就是使用外观模式方案外观模式也称为门面模式,通过组合或聚合的方式继承一个和多个对象,封装调用这些对象的复杂流程,暴露出去一个简单的接口给使用者调用.这个模式常常用于openapi的场景,很好的解决了对于复杂流程的封装问题实现see:https://github.com/jjtHappy/design-pattern-so-simplepackage mainimport "fmt"type Co
2021-05-03 01:31:19 95
原创 设计模式这样玩泰简单(Golang版)-装饰者模式
场景老板:考虑一下,如何在不改动代码的情况下,给一个现有的类增加功能你:好的,老板那就使用装饰者模式方案装饰者模式是通过组合的方法给某个类增加能力的一种设计模式,通过与目标继承同一个接口,并组合目标类对象,将装饰者自己打造成为一个升级版的目标类.在这样的扩展下,做到开闭原则,能在不改变原有代码的情况下给某个类增加能力.实现see:https://github.com/jjtHappy/design-pattern-so-simplepackage mainimport "fmt"
2021-05-02 19:50:53 130
原创 设计模式这样玩泰简单(Golang版)-组合模式
场景老板:让你做一个组织架构的实现,怎么实现可扩展性最高?你:好的老板,那就是使用组合模式方案组合模式,指的是就是用接口做抽象,在这个接口内部组合自己,形成一个树型结构.像组织架构,课表,等等可以形成树状的实体,都可以用组合模式来做一个实现,这样我们可以不断的演化节点类型而对总体的节点不用修改,不断的扩展这棵树的体积而不用动旧代码实现see:https://github.com/jjtHappy/design-pattern-so-simplepackage mainimport
2021-04-30 01:29:05 136
原创 设计模式这样玩泰简单(Golang版)-桥接模式
场景老板:一直听你说面向接口编程,那你举一个设计模式告诉我什么叫tm的面向接口编程你:好的老板,那就使用桥接模式方案桥接模式就是面向接口编程的最好体现.桥接模式就是自己创建一个所谓的桥接器,这个桥接器里面有一个属性是一个接口类型的,这个桥接器不维护接口的实现,而是open一个方法,让桥接器的使用者把实现传递给它,然后桥接器用这个真正的接口实现去干活.桥接器就是面向接口编程,通过接口嫁接任意的实现,达到可扩展的效果.假如当前的实现不满足要求,那么随时随地增加实现去扩展.实现see:htt
2021-04-30 00:08:46 121
原创 设计模式这样玩泰简单(Golang版)-适配器模式
场景老板:现在有一个遗留的接口跟一个现存的类,这个类没有实现这个接口,在不改动原来代码的情况下想个法子让这个类具备这个接口的功能你:好的老板,那就使用适配器模式方案在这个场景下我们可以使用适配器模式来解决这个问题.我们通过增加一个适配器去实现目标接口,并传递现存的那个类给它,由这个适配器来适配这个类的接口功能.采用适配器,我们可以在不变动原来代码的情况下,增加某个类的功能(即被动实现某个接口,在适配器中编写适配逻辑).这里建议使用聚合的方式来让适配器拥有任意类的功能.在Go中没有继承,所以
2021-04-12 01:08:22 123
原创 设计模式这样玩泰简单(Golang版)-单例模式
场景老板:现在咱们要搞个单例,整个系统跑起来就只能有一个对象,实现吧你:好的老板,那就使用单例模式.方案我们使用单例设计模式可以解决这个问题.单例指的就是在某个类的内部维护自己一个对象实例,并只能通过单一接口暴露出去.一般我们实现单例可以用饿汉模式和懒汉模式.说白了就是先创建好对象等待着,还是等你要的时候我再给你创建.两个方式都可以实现,唯一的区别是在实现懒汉的时候要考虑并发性的问题.单例的作用场景一般是用在全局只用一个对象的场合,比如我们手机打开一个APP,这个进程就是一个单例,下次点击
2021-03-31 00:32:30 113
原创 设计模式这样玩泰简单(Golang版)-原型(蝇量)模式
场景老板:我们要大规模生产一种产品,每个产品的规模大小都是一模一样的,实现吧你:好的,那就使用原型(蝇量)模式方案我们使用原型模式,通过拷贝的方法,拷贝一个对象自身的属性,产生一个一摸一样的自己来满足这个需求.注意:一般我们说的拷贝分深拷贝跟浅拷贝,也就是所谓的值拷贝和指针拷贝.Golang天生就是一个中意值拷贝的语言,只要你不刻意去使用指针,那么就是一个值拷贝参数传递模式.实现see:https://github.com/jjtHappy/design-pattern-so-simpl
2021-03-23 00:28:29 96
图片检索jar包
2016-02-02
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人