自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

读书就是赚钱

nothing is impossible

  • 博客(226)
  • 资源 (1)
  • 收藏
  • 关注

原创 redis集群的多key原子性操作如何实现?

在单实例redis中,我们知道多key原子性操作可以用lua脚本或者multi命令来实现。比如说有一个双删场景,要保证原子性同时删除k1和k2。可以用lua双删也可以用事务双删但是在redis的集群中,key被hash到不同的slot,slot又被分配到多个不同redis实例。那么多key原子性操作如何实现呢?

2023-10-28 15:03:11 1141

原创 设计模式这样玩泰简单(Golang版)-模版模式

模版方法设计模式

2023-02-18 15:23:42 151

原创 设计模式这样玩泰简单(Golang版)-策略模式

golang策略模式的实现

2023-02-17 00:42:48 169

原创 sync.map原理解析

sync.map的原理解析

2022-06-19 23:07:10 1381

原创 零拷贝摘录

在看kafka的时候看到kafka的高效的原因,是因为用了0拷贝技术.这里看了https://developer.ibm.com/articles/j-zerocopy/这篇文章简单做一下笔记在web场景中,我们需要将硬盘的数据传输到socket中做网络推送.我们编写的应用程序作为媒介,如果使用传统的文件拷贝技术的话将会出现4次拷贝,非常影响效率.1、传统的数据拷贝方式,经历了4次拷贝在上图中,application buffer存在是没有意义的.而且这几个过程需要经历两次内核态切换数据不需要

2022-04-09 23:37:05 322

原创 InnoDB的“无用”知识

