自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

转载 Redis底层数据结构

简单动态字符串都知道redis是通过c语言来编写的,但是c语言里面的字符串修改,存储等有诸多问题,不符合redis的设计思路,所以作者就自己定义了一种简单动态字符串简称SDS.SDS的定义SDS遵循了C字符串以空格字符结尾的惯例,保存空字符的1字节空间,但是不计算在SDS的len属性里面,并且为空字符串分配额外的1字节的空间,以及添加空字符到字符串末尾等操作,都是有SDS函数完成的,对开发者了来说是透明的,不用关心.1个字符的\0,不算入字符串的len中,也不做为r...

2020-05-10 23:25:00 250

转载 浅谈MySQL并发控制:隔离级别、锁与MVCC

前言如果数据库中的事务都是串行执行的,这种方式可以保障事务的执行不会出现异常和错误,但带来的问题是串行执行会带来性能瓶颈;而事务并发执行,如果不加以控制则会引发诸多问题,包括死锁、更新丢失等等。这就需要我们在性能和安全之间做出合理的权衡,使用适当的并发控制机制保障并发事务的执行。并发事务带来的问题首先我们先来了解一下并发事务会带来哪些问题。并发事务访问相同记录大致可归纳为以下3种情况:...

2020-04-29 23:36:52 321

转载 实例浅析epoll的水平触发和边缘触发

一.基本概念 我们通俗一点讲:Level_triggered(水平触发): 当被监控的文件描述符上有可读写事件发生时,epoll_wait()会通知处理程序去读写。如果这次没有把数据一次性全部读写完(如读写缓冲区太小), 那么下次调用 epoll_wait()时,它还会通知你在上...

2020-02-26 00:12:46 576

原创 MySQL索引结构解析

前言Hello我又来了,快年底了,作为一个有抱负的码农,我想给自己攒一个年终总结。自上上篇写了手动搭建Redis集群和MySQL主从同步(非Docker)和上篇写了动手实现MySQL读写分离and故障转移之后,索性这次把数据库中最核心的也是最难搞懂的内容,也就是索引,分享给大家。这篇博客我会谈谈对于索引结构我自己的看法,以及分享如何从零开始一层一层向上最终理解索引结构。从一个简单的表开...

2020-02-19 23:45:45 461 1

原创 IO多路复用之Epoll

IO多路复用的原理IO多路复用的四个关键词:监控者、内核态、用户态、文件句柄。IO多路复用的五个关键问题(步骤):1.监控者如何将文件句柄从用户态传递到内核态。 2.内核如何判断文件句柄的读写状态 3.内核如何通知监控者文件句柄可读可写 4.监控着如何找到可读写的文件句柄并通知应用态的应用程序 不同的多路复用接口都是基于对这四个问题的不同解答实现的。 5.继续循环时,监控者怎么...

2020-02-19 14:49:12 257

转载 二叉查找树与平衡二叉树

二叉查找树  二叉查找树,也称二叉搜索树,或二叉排序树。其定义也比较简单,要么是一颗空树,要么就是具有如下性质的二叉树:(1)若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;(2) 若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;(3) 任意节点的左、右子树也分别为二叉查找树;(4) 没有键值相等的节点。  如上图所示,是不同形态的...

2019-12-19 17:38:15 192

转载 通过策略模式+工厂模式重构 if-else

对于业务开发来说,业务逻辑的复杂是必然的,随着业务发展,需求只会越来越复杂,为了考虑到各种各样的情况,代码中不可避免的会出现很多if-else。一旦代码中if-else过多,就会大大的影响其可读性和可维护性。首先可读性,不言而喻,过多的if-else代码和嵌套,会使阅读代码的人很难理解到底是什么意思。尤其是那些没有注释的代码。其次是可维护性,因为if-else特别多,想要新加一个分...

2019-10-21 15:18:31 529

转载 PHP-FPM的三种模式和worker进程、master进程详解

关于FPM的概念请看之前写过的博文CGI、FastCGI和php-fpm概念和区别这里主要讨论fpm的模式和worker进程、master进程PHP-FPM的三种模式参考:https://www.jianshu.com/p/c9a028c834ff(1)pm=static始终保持固定数量的worker进程数,由pm.max_children决定。(2)pm=dynamic...

