自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

程序猿的世界

「WHY」每一个你不满意的当下,都有一个你不曾努力的过去。

原创 github(基于gin开发的应用框架)

https://github.com/why444216978/gin-frame

2020-07-07 14:59:50 52 0

原创 领域驱动设计之:领域建模

一、项目的终极目标 普通开发者在开发一个项目时,可能考虑到的都是如何实现业务逻辑,同时提高程序性能,好一点的开发者会同时考虑到代码的复用性和扩展性,没错,上面提到的几点都是一个优秀的技术开发需要必备的素质,但是如果想要真正的做出好的项目,是需要深入了解项目所属领域的专业知识,从而设计出易于...

2020-07-05 17:39:40 58 0

原创 Go中闭包的隐含问题

问题 package main import ( "fmt" "sync" ) var wg sync.WaitGroup func main() { for i := 0; i < 10; i++ { wg.Add(1) go f...

2020-06-26 15:56:43 46 0

原创 Redis键过期策略源码解析(惰性删除+定期取样删除)

前言 从概念上讲,我只知道redis采用惰性删除加定期随机删除的策略去释放过期键的内存,但是并没有研究过其中的原理实现,今天以get命令为例,追了一下源码,剖析下惰性删除的实现过程。 源码追踪 命令入口 在server.c文件中查找对应的命令函数,对应的方法是getCommand st...

2020-06-25 17:04:15 125 0

原创 Redis数据结构之——redisObject

定义在server.h文件中 redisObject结构体 #define LRU_BITS 24 #define LRU_CLOCK_MAX ((1<<LRU_BITS)-1) /* Max value of obj->lru */ #define LRU_CLOCK_R...

2020-06-21 19:17:25 95 0

原创 Redis数据结构之——SDS

SDS的定义 /* Note: sdshdr5 is never used, we just access the flags byte directly. * However is here to document the layout of type 5 SDS strings. */ ...

2020-06-20 15:20:46 79 0

原创 MySQL诊断分析间歇性问题

通过mysqladmin命令持续获取每秒查询数、线程连接数、执行线程数 原理是通过awk命令捕获对应三个指标,然后计算差值,所以第一次qp为0,显示的是所有历史查询次数总和。 mysqladmin -h127.0.0.1 -uroot -p123456 ext -i1 | awk '...

2020-06-16 11:25:12 72 0

原创 HashMap+双向链表,看完之后,再也不怕头条面试官让我手撕LRU算法了

数据结构: 双向链表作为LRU队列 链表尾指针 HashMap存储每个元素的地址 添加、访问、删除操作: 添加:直接通过尾指针加到队尾 修改:通过HashMap拿到对应节点的地址,通过前后指针删除当前节点,再通过尾指针加到队尾 删除:通过HashMap拿到对应节点的地址,通过前后指针删...

2020-06-13 11:14:48 242 0

原创 MySQL使用profiles分析语句执行

检查并开启profiling MySQL [ymtprice2]> show variables like '%profiling%';+-------------------------+-------+| Variable_name | Val...

2020-06-12 09:31:31 79 0

原创 一篇文搞明白RabbitMQ原理和开发应用

首先思考几个问题: 什么是消息队列?消息队列可以解决什么问题? RabbitMQ可以做什么? RabbitMQ可以实现消息的过期失效吗? RabbitMQ可以实现延迟队列吗? RabbitMQ为何消息堆积越多,性能越大幅度下降? RabbitMQ的可靠性体现在哪几方面?分别是如何实现的...

2020-06-03 21:44:12 136 0

原创 RabbitMQ消息队列的可靠性

概述 RabbitMQ的可靠性贯穿整个消息的生命周期,主要包含以下三个阶段: 消息生产阶段 消息转发阶段 消息消费阶段 消息生产阶段 通过事务机制或发送方确认机制保证消息已经正确地发送并存储至RabbitMQ中 事务机制 事务会在一条消息发送之后阻塞发送端,直到收到服务端的响应,所以...

2020-06-03 21:34:31 89 0

原创 php借助Tideways扩展封装辅助函数分析代码执行性能

Tideways的安装和使用:https://success.blog.csdn.net/article/details/103365063 static关键字实现单例模式:https://success.blog.csdn.net/article/details/103718450 函数...

2020-05-20 20:23:35 109 0

原创 PHP浏览器导出csv格式文件

解释几个请求头: Content-type:内容类型 Content-Disposition:设置为浏览器显示(Disposition)或作为文件下载(attachment) Expires:设置浏览器缓存有效期,0为不缓存 Cache-Control:设置请求和响应的缓存机制指令,指令均...

2020-05-12 17:22:58 80 0

原创 redis-cluster-proxy代理集群并支持mget命令

参考文档 搭建集群:http://www.redis.cn/topics/cluster-tutorial.html redis-cluster-proxy:https://github.com/RedisLabs/redis-cluster-proxy 搭建集群 集群最少为3个节点,...

2020-05-09 21:17:05 354 0

原创 Redis两种持久化方式原理和单机多实例持久化脚本

注意:Linux系统使用redis需要更改系统的内存分配策略,执行sysctl vm.overcommit_memory=1命令,0-2分别代表不加载、加载、允许超额加载 一、RDB RDB持久化是把当前数据生成二进制快照保存到硬盘的过程。 配置项: dir:保存路径 dbfilenam...

2020-05-04 17:21:42 795 4

原创 通过原理理解为什么Redis的pipeline可以有效提升性能

Redis命令执行的过程 关于Redis服务如何处理每条指令已经有相关文章了,可以移步去看,这里只讨论命令发送之后的流程: 客户端进程调用write操作将数据写到本地操作系统内核的发送缓冲中 客户端操作系统内核异步将数据发送到服务端机器 Redis服务端将数据从本地操作系统内核的接收缓冲中...

2020-05-04 14:49:23 269 0

原创 通过存储机制和队列结构理解为什么RabbitMQ会随着队列堆积吞吐量降低

存储机制 首先需要明确一点,不管是持久化消息还是非持久化消息都可以被写入到磁盘。持久化消息在到达队列时就被写入到磁盘,并且如果内存允许,持久化到消息也会在内存中保存一份备份,这样可以提高一定的性能,当内存不够用时会从内存中删除。非持久化的消息一般只保存在内存时,在内存不够用时会被换入到磁盘,以节...

2020-05-03 16:10:32 817 2

原创 RabbitMQ死信队列原理并实现延迟队列

死信队列 死信交换机(Dead-Letter-Exchange),当消息在一个队列中变成死信之后,它能被发送到另一个交换机中,这个交换机就是DLX,绑定DLX的队列就称之为死信队列 消息变成死信一般是由于下面三种情况: 消息被拒绝(Basic.Reject或Basic.Nack),并在调用时...

2020-05-01 19:23:06 290 0

原创 RabbitMQ的消息有效期(TTL)和队列有效期(expires)

消息有效期 我们有2种方式设置消息的有效期: 一种是通过队列属性x-message-ttl设置,投递到该队列中的所有消息都有相同的过期时间 另一种是通过消息属性expiration设置消息本身的有效期 如果两种同时使用,会以两者之间较小的那个数值为准,单位都为毫秒 两种设置有效期的删除策略...

2020-05-01 19:11:08 446 0

原创 RabbiMQ的消息流向和备份交换机

在消息生产的 channel.basicPublish 方法中,有2个参数,用来控制消息如果无法成功到达目标队列时返回给生产者。 mandatory和备份交换机 mandatory用来告知服务器至少将该消息发送到一个队列中,否则将消息返回给生产者。当该参数设置为true时,当交换机无法根据自身...

2020-05-01 19:06:57 135 0

原创 Redis客户端通信协议

请求命令格式 每行用\r\n分割 第一行是参数数量 第二行开始,每行以此是每个参数的字节数和参数字符串,各占一行 比如:set hello redis *3 $3 SET $5 hello $5 redis 上面为了方便看清,我们用换行展示,实际上发送的数据是一行: *3\r\n$...

2020-04-25 14:43:12 110 0

原创 Redis命令时间复杂度查询表

String类型 命令 时间复杂度 set 0(1) get 0(1) del 0(k),k是键的个数 mset 0(k),k是键的个数 mget 0(k),k是键的个数 incr 0(1) decr 0(1) in...

2020-04-19 18:40:12 419 0

原创 Redis使用Lua脚本自定义原子操作

使用Lua的好处 命令原子执行,执行过程中不会插入其他命令 定制命令,并存在redis中复用 一次网络IO发送多个命令,减少网络开销 执行Lua的两个方法 1、eval: eval 脚本内容 key个数 key列表 参数列表 127.0.0.1:6379> eval '...

2020-04-19 17:59:48 114 0

原创 Redis慢查询和slowlog

Redis命令执行步骤 发送命令 命令排队 命令执行 返回结果 慢查询只统计步骤3命令执行的时间,所以没有慢查询并不代表客户端没有超时问题。 配置项 slowlog-log-slower-than代表一条命令执行超过多少微秒就会记录为慢查询,默认为10000 slowlog-max-...

2020-04-19 17:50:02 67 0

原创 Redis开发和运维相关shell命令总结

redis-cli 1、-r(repeat)选项代表将命令执行多次 $redis-cli -r 3 ping PONG PONG PONG 2、-i(interval)选项代表每隔几秒执行一次命令,必须和-r选项同时使用 redis-cli -r 3 -i 1 info | grep ...

2020-04-19 17:14:12 73 0

原创 一篇文章搞懂TCP协议
原力计划

TCP概述 面向连接的运输层协议:应用程序在使用TCP协议之前,必须先建立TCP连接,数据传输完毕后,必须释放已建立的TCP连接 点对点:TCP连接只能有两个端点,一对一 可靠:通过TCP连接传输的数据,无差错、不丢失、不重复、按需到达 全双工通信:连接的两端都设有发送缓存和接收缓存,用来...

2020-04-04 22:32:51 685 0

转载 Golang中的context包详解

控制并发有两种经典的方式,一种是 WaitGroup,另外一种就是 Context,今天我就谈谈 Context。 什么是 WaitGroup WaitGroup 以前我们在并发的时候介绍过,它是一种控制并发的方式,它的这种方式是控制多个 goroutine 同时完成。 func main...

2020-03-30 21:32:19 175 0

原创 一篇文章搞懂Linux内存管理

一、两种内存分配方式 固定分区分配:将内存分成不同大小的分区,按照大小保存在一张分区表中,分区表中包括每个分区的起始地址、大小、以及状态(是否分配),当有程序要装入时,由内存分配程序依据用户程序的大小检索该表,从中找出一个能满足要求的尚未分配的分区,并将分区状态改为已分配。 动态分区分配:利用...

2020-03-29 19:47:09 1035 4

原创 很多面试官可能都不知道,mysql不满足最左原则,真的会导致索引失效吗?

前言 之前很多面试都被问过联合索引不匹配最左原则失效的问题,当时一直以为只要不满足最左原则,联合索引就会失效,面试官也没有反馈过有什么问题,今天突然发现一条sql并没有遵循最左原则,但还是用到了联合索引。 测试 表结构: name和age字段建立联合索引 查询覆盖索引命中的字段:...

2020-03-28 18:34:04 405 5

原创 mysql的InooDB存储引擎是如何实现事务的四个特性ACID的

原子性 undolog记录反向操作 对于每一个insert,undolog记录一个delete 对于每一个delete,undolog记录一个insert 对于每一个update,undolog记录一个相反的update 隔离性 四种隔离模式 读未提交:不检查版本号,全读 读已提交:...

2020-03-27 22:24:58 98 0

原创 关于mysql的事务隔离模式、MVCC、next-key,这一篇就够了

声明 由于贴mysql截图会占太大篇幅,影响整体阅读理解,所以没有贴mysql截图,但是下面步骤都是亲自试验过的 四种隔离级别(由低到高) Read Uncommitted读未提交:可以看到其他事务未提交的内容 Read Committed读已提交:可以看到其他事务已提交读内容 Repe...

2020-03-22 15:26:14 475 1

原创 用位图BitMap节省空间

某一个字段用于存储商品的id和商品分类id,假设分类id小于等于255,商品id小于等65535,如果用int存储,在32位机器上至少要64位,而采用位图则只需要32位即可。 class Bits { protected $bits = 0; function setGood...

2020-03-21 22:35:40 86 0

原创 Redis如何处理每条指令的

响应队列 redis为每个客户端socket关联了一个响应队列,redis服务通过响应队列来将指令的返回结果回复给客户端。如果队列为空,那么意味着连接暂时处于空闲状态,不需要去获取写事件,也就是可以将当前的客户端描述符从write_fds里移出来。等到队列有数据了,再将描述符放进去,避免sele...

2020-03-20 20:33:38 81 0

原创 关于select和epoll多路复用(事件轮询API)

非阻塞IO 当我们调用套接字的读写方法时默认它们是阻塞的,比如read方法要产地进去一个参数n,代表最多读取n个字节后再返回,否则线程就会阻塞在哪里,直到新的数据到来或者连接关闭,read方法才可以返回,线程才能继续处理。write方法不会阻塞,除非内核为socket分配的写缓冲已经满了,...

2020-03-20 19:58:21 264 0

原创 关于mysql索引失效的情况,看这一篇就够了
原力计划

背景 关于mysql索引失效的几种情况,网上有很多文章,但是大多我感觉都是抄来抄去的,也有少数附上了自己的实验结果,但是并没有剖析背后的原理,所以今天自己亲自做套实验,分析一下。 准备数据 CREATE TABLE `test` ( `id` int(11) unsigned NOT ...

2020-03-20 12:24:18 820 2

原创 一个日志系统需要具备哪些功能

在项目开发和线上运行不同场景下,日志系统都是不可或缺的,一般日志有以下几个作用:记录错误、性能分析、查看服务间的调用关系、记录时间等。所以我们的日志系统,就需要围绕这些需求出发来设计,一般要有如下功能点: 日志配置读取:方便不同项目部署,通过更改配置文件即可 日志级别:为了减少线上日志大小,开...

2020-03-16 23:29:56 433 0

原创 linux内核概述

用户态和内核态 在理解linux内核之前,首先要知道什么是用户态,什么是内核态,什么是用户进程,什么是内核进程 用户进程:我们编写的程序都属于用户进程 内核进程:以内核态运行在内核地址空间,不与用户直接交互,不需要终端设备,在系统启动后一直处于活跃状态直到关机 用户态:用户进程的大部分时间...

2020-03-15 21:24:21 104 0

原创 面试中常问的HTTPS、SSO单点登录、Oauth认证、正向代理和反向代理

SSO单点登录 准备: 父应用提供GET的登录接口给子应用 子应用提供token验证接口给父应用 子应用登录步骤: 用户通过子应用重定向请求父应用的登录接口,如果没有登录返回父应用的登陆界面进行登录 如果已经登陆则生成加密的token,携带token请求子应用验证token的接口(扫码登...

2020-03-15 19:09:10 351 0

原创 php-redis源码之长连接、短连接、命令自动检活

源码函数所在文件 为了避免代码影响阅读,以及代码顺序不符合个人的读码习惯,就不贴代码了,都可以通过函数名在下面几个c文件中找到 redis.c library.c common.h 几个核心函数 redis_connect:用于创建sock连接,第一个参数INTERNAL_FUNCT...

2020-03-13 00:12:08 210 0

原创 关于php-redis的pconnect长链接的思考

抛出问题 前段时间有个大佬说,php-redis的pconnect并不能实现长链接,在请求结束后连接就被释放掉了,我心中存疑,如果是这样的话,那php-reds为什么还要有connect和pconnect? 查找文档 php-redis官方文档中有这样一句话:The connection w...

2020-03-12 15:45:53 197 0

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