自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 pb文件转go文件

Protobuf是Protocol Buffers的简称,它是Google公司开发的一种数据描述语言,用于描述一种轻便高效的结构化数据存储格式,并于2008年对外开源。Protobuf可以用于结构化数据串行化,或者说序列化。它的设计非常适用于在网络通讯中的数据载体,很适合做数据存储或 RPC 数据交换格式,它序列化出来的数据量少再加上以 K-V 的方式来存储数据,对消息的版本兼容性非常强,可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。

2023-06-12 18:44:44 341 1

原创 TPS、QPS和系统吞吐量的区别和理解

一、QPS/TPSQPS:Queries Per Second意思是“每秒查询率”,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。TPS:是TransactionsPerSecond的缩写,也就是事务数/秒。它是软件测试结果的测量单位。一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数。Tps即每秒处理事务数,包括了1)用户请求服务器2)服务器

2020-07-11 10:40:28 500

原创 golang protobuf 的序列化和反序列化

1、通过proto文件生成go代码hello.protosyntax = "proto3";package prototest;message Test { int32 num = 1; string msf = 2;}hello.pb.go// Code generated by protoc-gen-go. DO NOT EDIT.// source: hello.proto/*Package prototest is a generated protocol

2020-06-30 19:37:04 1138

原创 软件开发模式

1、TDD:测试驱动开发(Test-Driven Development)测试驱动开发是敏捷开发中的一项核心实践和技术,也是一种设计方法论,TDD首先考虑使用需求(对象、功能、过程、接口等)主要是编写测试用例框架对功能的过程和接口进行设计,而测试框架可以持续进行验证。大行其道的一些模式对TDD的支持都非常不错,比如MVC和MVP等2、BDD:行为驱动开发(Behavior Driven Development)也就是行为驱动开发。这里的B并非指的是Business,实际上BDD可以看作是对TDD的一

2020-06-28 14:06:01 163

原创 用户运营,产品运营,内容运营,活动运营到底是个什么关系?

背景曾经做了很长时间的运营活动,最近偶然的机会了解到运营其实是划分很多块,而我做的这部分活动运营。还有用户运营,产品运营,内容运营。那么它们之间到底是个什么关系,在我心里留下了一个问号?运营核心为了产品能够活得更好更持久,尽可能放大产品的覆盖用户量和延长产品的生命周期。内容运营内容运营这样一个分支,其实核心要解决的问题是:围绕着内容的生产和消费搭建起来一个良性循环,持续提升各类跟内容相关的数据,如:内容数量、内容浏览量、内容互动数、内容传播数……等等。用户运营跟内容运营相似,所谓用户运营这样一

2020-06-04 13:57:32 910

原创 字符串匹配算法的原理和实现

问题引出假设现在我们面临这样一个问题:有一个文本串S,和一个模式串P,现在要查找P在S中的位置,怎么查找呢?暴力匹配如果用暴力匹配的思路,并假设现在文本串S匹配到 i 位置,模式串P匹配到 j 位置,则有:如果当前字符匹配成功(即S[i] == P[j]),则i++,j++,继续匹配下一个字符;如果失配(即S[i]! = P[j]),令i = i - (j - 1),j = 0。相当于每次匹配失败时,i 回溯,j 被置为0。理清楚了暴力匹配算法的流程及内在的逻辑,咱们可以写出暴力匹配的代码,如

2020-05-25 20:37:27 582

原创 如何用链表实现队列?