一、本文目的一个新的OLTP项目不使用InnoDB将是多么愚蠢.这篇文章是介绍InnoDB的体系架构与工作机制,在平时我们工作中也许不会用到这些知识的内容,但对我们去认识InnoDB却是一份好的材料.在这篇文章里,我没有关注版本间的不同信息,而是关注其内在的工作机制,总体来说,包含了内存+工作线程两部分知识,来阐述InnoDB的工作机制.二、体系架构如图所示,InnoDB的体系架构如上图所示,是由多条后台线程+内存池+文件系统组合而成.1、线程概述我们先看看后台线程的分类.它包括:主线程(

2021-11-14 23:07:49 576 1

原创 从《从小工到专家》的“道”到大厂的“法术器”-实效篇

上一篇哲学篇在公司内部论坛发布后被推荐到首页、也用了那篇文章给组内同事分享,得到的大家的认可与大家的讨论,借着这股劲,继续完成《从小工到专家》本书第二章内容的梳理与自己经验的复盘回顾,思考成长的灯塔一、本文的内容本文的内容是根据《从小工到专家》这本书的第二章内容梳理编写的,其中印象最深刻的点是“曳光弹”这一节,讲的是我们开发的时候就像是在黑暗中寻找打击目标,需要借助“曳光弹”来照亮黑暗,来寻找到目标的位置.正如这个小故事,书的作者告诉我们在研发中如何提高效率,途径,借着他的观点,我们一起反思.二、.

2021-11-01 02:05:18 194

原创 从《从小工到专家》的“道”到大厂的“法术器”-哲学篇

《从小工到专家》这本书之前看过一章内容觉得平平无奇,直到最近在CSDN的首页看到了这本书做为好书推荐,抽空又翻阅了一次,这一次让我觉得“醍醐灌顶”.作者在去年加入某大厂,进来了之后一直在思考着如何利用这个平台学习一些有用和值得思考的知识,苦于一直没有找到合适的“灯塔”.看了这本书之后发现原来我想要去寻求的“道”一直就发生在我的身边以各种方式表现出来.所以作者想跟着《从小工到专家》这本书里面提到的思想,结合作者的亲生经历来复盘总结我所在的大厂是如何践行这些“道”.一来我希望以此来向读者推广这本有趣的厕所.

2021-10-17 19:31:21 536

原创 InnoDB索引不能只知道B+树

本文主要总结介绍InnoDB索引的相关知识点,其中涉及算法部分尽量使用动图演示,储备好相关知识,为后面的问题排查定位做准备1、了解索引的重要性我们都知道索引只能在事前增加,不能事后添加.因为随着数据的增加,online DDL消耗的性能与时间就会越来越多.而不正确的使用索引会导致io变大,插入修改缓慢.所以我们需要抱着正确使用索引的目的,来探究InnoDB索引的奥秘2、了解B+树算法终归了解InnoDB还是先从B+树入手.B+树,这其中的B是平衡的意思,B+树是从二叉平衡树演化而来的多叉平衡.

2021-10-15 01:50:20 141

原创 设计模式这样玩泰简单(Golang版)-状态模式

场景老板:我们现在要开发一个文档系统,支持多种模式,在预览模式下只支持预览操作.编辑模式下,支持增删改查操作,你有什么好的方案你:好的老板,那就使用状态模式方案状态模式:我们通过状态对象封装了对上下文的动作.用不同的状态对象维护着对上下文对象操作的不同实现,达到可以横向扩展的效果.在这个例子中,我们把文档系统当成如图所示的上下文,里面维护几个不同的状态,预览状态、编辑状态,再把我们的增删改查的动作封装到这些状态里面,通过上下文对象去使用它们.以后我们如果要扩张其他的模式,增加一个状态即可.

2021-09-26 00:17:58 124

原创 InnoDB事务不能只懂ACID

本文主要是对MySQL事务的知识点进行归纳总结,除了ACID之外的一些比较重要的知识点,多了解对我们对数据库的使用有一定的帮助数据库事务是数据库系统与文件系统的重要区别之一,就是因为有了事务,数据库系统才成为大众存储数据的重要组件.接下来先介绍一下事务是什么,再介绍事务的分类,再谈谈事务是怎么实现的,一条龙梳理清楚事务的知识点.一、事务是什么事务是访问并更新数据库数据的一个程序执行单元.事务具有以下四个特性原子性:要么成功,要么失败一致性:让数据库系统从一种状态变更为另一种状态,但是事务开始.

2021-09-21 23:51:26 111

原创 MySQL有多少文件你知道吗?

MySQL里面的文件多且杂,与我们业务开发相关的也不多,但是对MySQL的整体理解还是需要懂这些知识点,当遇到问题或需要对MySQL做调优时间可以找到对应的切入点.本文对各种常见的MySQL文件做知识点总结,方便以后可以及时查阅复盘一、文件分类MySQL里面的文件大体可以分为两类,一类是MySQL通用的文件,一类是存储引擎自己独特文件.这里主要是记录MySQL通用的文件和InnoDB的两种文件.二、MySQL通用文件MySQL通用文件主要有日志文件、配置文件、表结构定义文件、进程文件、套接字文件.

2021-09-06 01:35:54 355

原创 你真的认识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 354

原创 通过12334说说InnoDB里面的锁

前段时间我们在生产遇到MySQL阻塞的问题,后面经过排查发现是锁竞争导致的长时间阻塞,导致应用服务出现异常.这两周通过相关数据与官方文档对InnoDB引擎做了深入了解,掌握了锁的概念,输出本篇文章,旨在说清楚锁相关的概念,并总结好相关知识,为以后问题排查留一个底,方便以后即使查阅复盘先说说锁的概念指的是InnoDB为了保护数据在并发访问情况下,防止数据错误而制作出来的一套数据保护机制.类似Java里面读写锁,Java里面读写锁保护的是内存共享变量.而在InnoDB这里,锁保护的是数据的库、表、页、行.

2021-08-12 00:57:25 224

原创 设计模式这样玩泰简单(Golang版)-观察者模式

场景老板:我们现在想要做一个监控系统,去监控一个对象的状态变化,设计一个方案你:好的老板,那就是使用观察者模式方案观察者模式,顾名思义就是用一些对象去观察另一些对象的行为.在这个设计模式中,观察方法是通过“主动”通知的形式.即在 被观察者 的对象中注册一批观察者,当 被观察者 自身的状态发生变化的时候,主动去通知观察者,并把自身的引用或者某些状态信息传递给观察者完成整个通知流程.观察者拿到目标对象的状态信息后就可以做相关的事宜.用聚合的方式解耦掉观察者与被观察者两者的逻辑.常用与监控,或者是

2021-07-18 23:52:24 103

原创 设计模式这样玩泰简单(Golang版)-备忘录模式

场景老板:对我们的现有记录做存档,后面可以恢复,设计一个代码的方案你:好的,老板.那就是使用备忘录模式方案备忘录模式,指的是用一个备忘录对象来记录原始对象的内部状态信息.原始对象利用备忘录对象对自己的属性做一次存档,然后可以通过这个备忘录对象对自己的属性做回滚.备忘录对象没有任何的功能,只是充当一个数据记录的作用.当然有人会说我们也可以通过深拷贝一个原始对象来做存档,但这样的话可能会导致这个克隆对象被误用.把存档的功能单独抽离出来是最好的,我也可以在原始对象的内部维护这个备忘录对象,这样就不会

2021-07-03 16:50:54 114

原创 设计模式这样玩泰简单(Golang版)-中介模式

场景老板:如果我们现在要实现一个群通知功能,群中的所有成员都能通知其他人,你觉得用什么设计模式比较好你:好的老板,那就使用中介模式方案中介模式,指的是用一个对象来封装一批成员对象,并暴露同一的接口,这个接口可以对这些成员对象施加一些动作.就如它的名称一样,像一个中介代理着他的成员对象去做一些事情,当然了,真正动手的是被他代理的实例.在这个场景中,我们用中介模式来代理被代理实例的功能,我们建立一个中间者,然后向中介者发一起一起群通知,然后中介者帮我们向所有注册的成员发起通知,这样就可以完成我们

2021-06-20 16:14:37 100

原创 设计模式这样玩泰简单(Golang版)-迭代器模式

场景老板:现在有一个对象拥有一个私有的属性,是一个列表.设计一个方案,在列表指针不暴露出去的情况下让这个列表能被迭代访问你:好的老板,那就使用迭代器模式方案迭代器模式,指的是用对象来封装访问一个列表的行为,其效果与for循环是一样的,但是保护了真正的列表可以不被外界访问,又能访问到列表的真正内容.在Java中我们也很经常用迭代器来做操作,像常用的List,Set,Map都可以通过那个对象创建一个迭代器对象,但是在golang中却没有,所以golang入门的同学了解这知识点可能比较陌生,下面我们

2021-06-19 13:23:23 176

原创 今天说说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 1064

原创 设计模式这样玩泰简单(Golang版)-解释器模式

场景老板:现在我们要实现自己的一套规则引擎,解释自定义的语法,你有什么好的方案你:好的老板,那就是使用解释器模式方案解释器模式,用一波对象封装了对某种语法解析过程的实现.在这个设计模式中,使用统一的解释器接口规范了解释器的行为.使用不同的解释器实现不同的语法解析.除此之外,在这个模式中,还引入了上下文对象这个概念,是因为我们在对语法解析的过程不是某个对象一次就能处理完,所以引入了上下文对象去缓存处理过程中暂存数据,结果等.看的设计模式越多觉得每个模式越像,都是利用了对象之间的组合,依赖倒置来

2021-06-06 21:00:00 110

原创 设计模式这样玩泰简单(Golang版)-命令模式

场景老板:我们有一个业务的组件实现是第三方,他们暴露的接口非常细粒度,我们要根据不同的接口组成一个指令,并且指令能复用,你有什么好的方案你:好的,老板,那就使用命令模式方案命令模式,就是利用一些实现同一接口的对象对真正的业务对象行为进行封装,成为一个可以复用的、另外组合的实现方式.如图所示,我们可以针对某一个业务对象定义一个命令接口,再创造不同的命令实现,在这些命令实现中,每个都聚合了真正的业务对象,通过实现接口方法,完成对业务对象行为的封装.所以能达到场景的要求.命令模式看起来很像外观模式

2021-06-05 15:19:15 96

原创 设计模式这样玩泰简单(Golang版)-责任链模式

场景老板:最近在开发工作流,里面涉及一个逐级审批的场景,你有什么好方案你:好的老板,那就是使用责任链模式方案责任链模式,实现同一接口的不同对象通过聚合聚合在一起,在逻辑处理过程中,可自行选择是否交给上一级进行处理.像链条的每一个节点一样,一环扣一环,可以在某一环进行断路控制非法参数或者直接完成流程,或从头到尾做完全部处理再走下一步逻辑,类似过滤链的逻辑.在类似这个逐层审批的场景中,每一层级的审批就是责任链中的节点,我们可以在节点中进行逻辑判断,直接审批、拒绝、或者向上一级汇报.还可以很轻松的增

2021-05-30 03:21:28 385

原创 分布式面试必问题!为什么说CAP不能兼顾?

1.名词定义我们先来认识一下分布式里面说的CAP是什么?分别是一致性(Consistency)、可用性(Availability)和分区容错性(Partition-tolerance)一致性(Consistency):指的是一个节点的主节点跟副本之间数据的一致性,可以想象一下MySQL的主从同步一致性.可用性(Availability):指的是一个系统对外服务的质量.我们常把系统可用性量化为几个9,也即是99.99…%小数点后的几个9,通常可以通过系统的不可用时间,可用时间,总服务时间计算得出来.

2021-05-10 00:42:15 232

原创 设计模式这样玩泰简单(Golang版)-代理模式

场景老板:如何不动声色的在一个对象干活的时候做些其他事情,比如监控他的启动,收集他的完成情况等等你:好的老板,那就使用代理模式方案代理模式,即创建一个代理类,将真正实现服务的对象聚合在其内部,然后暴露接口让真正的对象去干活,这时,便可以真正对象干活的前置后置做一些事情,可以做监控,采集日志等一系列东西.代理模式也是才用聚合代替继承的方法来给对象增加能力,有很好的扩展性.感觉设计模式研究多了,几乎都是面向接口编程,用聚合代替继承,也是跟go语言设计的初衷一致.用go来玩设计模式实在是泰简单了.

2021-05-09 16:46:45 96

原创 设计模式这样玩泰简单(Golang版)-蝇量模式

场景老板:我们系统中会重复使用一个不可变的类对象,想个办法,让整个系统都使用这同一个对象你:好的老板,那就是使用蝇量模式方案蝇量模式也称为享元模式,如名字说的一样,就是系统里面不同场景使用某个不可变对象时,都使用那同一个对象.这里强调不可变,是因为整个对象会被全局使用,所以他的状态不能被外部所改变.使用一个蝇量工厂,工厂缓存着蝇量对象,每当客户端需要使用的时候,直接返回缓存中的那个对象.看起来跟之前说过的单例模式非常相似,是的,单例模式也是一个享元模式.实现see:https://gith

2021-05-04 02:55:31 105

原创 设计模式这样玩泰简单(Golang版)-外观模式

场景老板:想个办法,封装一套复杂的流程,给一个接口方便对接的厂商调用你:好的,老板,那就是使用外观模式方案外观模式也称为门面模式,通过组合或聚合的方式继承一个和多个对象,封装调用这些对象的复杂流程,暴露出去一个简单的接口给使用者调用.这个模式常常用于openapi的场景,很好的解决了对于复杂流程的封装问题实现see:https://github.com/jjtHappy/design-pattern-so-simplepackage mainimport "fmt"type Co

2021-05-03 01:31:19 78

原创 设计模式这样玩泰简单(Golang版)-装饰者模式

场景老板:考虑一下,如何在不改动代码的情况下,给一个现有的类增加功能你:好的,老板那就使用装饰者模式方案装饰者模式是通过组合的方法给某个类增加能力的一种设计模式,通过与目标继承同一个接口,并组合目标类对象,将装饰者自己打造成为一个升级版的目标类.在这样的扩展下,做到开闭原则,能在不改变原有代码的情况下给某个类增加能力.实现see:https://github.com/jjtHappy/design-pattern-so-simplepackage mainimport "fmt"

2021-05-02 19:50:53 104

原创 设计模式这样玩泰简单(Golang版)-组合模式

场景老板:让你做一个组织架构的实现,怎么实现可扩展性最高?你:好的老板,那就是使用组合模式方案组合模式,指的是就是用接口做抽象,在这个接口内部组合自己,形成一个树型结构.像组织架构,课表,等等可以形成树状的实体,都可以用组合模式来做一个实现,这样我们可以不断的演化节点类型而对总体的节点不用修改,不断的扩展这棵树的体积而不用动旧代码实现see:https://github.com/jjtHappy/design-pattern-so-simplepackage mainimport

2021-04-30 01:29:05 114

原创 设计模式这样玩泰简单(Golang版)-桥接模式

场景老板:一直听你说面向接口编程,那你举一个设计模式告诉我什么叫tm的面向接口编程你:好的老板,那就使用桥接模式方案桥接模式就是面向接口编程的最好体现.桥接模式就是自己创建一个所谓的桥接器,这个桥接器里面有一个属性是一个接口类型的,这个桥接器不维护接口的实现,而是open一个方法,让桥接器的使用者把实现传递给它,然后桥接器用这个真正的接口实现去干活.桥接器就是面向接口编程,通过接口嫁接任意的实现,达到可扩展的效果.假如当前的实现不满足要求,那么随时随地增加实现去扩展.实现see:htt

2021-04-30 00:08:46 94

原创 设计模式这样玩泰简单(Golang版)-适配器模式

场景老板:现在有一个遗留的接口跟一个现存的类,这个类没有实现这个接口,在不改动原来代码的情况下想个法子让这个类具备这个接口的功能你:好的老板,那就使用适配器模式方案在这个场景下我们可以使用适配器模式来解决这个问题.我们通过增加一个适配器去实现目标接口,并传递现存的那个类给它,由这个适配器来适配这个类的接口功能.采用适配器,我们可以在不变动原来代码的情况下,增加某个类的功能(即被动实现某个接口,在适配器中编写适配逻辑).这里建议使用聚合的方式来让适配器拥有任意类的功能.在Go中没有继承,所以

2021-04-12 01:08:22 102

原创 设计模式这样玩泰简单(Golang版)-单例模式

场景老板:现在咱们要搞个单例,整个系统跑起来就只能有一个对象,实现吧你:好的老板,那就使用单例模式.方案我们使用单例设计模式可以解决这个问题.单例指的就是在某个类的内部维护自己一个对象实例,并只能通过单一接口暴露出去.一般我们实现单例可以用饿汉模式和懒汉模式.说白了就是先创建好对象等待着,还是等你要的时候我再给你创建.两个方式都可以实现,唯一的区别是在实现懒汉的时候要考虑并发性的问题.单例的作用场景一般是用在全局只用一个对象的场合,比如我们手机打开一个APP,这个进程就是一个单例,下次点击

2021-03-31 00:32:30 100

原创 设计模式这样玩泰简单(Golang版)-原型(蝇量)模式

场景老板:我们要大规模生产一种产品,每个产品的规模大小都是一模一样的,实现吧你:好的,那就使用原型(蝇量)模式方案我们使用原型模式,通过拷贝的方法,拷贝一个对象自身的属性,产生一个一摸一样的自己来满足这个需求.注意:一般我们说的拷贝分深拷贝跟浅拷贝,也就是所谓的值拷贝和指针拷贝.Golang天生就是一个中意值拷贝的语言,只要你不刻意去使用指针,那么就是一个值拷贝参数传递模式.实现see:https://github.com/jjtHappy/design-pattern-so-simpl

2021-03-23 00:28:29 81

原创 设计模式这样玩泰简单(Golang版)-建造者模式

场景老板:生产一类复杂的产品,这些产品有同样的生产规模,都需要经过N道复杂工序制作.不同产品的工序处理方式可能有些区别,以后可能还会有这样的产品出来,设计一个做产品的方案吧你:好的老板,那就使用建造者模式方案1.考虑产品的生产工序复杂,所以我们可以把生产产品的过程封在建造者内部.对每一道步骤定义为一个方法,由客户自行调用完成.注意其实这里还可以多一个所谓的指导者角色,就是指导生产产品的过程.2.多种产品的规模相同,但是工序不同,所以可以用抽象对具体产品做抽象3.对待不同的产品需要不同的建造者

2021-03-19 00:49:07 125 2

原创 设计模式这样玩泰简单(Golang版)-抽象工厂模式

场景老板:设计一个万能工厂,目前可以生产产品A跟B,以后可能要生产C,D…这些产品都属于同一个产品族你:好的老板,那就使用抽象工厂模式方案产品会随时间推移而增加,这些产品的属性相似,我们可以称为他们是一个产品族,我们使用一个抽象工厂(即能生产同一产品族的万能工厂)解决这个问题,这样我们的代码就可以无限扩展实现see:githubpackage mainimport "fmt"type Product stringtype AbstractFactory interface {

2021-03-16 22:43:29 390 6

原创 设计模式这样玩泰简单(Golang版)-工厂模式

场景老板:“设计一个让工厂生产产品的场景,现在目前有工厂A生产A跟工厂B生产B,未来可能还有C跟D,写代码吧”你:“好的,工厂模式可以搞定”方案工厂跟产品都会随时间推移进行增加,所以我们可以用接口跟抽象类来描述工厂跟产品,通过具体的实现来表示每一个不同的工厂跟产品,这样我们的代码就可以无限扩展实现package mainimport "fmt"//工厂接口type AbstractFactory interface { Produce() AbstractProduct}

2021-03-15 02:03:09 104

原创 工作三年了,要不要跳槽

工作三年了,要不要跳槽跳!有许多读者看了我的2020年回顾都私信问我到底现在的他是否应该跳槽,我想通过这篇文章说一下我的故事,帮助读者分析当前现状分析利弊,勇敢的去做出选择.作者是在17年毕业,从实习开始就在一个传统it行业的公司A做Java开发的工作,在A公司的三年间,沉淀了许多相关的业务技术经验,也算是一个高级技工,生活工作也算是能平衡.但在工作到三年的这个时间点,心里总是有许多的不满足,让我萌生了跳槽的想法,但当人想要去破圈的时候也总会冒出温水泡青蛙的安逸想法,有那么一段时间跳槽想法跟安逸想法在

2021-03-14 00:15:00 476

原创 回望2020,那些在局里做题的日子

回望2020,那些在局里做题的日子本来想写的是年中的总结,拖延到了年底,好吧那就写写年终总结,过了年才意识到再不写就变成了故事了这不是干货,是属于自己对2020的总结,复盘一下一年以来的收获总结与成长,未来就继续努力吧,这故事就分为前中后,收获点随着时间点进行穿插。取名那些在局里做题的日子,那是因为之前的公司做的是公安行业的项目,大部分的时间都在出差,去公安局,虽然在局里,面对所谓的大型行业互联网系统,谁也阻止不了谁的成长,只要你想。一、年头,是疫情在家的日子其实自己从2019年年头就已经有了想

2021-02-21 03:33:46 261 2

原创 NGINX的location的匹配规则迷?不迷!

准则URL击中规则程度越高,优先级越高分类前缀匹配:location XXX {}普通前缀匹配location ^~ XXX {}特殊前缀匹配,如果击中则断路,不再判断正则匹配规则,参加下述流程精确匹配:location = XXX {}普通精确匹配正则匹配:location ~ XXX {}区分大小写正则匹配location ~* XXX {}不区分大小写的正则匹配流程URL---->精确匹配---->正则匹配(优先

2020-12-15 12:47:57 276

原创 java对象hashCode存在的必要性是什么?

加快判断两个对象是否相等为什么是“加快”判断呢?接下来我们好好履履什么是hashCode,还有hashCode的作用场景,只要清晰的认识到hashCode的整个逻辑,什么八股“hashCode跟equals”这种问题再也不会难倒了。1、hashCode是什么?1.1、从源码看起 /** * Returns a hash code value for the object. This method is * supported for the benefit of has.

2020-12-03 23:18:02 936

原创 http1.1长链接通过什么手段判断一个请求已经结束了?

由状态码决定的没有消息体的请求(1XX,204,304),那么接受到请求头后则结束。Transfer-Encoding为chunked的时候,接受到一个长度为0的chunkedContent-Length描述body长度,但是如果有transfer-length那么这个头就会被忽略,因为这样的话就是使用了以上第二种的方式关闭链接总结:可以理解为判断是否结束为判断是否读取完整个请求-> 是否拥有请求体,有点的话 -> 判断请求体大小判断 -> 静态判断利用Con.

2020-11-21 23:39:55 2549 1

图片检索jar包

/** * 相似图片的搜索技术 * * 通过把一张图片压缩简化,把像素点经过离散余弦变换(表示为DCT( Discrete Cosine Transformation))算取均值求的图片指纹, * 然后通过汉明距离来判别图片是否想似的 * * 步骤: (1)缩小尺寸:pHash以小图片开始,但图片大于8*8,32*32是最好的。这样做的目的是简化了DCT的计算,而不是减小频率。 * (2)简化色彩:将图片转化成灰度图像,进一步简化计算量。 (3)计算DCT:计算图片的DCT变换,得到32*32的DCT系数矩阵。 * (4)缩小DCT:虽然DCT的结果是32*32大小的矩阵,但我们只要保留左上角的8*8的矩阵,这部分呈现了图片中的最低频率。 * (5)计算平均值:如同均值哈希一样,计算DCT的均值。 * (6)计算hash值:这是最主要的一步,根据8*8的DCT矩阵,设置0或1的64位的hash值,大于等于DCT均值的设为 * ”1”,小于DCT均值的设为“0”。组合在一起,就构成了一个64位的整数,这就是这张图片的指纹。 名词定义pHash:加强版的哈希感知技术 * * @author 江锦泰 * */

2016-02-02

空空如也

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

TA关注的人

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