2019-09-20 15:28:26 1213

转载 PHP-FPM内存持续占用问题

最近发现博客的内存老是隔三差五地被“吃掉”了,登录到后台后偶尔会出卡顿的情况,一开始怀疑是Swap不够导致的,于是给VPS主机增加了几个G的Swap,观察了一段时间后发现再大的Swap也被慢慢地“吃掉”了!很显然是PHP某些服务一直在占用着VPS的内存没有释放,导致物理内存耗尽后调用了Swap,显然Swap没有物理内存运行的效率高,于是就出现了进程卡死的情况了。考虑到挖站否现在用的Wordpr...

2019-09-20 15:14:38 690

转载 进程fork两次---解决一个进程不必等待子进程终止,也不希望子进程处于僵死状态

总结下两次fork()的作用首先,要了解什么叫僵尸进程,什么叫孤儿进程,以及服务器进程运行所需要的一些条件。两次fork()就是为了解决这些相关的问题而出现的一种编程方法。孤儿进程 孤儿进程是指父进程在子进程结束之前死亡(return 或exit)。如下图1所示:图1 孤儿进程但是孤儿进程并不会像上面画的那样持续很长时间,当系统发现孤儿进程时,ini...

2019-08-15 23:07:32 471 1

原创 PHP_ZVAL:引用计数,写时拷贝

1、php语言特性PHP是脚本语言,所谓脚本语言,就是说PHP并不是独立运行的,要运行PHP代码需要PHP解析器,用户编写的PHP代码最终都会被PHP解析器解析执行PHP的执行是通过Zend engine(ZE, Zend引擎),ZE是用C编写的用户编写的PHP代码最终都会被翻译成PHP的虚拟机ZE的虚拟指令(OPCODES)来执行也就说最终会被翻译成一条条的指令既然这样,有什么结果和你...

2019-08-14 18:59:55 252

转载 理解 Nginx 和 Swoole 的高并发原理

阅前热身为了更加形象的说明同步/异步、阻塞/非阻塞,我们以小明去买奶茶为例。同步与异步同步:当一个同步调用发出去后,调用者要一直等待调用结果的通知,直到得到调用结果。 异步:当一个异步调用发出去后,调用者不能立即得到调用结果的返回。对于异步调用,要想获得结果,一般有2种方式:主动轮询异步调用的结果 被调用方通过callback来通知调用方调用结果举个栗子同步买奶茶:小明...

2019-08-10 18:05:23 274

原创 PHP中pack、unpack的详细用法(字节序)

PHP中有两个函数pack和unpack,很多PHPer在实际项目中从来没有使用过,甚至也不知道这两个方法是用来干嘛的。这篇文章来为大家介绍一下它俩到底是用来干啥的。packstring pack ( string $format [, mixed $args [, mixed $... ]] )该函数用来将对应的参数($args)打包成二进制字符串。其中第一个参数$format...

2019-08-07 20:28:17 1370

转载 TCP的三次握手与四次挥手(详解+动图)

背景描述通过上一篇中网络模型中的IP层的介绍,我们知道网络层,可以实现两个主机之间的通信。但是这并不具体,因为,真正进行通信的实体是在主机中的进程,是一个主机中的一个进程与另外一个主机中的一个进程在交换数据。IP协议虽然能把数据报文送到目的主机,但是并没有交付给主机的具体应用进程。而端到端的通信才应该是应用进程之间的通信。UDP,在传送数据前不需要先建立连接,远地的主机在收到UDP报文后...

2019-08-07 15:58:58 108

转载 容器的工作基础—Namespace、Cgroup

通俗的来说容器其实是一种沙盒技术。顾名思义,沙盒就是能够像一个集装箱一样,把你的应用“装”起来的技术。这样,应用与应用之间,就因为有了边界而不至于相互干扰;而被装进集装箱的应用,也可以被方便地搬来搬去。不过,这两个能力说起来简单,但要用技术手段去实现它们,确并不是很容易。所以,本篇文章就来剖析一下容器的实现方式我们知道一个程序被执行起来之后,它就会从磁盘上的二进制文件,变成了计算机内存中的数据...

2019-08-06 18:15:23 203

转载 五种IO模型介绍和对比