定义队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。代码实现建立在这篇文章的基础上链表的实现class LinkListQueue extends LinkList { public $tail; //尾结点 /** * @param mixed $val * @return */

2020-05-23 17:04:21 240

原创 如何用链表实现栈?

定义栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。代码实现建立在这篇文章的基础上链表的实现public function push($val){ $this->addFirst($val);}public fu

2020-05-23 15:54:34 987

原创 如何查找链表的倒数第K个结点

解题思路1:链表的长度为size 循环size -k次2:原地反转,循环k次3:双指针,让A指针先走k步。然后A、B再同时开始走,当A到结尾时,此时B所处的位置就是k结点边界条件1:链表为空2:k<= 03:k >= size代表实现建立在这两篇博客的基础上链表的实现链表反转public function getLastNodeBySize($k) { if(!$this->commonCheck($k)){ return null;

2020-05-22 20:22:55 280

原创 如何获得链表的中间节点?

解题思路1:双指针法:开始时都指向头节点,一个步长为2,另一个步长为1。经过n次循环后,步长为2的的指针到达尾部时,步长为1的指针所处的位置正好是中间节点2:循环 sum/2 次边界条件链表为空代码实现建立在这篇博客的基础上如何实现链表public function getInterNodeByDoublePointer() { $slow = $this->head->next; if($slow == null) { return "";

2020-05-19 13:15:30 306

原创 如何知道链表是否有环?

解题思路1:遍历链表,把元素存在map中,如果map中存在该元素,说明有环2:通过快慢指针,每个指针每次不一样的跨度,如果在某一时刻,两个指针相遇,说明有环边界条件链表是否为空代码实现建立在这篇代码的基础上php实现链表#新增一个全局变量public $map; //用来判断链表是否有环#新增3个方法#方式1public function isLoopLinkListByDoublePointer() { $slow = $this->head->next;

2020-05-18 20:52:51 248

原创 如何将两个有序链表合并成一个链表

解题思路具体思想就是新建一个链表,然后比较两个链表中的元素值,把较小的那个链到新链表中,由于两个输入链表的长度可能不同,所以最终会有一个链表先完成插入所有元素,则直接将另一个未完成的链表直接链入新链表的末尾。实现方案1:递归算法(代码也容易理解,但是它的弊端也很明显时间空间开销都很大,效率低)2:非递归算法边界条件1:两个链表都为空2:有一个链表为空代码实现建立在这篇博客的基础上如何实现链表递归算法function mergeByRecursion($node1, $node2){

2020-05-17 17:48:28 2897

原创 统计链表结点的长度的2种方式

解题思路1:可以加一个占位 size变量 然后后边增删都维护这个占位,复杂度O(1)。2:遍历链表,来获取长度,复杂度O(n)。代码实现建立在这篇博客的基础上如何实现链表 public function getLinkListSize() { return $this->size; }...

2020-05-17 12:00:40 701

原创 链表常用操作大集合

前言主要是做一个汇总,方便自己和有需要的人查看。一个一个搜比较费劲。目录如何实现链表如何知道链表是否有环链表如何反转判断两个链表是否相交并找出相交点如何从尾部打印链表持续更新!!!...

2020-05-17 11:27:40 215

原创 链表如何从尾部开始打印?

解题思路遍历+栈边界条件1:链表为空2:链表只有一个元素代码实现建立在这篇博客的基础上如何实现单链表public function tailPrint(){ $prev = $this->head->next; if($prev == null){ echo "链表为空"."\n"; return; } //如果只有一个元素 直接打印返回就好了 if($prev->next == null){

2020-05-17 11:17:13 288 1

原创 如何判断两个链表是否相交并找出交点

解题思路情况1:两个链表均不含有环1、直接法采用暴力的方法,遍历两个链表,判断第一个链表的每个结点是否在第二个链表中,时间复杂度为O(len1*len2),耗时很大。2、hash计数法如 果 两个链表相交,则两个链表就会有共同的结点;而结点地址又是结点唯一标识。因而判断两个链表中是否存在地址一致的节点,就可以知道是否相交了。可以对第一 个链表的节点地址进行hash排序,建立hash表,然后针对第二个链表的每个节点的地址查询hash表,如果它在hash表中出现,则说明两个链表有共 同的结点。这个方法

2020-05-16 23:02:07 6002

原创 实现链表反转的2种方法

解题思路1:头节点插入法创建一个新的链表,然后循环旧链表并使用头插法插入数据到新的链表,完成后便是一个反转的链表2:原地反转头结点插入法的实质是重新创建了一个新的链表,通过遍历待反转链表,将链表每一个节点插入到创建的链表中,然后的到的这个创建的链表就是反转后的链表。而就地反转实质就是在待反转链表基础上修改节点顺序得到反转链表。边界条件1:链表为空2:链表只有一个元素代码实现建立在这篇博客的基础上php实现链表$tmpLinkList = new LinkList(); //头插法反

2020-05-16 15:08:23 3909

原创 如何实现链表?

定义链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。相比于线性表顺序结构操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)和O

2020-05-13 20:02:48 1040

原创 bitmap原理和实现

前言我们知道一个1G=1024M,1M=1024K,1K=1024byte,1byte=8bit,所以1个字节等于8bit,也就是8个二进制位,位图法的概念是用一个位(bit)来标记某个数的存放状态,所以节省了大量的空间。原理以二进制位来表示数字例如:第27位为1,第28位为0。表示在map中27存在28不存在应用场景大量数据进行排序,查找和去重上可以使用这个策略来降低内存的使用数据结构unsigned int bit[N],在这个数组里面,可以存储NPHP_INT_SIZE8个数据,但是最

2020-05-10 16:49:19 689

原创 golang sleep库使用

golang的休眠可以使用time包中的sleep。函数原型为:func Sleep(d Duration)其中的Duration定义为:type Duration int64`Duration的单位为 nanosecond。为了便于使用,time中定义了时间常量:const (Nanosecond Duration = 1Microsecond = 1000 * Nanos...

2020-05-08 16:03:11 1784

原创 微服务如何测试?

前言测试是我们的代码发布至生产环境前最重要的一关,那么如何高效、有效测试缺留下了一些疑问,接下来我们简单聊一聊。测试分类面向业务1:验收测试我们是否实现了正确的功能?2:探索性测试(手工)可用性测试,我如何破坏系统功能支持团队1:验收测试我们是否实现了正确的功能?2:单元测试(xunit系列框架)我们是否正确地实现了功能评价产品1:探索性测试(手工)可用性测试,我如何...

2020-05-05 21:48:17 3713

原创 微服务的一些概念

什么是微服务1:很小,专注于做好一件事随着新功能的增加,代码库会越变越大。时间久了代码库就会非常庞大,以至于想要知道该在什么地方做修改都很困难。尽管我们想在巨大的代码库中做到清晰地模块化,但事实上这些模块之间的界限很难维护。相似的功能代码开始在代码库中随处可见,使得修复bug或实现更加困难。在一个单块系统中,通常会创建一些抽象层或者模块来保证代码库的内聚性,从而避免上述问题。内聚性是指将相关...

2020-05-05 14:36:30 173

原创 golang time包常用操作整理

常用函数设置时区time包默认是UTC ,可以通过下面两种方式设置时区方法1:l,_ := time.LoadLocation("Asia/Shanghai")fmt.Println(time.Now().In(l))l,_ = time.LoadLocation("America/Adak")fmt.Println(time.Now().In(l))方法2:cstZone :...

2020-04-30 17:54:55 249

原创 根据端口号kill进程

查看指定端口号的进程ps aux | grep 8080kill进程kill -9 `lsof -i | grep 8080| awk '{print $2}'`

2020-04-30 14:51:39 166

原创 mysqldump的简单使用

mysqldump是什么一个数据库备份程序使用场景进行数据备份与恢复导出数据把符合条件的sql和表结构输出到data.sqlmysqldump -h 127.0.0.1 -P3306 -utest -ptest123! database table --skip-lock-tables --where="id=1" > ./data.sql –skip-lock-tabl...

2020-04-29 19:29:07 131

原创 查看目录大小命令

du命令用于显示目录或文件的大小。显示当前目录文件或者文件占用空间:du显示指定文件或文件夹的大小:du test.txt方便阅读的格式查看目录所占空间情况:du -h test仅显示当前文件夹的总计:du -s *以方便阅读的方式查看指定目录层级的空间占用情况:du -lh --max-depth=1df命令用于显示目前在Linux系统上的文件系统的磁盘使用情况统计。显示文件系...

2020-03-20 17:27:43 3009

原创 php与面向对象编程

为什么采用面向对象编程解决问题更容易设计计算机是为了解决人类的问题。这里有一个称为动态编程的过程,这是一种将大问题拆解为小问题的技术。其策略是先解决各个较小的问题,然后把所有结果汇总在一起形成一个更大的解决方案。模块化把一个问题分解为小的子问题,这个过程就是模块化过程。类与对象分解一个复杂问题会把它变换成多个简单的子问题,不过你需要有一种方法来组织这些模块,让它们相互协作共同处理所要解...

2020-03-16 22:12:16 121

原创 php7源码剖析

前言最近学习了php7源码,通过学习也知道了php是如何运转的,现在整理成博客方便自己和有需要的人查看。php7为什么这么快1:全新的zval 更节约的空间,栈上分配内存2:zend_string 存储字符串的Hash值,数组查询的时候不需要进行Hash计算3:在HashTable桶内直接存数据,减少了内存的申请次数,提升了cache命中率和内存访问速度4:zend_parse_par...

2020-03-16 17:59:13 327

原创 如何编写一个php扩展

前言本文采用7.4.3版本编写一个简单的扩展,供入门参考初始化通过ext_skel.php脚本创建了一个helloword扩展,脚本目录在/usr/local/php-7.4.3/ext目录下/usr/local/php7/bin/php ./ext_skel.php --ext helloword 接着会在当前目录下看到生成了一个helloworld文件夹加载方式介绍有两种加...

2020-03-16 17:35:06 254

原创 php基本语法实现的原理

break语法对于下面一段代码while(1) { break;}得到AST得到栈、符号表和常量得到指令集include语法对于下面一段代码include '1.php';echo 2;得到AST得到栈、符号表和常量得到指令集条件判断语法对于下面一段php代码$a = "php7";if($a == "php5") { echo "...

2020-03-15 21:32:21 160

原创 php代码的编译与执行

解释性语言也需要编译?我们来看下编译型语言和解释性语言的区别解析1:编译型的目标语言是二进制编码的机器码,可以在物理机上执行的2:解释型语言如php也是需要编译的,是实时编译,由php内核实现,涉及到词法、语法分析,最后生成的是opcodes,opcodes是类似于机器码的编码,但是这种编码物理机是不认识的,也是无法执行的,那么我们就需要在物理机上层加一个虚拟机,php内核在物理机上加了...

2020-03-15 17:19:49 916

原创 php运行的生命周期

前言通过本文可以了解到cli和fpm模式的生命周期、以及fastcgi协议。cli模式就是命令行模式cli模式的生命周期一共有5大阶段:php_module_startup //模块初始化阶段php_request_startup //请求初始化阶段php_execute_script //脚本执行阶段(读取你的代码,进行解析)php_request_shutdown //...

2020-03-15 11:25:40 733

原创 php7内存管理

前言C语言中申请内存:void *ptr = malloc(size) //size表示申请内存的大小释放内存:free(ptr) //引出一个问题 释放内存时候我们没有传size,那么它如何知道释放多少呢?答:维护了一个头部,来记录内存的大小,这只是一种方式。内存管理是为了解决什么问题?是为了解决free时不用传size,那它size是从哪确认的呢?是从free_map和map上,下...

2020-03-14 18:51:37 327

原创 php数组实现的原理

前言本文采用的php版本是7.4.3另外在了解数组实现前,需要知道zval是什么,如果不知道zval是什么,可以来我的这篇文章看下https://blog.csdn.net/onlymayao/article/details/104783731zend_array是什么php的array类型就是对应的zend_array...

2020-03-14 15:10:08 267

原创 php7引用类型的实现

前言在讲zend_reference之前,需要先了解下zval,如果还不了解zval是什么,可以先去我的这篇文章看下https://blog.csdn.net/onlymayao/article/details/104783731zend_reference是什么引用类型对应的就是zend_referencezend_reference的结构struct _zend_reference...

2020-03-13 21:26:12 114

原创 php7 zend_string与写时复制

在讲zend_string之前,需要先了解下zval,如果还不了解zval是什么,可以先去我的这篇文章看下https://blog.csdn.net/onlymayao/article/details/104783731

2020-03-13 20:26:58 267

原创 linux下安装gdb及简单使用

gdb解释UNIX及UNIX-like下的调试工具下载传送门:http://ftp.gnu.org/gnu/gdb/安装我下载的是:gdb-8.2.1.tar.gzwget http://ftp.gnu.org/gnu/gdb/gdb-8.2.1.tar.gztar xzvf gdb-8.2.1.tar.gzcd gdb-8.2./configure --prefix=/usr...

2020-03-13 20:19:49 418

原创 php7的安装

本文安装的版本是7.4.3,读者也可以去官网下载自己需要的版本传送门:https://www.php.net/downloads下载wget https://www.php.net/distributions/php-7.4.3.tar.gz解包tar xzvf php-7.4.3.tar.gz切到安装的目录cd php-7.4.3安装前看下都支持哪些可选参数./configur...

2020-03-11 21:25:11 146

原创 php7内核之zval

zval是什么zval是表示php变量的数据结构每个zval占用多大的空间一共占16个字节,value占8字节,u1和u2都占4字节。本文对应的php版本7.4.3下载地址:https://www.php.net/downloads源码文件php/include/php/Zend/zend_types.h文件整体结构struct _zval_struct { ze...

2020-03-11 20:19:04 277

原创 php7新增加的语法特性

1.传参和返回值类型声明strict_types名词解释:表示开启严格模式检查declare(strict_types=1);function test(int $a, int $b):int { return $a +$b;}2.NULL合并运算符//php7之前 我用三元运算符取个值是这样的$name = isset($_GET['name']) ? $_GET['na...

2020-03-10 21:03:20 301

空空如也

空空如也

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

TA关注的人

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