五种IO模型介绍和对比前言 unix提供的IO模型有几种,分别有哪些? 各种IO模型的特点是什么?他们有什么区别? 阻塞,非阻塞,同步,异步的区别? epoll为什么高效? 概述普通输入操作包含的步骤 等待数据准备好 从内核向进程复制数据 网络数据输入包含的步骤 等待数据从网络送达,到达后被复制到内核缓冲区 把数据...

2019-07-30 11:52:23 484

转载 用户态与内核态(用户空间与内核)

unix和linux的体系架构:分为用户态和内核态unix和linux的体系架构.png 内核态:控制计算机的硬件资源,并提供上层应用程序运行的环境。 用户态:上层应用程序的活动空间,应用程序的执行必须依托于内核提供的资源。 系统调用:为了使上层应用能够访问到这些资源,内核为上层应用提供访问的接口。 三者之间的关系如下:内核...

2019-07-30 11:34:25 187

转载 API网关从入门到放弃

前言假设你正在开发一个电商网站,那么这里会涉及到很多后端的微服务,比如会员、商品、推荐服务等等。那么这里就会遇到一个问题,APP/Browser怎么去访问这些后端的服务? 如果业务比较简单的话,可以给每个业务都分配一个独立的域名(https://service.api.company.com),但这种方式会有几个问题:每个业务都会需要鉴权、限流、权限校验等逻辑,如果每个业务都各自为...

2019-07-02 18:47:16 315

转载 RabbitMQ的基本概念

前言:MQ是什么?队列是什么,MQ我们可以理解为消息队列,队列我们可以理解为管道。以管道的方式做消息传递。场景: 1.其实我们在双11的时候,当我们凌晨大量的秒杀和抢购商品,然后去结算的时候,就会发现,界面会提醒我们,让我们稍等,以及一些友好的图片文字提醒。而不是像前几年的时代,动不动就页面卡死,报错等来呈现给用户。 在这业务场景中,我们就可以采用队列的机制...

2019-06-21 19:10:51 87

转载 PHP代码Git提交前添加 phpcs 语法检查

1.安装phpcssudo apt install php-codesniffer设置标准phpcs --config-set default_standard PSR2设置编码phpcs --config-set encoding utf-82.git集成提交前代码检查打开当前项目的.git/hooks目录,里面有很多xxx.sample文件, 其中一个就是pr...

2019-06-05 17:56:55 368

转载 消息队列选型

写在前面 我们知道,目前市面上的MQ包括Kafka、RabbitMQ、ZeroMQ、RocketMQ等等。 那么他们之间究竟有什么本质区别,分别适用于什么场景呢?上述抛出的问题,同样在不少公司的Java工程师面试中出现,特别是当你简历上的技术栈包含了这些技术,面试官往往喜欢用这个问题,对你进行摸底考察。本文我们就一起来探讨一下。(1)有Br...

2019-05-31 10:24:57 259

转载 gRPC 使用 protobuf 构建微服务

gRPC 使用 protobuf 构建微服务微服务架构单一的代码库以前使用 Laravel 做 web 项目时,是根据 MVC 去划分目录结构的,即 Controller 层处理业务逻辑,Model 层处理数据库的 CURD,View 层处理数据渲染与页面交互。以及 MVP、MVVM 都是将整个项目的代码是集中在一个代码库中,进行业务处理。这种单一聚合代码的方式在前期实现业务...

2019-05-16 13:42:26 525 1

转载 PHP关于DI以及IOC的理解

DIDI 就是常说的依赖注入,那么究竟什么是依赖注入呢?打个比方,电脑(非笔记本哈)需要键盘和鼠标我们才能进行操作,这个‘需要’换句话说就是‘依赖’键盘和鼠标。那么,相应的,一个类需要另一个类才能进行作业,那么这也就是依赖。看一段代码: class Computer { protected $keyboard; public func...

2019-05-16 13:40:04 180

转载 基于 OpenResty 的接口网关设计

本文讲述基于OpenResty的接口网关设计,主要谈及接口网关的请求路由与安全认证(IP 与 URI 白名单、加解密与验签名流程等)这两部分内容,其中涉及到的Nginx、OpenResty等相关内容会作简单介绍。温馨提示:文章图片中的文字较小,为了更好的阅读体验,建议 PC 端阅读。谈谈基于 OpenResty 的接口网关设计 〇、前言 一、什么是接口网关 1.1 定位...

2019-05-08 17:48:28 3042

转载 Curl 命令参数详解

Linux的Curl命令,在不同场景下,需要拼接不同的参数实现需求,简单做个备忘常用参数详解参数 描述 -I/--head 只显示传输文档,经常用于测试连接本身 -o/--output 把输出写到该文件中,必须输入保存文件名 -O/--remote-name 把输出写到该文件中,保留远程文件的文件名 -F/--form 模拟表单提交 ...

2019-05-08 11:21:57 14989

原创 Golang关于gRPC的实践

传递数据格式:ProtoBuf需要工具主要包括:编译器:protoc,以及一些官方没有带的语言插件; 运行环境:各种语言的 protobuf 库,不同语言有不同的安装来源;语法类似 C++ 语言,可以参考语言规范。比较核心的,message是代表数据结构(里面可以包括不同类型的成员变量,包括字符串、数字、数组、字典……),service代表 RPC 接口。变量后面的数字是代表进...

2019-04-30 17:13:59 1597

转载 PHP开启Opcache

我们在日常的PHP开发过程中,应该经常会听见Opcache这个词,那么啥是Opcode呢?Opcache 的前生是Optimizer+,它是PHP的官方公司 Zend 开发的一款闭源但可以免费使用的 PHP 优化加速组件。 Optimizer+ 将PHP代码预编译生成的脚本文件Opcode缓存在共享内存中供以后反复使用,从而避免了从磁盘读取代码再次编译的时间消耗。同时,它还应用了一些代...

2019-04-29 18:51:59 377

转载 Go语言之关于 interface 的 10 个问题

1. Go 语言与鸭子类型的关系先直接来看维基百科里的定义:If it looks like a duck, swims like a duck, and quacks like a duck, then it probably is a duck.翻译过来就是:如果某个东西长得像鸭子,像鸭子一样游泳,像鸭子一样嘎嘎叫,那它就可以被看成是一只鸭子。Duck Typin...

2019-04-28 10:24:42 220

转载 Docker学习路线之Dockerfile指令详解

1.Dockerfile指令详解1.FROM指定基础镜像FROM指令用于指定其后构建新镜像所使用的基础镜像。如果本地不存在,则默认会去Docker Hub下载指定镜像。FROM指令必是Dockerfile文件中的首条命令,启动构建流程后,Docker将基于该镜像构建新镜像,FROM后的命令也会基于这个基础镜像。FROM语法格式为:FROM <image>或FROM ...

2019-04-26 16:58:12 364

转载 Docker学习路线之Dockerfile使用介绍

Dockerfile是一个文本格式的配置文件,用户可以使用Dockerfile来快速创建自定义的镜像。1.Dockerfile概念我们使用Dockerfile定义镜像,依赖镜像来运行容器,因此Dockerfile是镜像和容器的关键。首先通过一张图来了解Docker镜像、容器和Dockerfile三者之间的关系。img通过上图可以看出使用Dockerfile定义镜像,运行镜像...

2019-04-26 16:57:35 113

转载 Docker学习路线之Docker基础(安装和测试)

了解了Docker的作用之后,不是很能体会Docker的实际作用。先结合小例子实战一下,才会对Docker容器的真正的理解(主要是和之前运维的工作方式做对比),最后就是将之前goWeb项目部署体会一下。1.Docker的安装(Centos版本)1.使用yum安装执行以下命令安装依赖包:$ sudo yum install -y yum-utils \ d...

2019-04-26 16:56:43 239

转载 Docker学习路线之Docker介绍

Docker是一个开放源代码软件项目,让应用程序布署在软件容器下的工作可以自动化进行,借此在Linux操作系统上,提供一个额外的软件抽象层,以及操作系统层虚拟化的自动管理机制。 Docker利用Linux核心中的资源分脱机制,例如cgroups,以及Linux核心名字空间,来创建独立的软件容器。 维基百科1.png1.什么是Docker?Docker 是世界领先的软件容器平台。...

2019-04-26 16:55:31 234

转载 Redis哨兵、复制、集群的设计原理与区别

谈到Redis服务器的高可用,如何保证备份的机器是原始服务器的完整备份呢?这时候就需要哨兵和复制。 哨兵(Sentinel):可以管理多个Redis服务器,它提供了监控,提醒以及自动的故障转移的功能。 复制(Replication):则是负责让一个Redis服务器可以配备多个备份的服务器。 Redis正是利用这两个功能来保证Redis的高可用。哨兵(sentina...

2019-04-25 15:54:01 323

转载 gRPC的PHP客户端

因为工作需求使用gRPC,这里的服务端采用 GO ,客户端有PHP,GO。服务端的部署这里就不写了,只写PHP的客户端。本人使用的是windows10,不过linux的操作流程基本一样。直接进入主题,分为了几部分1、下载Protoc下载地址:https://github.com/google/protobuf/releases这里采用的二进制文件,选择对应的平台,下载proto...

2019-04-18 17:49:27 4441 1

转载 oh-my-zsh: 让终端飞

上一次推文写了JupyterLab:程序员的笔记本神器,介绍的是如何在web端打造一个便捷的开发环境,发出后反响还不错因此我决定再写几篇能提升程序员工作以及学习效率的文章,如果能形成一个系列那是最好~如果你有自己的效率工具以及方案,欢迎留言讨论什么是oh-my-zsh诸位大佬都知道,Linux下shell默认是bash,但还有一种shell,叫做zsh它比bash更加强...

2019-04-16 14:19:21 258

转载 TCP基础知识

记得以前面试的时候被面试官问起TIME_WAIT有什么痛点,当时只记得TCP三次握手、四次挥手之类的,至于其中的某个状态还真是记不起来,之前也没有过多关注过,还有对于拥塞控制的概念也比较模糊。TCP报文格式TCP大家都知道是什么东西,这个协议的具体报文格式如下:标志位 URG:指示报文中有紧急数据,应尽快传送(相当于高优先级的数据)。 PSH:为1表示是带有push...

2019-04-09 14:12:50 242

转载 Redis的字符串底层实现

在面试前按常规套路准备了一下,比如 Redis 的常用5种数据结构,Redis持久化策略,Redis实现分布式锁,简单发布订阅等等都准备了,当时不知天高地厚以为十拿九稳了,可是万万没想到我终究还是在Redis的被问的第一个问题上翻船了~~面试官:看你简历上写了熟悉常用数据结构,都有哪些说说本人:常用有5种,string,list,set,zset,hash(内心很得意)面试官:那你说...

2019-04-08 11:25:49 143

转载 Docker入门总结

Docker是什么?在计算机技术日新月异的今天,Docker在国内发展的如火如荼,特别是在一线互联网公司,Docker的使用是十分普遍的,甚至成为了一些企业面试的加分项,不信的话看看下面这张图。这是我在某招聘网站上看到的招聘Java开发工程师的招聘要求,其中有一条熟悉docker成为了你快速入职的加分项,由此可见熟悉docker在互联网公司的地位之重要。当然对于...

2019-04-08 10:48:45 216

转载 漫话:布隆算法概述

Bloom Filter计算方法如需要判断一个元素是不是在一个集合中,我们通常做法是把所有元素保存下来,然后通过比较知道它是不是在集合内,链表、树都是基于这种思路,当集合内元素个数的变大,我们需要的空间和时间都线性变大,检索速度也越来越慢。 Bloom filter 采用的是哈希函数的方法,将一个元素映射到一个 m 长度的阵列上的一个点,当这个点是 1 时,那么这个元素在集合内,反之则不在集合...

2019-04-03 10:41:58 268

转载 一致性哈希算法概述

在了解一致性哈希算法之前,最好先了解一下缓存中的一个应用场景,了解了这个应用场景之后,再来理解一致性哈希算法,就容易多了,也更能体现出一致性哈希算法的优点,那么,我们先来描述一下这个经典的分布式缓存的应用场景。场景描述假设,我们有三台缓存服务器,用于缓存图片,我们为这三台缓存服务器编号为0号、1号、2号,现在,有3万张图片需要缓存,我们希望这些图片被均匀的缓存到这3台服务器上,以便它们能够...

2019-03-29 10:32:21 112

空空如也

空空如也

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

TA关注的人

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