自定义博客皮肤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」每一个你不满意的当下,都有一个你不曾努力的过去。

  • 博客(302)
  • 论坛 (7)
  • 收藏
  • 关注

原创 GoLang开源应用层框架,开箱即用

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

2020-07-07 14:59:50 283

原创 GoLang通过gRPC流处理实现发布订阅服务

目录流式处理服务端流式客户端流式双向流式发布订阅服务pubsub原理代码实现gRPC代码服务端代码订阅端代码发布端代码流式处理所谓流式处理,就是客户端和服务端一方可以源源不断地发送请求,另一方按照发送顺序依次处理请求。流式 RPC 分为三种,分别是服务端流式、客户端流式、双向流式服务端流式客户端发送一个请求给服务端,可获取一个数据流用来读取一系列消息。客户端从返回的数据流里一直读取直到没有更多消息为止。rpc Hello (HelloRequ

2021-03-21 18:53:36 208

原创 初探gRPC

安装命令go get google.golang.org/protobuf/cmd/protoc-gen-go go get google.golang.org/grpc/cmd/protoc-gen-go-grpc编写proto文件语法参考:https://www.jianshu.com/p/da7ed5914088syntax = "proto3";package pb;message Request { string Name = 1;}message Re

2021-03-18 01:46:32 50

原创 GoLang源码系列之:通过一个最简单的RPC服务探究net/rpc源码实现

前言之前做的服务大多基于 HTTP 实现服务端和客户端,可以通过 API 接口的方式进行调用,优点是不受语言限制、调用方便。但是众所周知 HTTP 是应用层协议,所以对于性能要求较高的服务来说,更适合用基于 TCP 的 RPC 服务。由于最近在转 Go 语言,标准库提供了开箱即用的 RPC 包,之前一直没接触过,最近正好打算学习 RPC,所以通过一个最简单的 RPC 服务来研究了下 net/rpc 包的实现原理。示例代码例子非常简单,客户端发送一个字符串,服务端返回 hello + 字符串作为.

2021-03-14 23:21:50 162

转载 关于TCP半连接队列和全连接队列

前言网上许多博客针对增大 TCP 半连接队列和全连接队列的方式如下: 增大 TCP 半连接队列的方式是增大 /proc/sys/net/ipv4/tcpmaxsyn_backlog; 增大 TCP 全连接队列的方式是增大 listen() 函数中的 backlog; 这里先跟大家说下,上面的方式都是不准确的。“你怎么知道不准确?”很简单呀,因为我做了实验和看了 TCP 协议栈的内核源码,发现要增大这两个队列长度,不是简简单单增大某一个参数就可以的。

2021-02-23 11:37:40 75

原创 搞不懂协程的同步控制,千万别说自己会GoLang

前言Go 语言提供了协程并发编程模型,那么只要是并发就需要解决协程间同步问题,官方为我们提供了同步工具,sync 包。性能测试参考:https://success.blog.csdn.net/article/details/112339434锁的使用锁有如下特点,使用时需要注意:锁在 Go 语言中都是成对出现的,也就是说每一个加锁操作必须要对应一个解锁操作,我们通常会跟一个 defer 语句进行解锁。 对已锁的锁再次加锁会阻塞当前加锁协程 对未锁定的锁进行解锁会触发 panic,且无

2021-02-11 11:25:39 165 2

原创 Go工程化规范实践

整体结构整体调用规范:C→ S→ M→ D,必须严格遵守流向Controller:1、参数校验处理2、调用service3、返回响应Service:1、调用 model,处理业务逻辑。Model:调用 Dao 获取原始数据,字段由参数控制,方便后续底层数据逻辑改造。 处理 Dao 返回的数据,进行固定业务场景数据聚合、格式化等。 固定业务场景数据 Cache 模型级业务逻辑封装Dao:注意:一定不要进行数据格式化和处理,吐给 Mo...

2021-01-29 16:34:25 89 1

原创 Vim打造成GoLang开发环境

源码安装GoLang进入:https://golang.google.cn/dl/下载:wgethttps://golang.google.cn/dl/go1.14.6.darwin-amd64.tar.gz安装:tar -C /usr/local -xzf go1.14.6.linux-amd64.tar.gz配置环境变量:vim ~/.bash_profileexport GOROOT=/usr/local/goexport GOPATH=/Users/why/Desktop..

2021-01-09 12:51:58 290

原创 GoLang测试那些事儿

码字不易,转载请附原链,搬砖繁忙回复不及时见谅,技术交流请加QQ群:909211071单元测试测试命令单用例命令行打印html直观展示多用例(Table-Driven Test)goconvey测试工具基准测试Example测试预告PS:本文中用到的所有 go 生态工具(go test、gotests、goconvey),均未介绍安装过程,请自行百度。单元测试testing为 Go 语言 package 提供自动化测试的支持。通过go tes...

2021-01-07 23:15:41 155

原创 GoLang性能分析利器:pprof

查看命令帮助:go tool pprof -help进入命令交互:通过正在运行的程序取样保存成文件,再进入命令交互:# 下载 cpu profilego tool pprof http://47.93.238.9:8080/debug/pprof/profile\?seconds=10 # 下载 heap profilego tool pprof http://47.93.238.9:8080/debug/pprof/heap\?seconds=10 # 下载

2021-01-06 15:58:01 151

原创 GoLang协程原理解读,收藏作为面经再合适不过了

线程实现模型 在操作系统提供的内核线程之上,Go 搭建了一个特有的用户级线程模型。传统的函数调用是将函数指针存储在内存的栈空间上,但是栈空间只允许操作系统进行操作,我们能拿到的只限于堆内存,所以 Go 开发者在堆上申请一块内存,将寄存器 %rsp 以及寄存器 %rbp 指过去,从而将这块内存伪装成用户栈,从而巧妙地实现了并行运行用户级线程 goroutine。要聊 Go 的线程实现模型,必须要知道以下3个核心元素:M:machine 缩写,一个 M 代表一个内核线程。 P:proces...

2020-12-28 20:35:10 216

原创 GoLang使用Goroutine+Channel实现流水线处理,扇入扇出思想解决流水线上下游供需不平衡

package mainimport ( "fmt")func buy(n int) <-chan string{ out := make(chan string) go func(){ defer close(out) for i := 1; i <= n; i++{ fmt.Println("buy", i) out <- fmt.Sprintf("配件%d", i) } }() return out}func build(in &lt.

2020-12-24 19:56:04 197 2

原创 GoLang中结构体的深拷贝和浅拷贝

先看几个完整的例子:func DeepCopy(dst, src interface{}) error { var buf bytes.Buffer if err := gob.NewEncoder(&buf).Encode(src); err != nil { return err } return gob.NewDecoder(bytes.NewBuffer(buf.Bytes())).Decode(dst)}type User struct { Name strin

2020-12-15 20:43:30 617

原创 Go接口中的值接收者和指针接收者

码字不易,转载请附原链,搬砖繁忙回复不及时见谅,技术交流请加QQ群:909211071先说结论:在实现接口时,应保持接收者定义、结构体定义、断言类型一致等价场景当方法的接收者定义为值类型时,Go 语言编译器会自动做转换,所以值类型接收者和指针类型接收者是等价的,编译不会报错,运行也都可以调用相应方法。package mainimport "fmt"type A interface { echo()}type B struct { b string}func ...

2020-11-30 22:09:51 184

原创 手把手教你用dlv和gdb调试GoLang

无论哪种方式,都要配置gdb钥匙串,参考这篇文章:https://blog.csdn.net/qq_33154343/article/details/104784641package mainimport ( "fmt")func a(){ fmt.Println(111);}func main() { a() s := []int{1, 2} s = append(s, 3, 4, 5) fmt.Println(len(s), cap(s))}dlvsi要进入r

2020-11-27 23:09:12 428

原创 Redis源码之——跳表skiplist原理和源码调试

码字不易,转载请附原链,搬砖繁忙回复不及时见谅,技术交流请加QQ群:909211071原理Redis的zset是一个复合结构,有以下几个特性:hash存储value-score的对应关系 按照score排序 指定score范围获取value列表 获得某个元素的排名当zset的元素个数小于zset-max-ziplist-entries配置(默认128个),同时每个元素的值都小于zset-max-ziplist-value配置(默认为64字节)使,redis会用ziplist存储zse.

2020-11-26 22:12:43 138

原创 Redis调试关键断点 - 启动和接收命令

server.c ->void initServer ae.c ->int aeCreateFileEvent networking.c ->void acceptTcpHandler networking.c ->static void acceptCommonHandler networking.c ->client *createClient ae.c ->int aeCreateFileEvent networking.c -> vo...

2020-11-25 17:13:46 143

原创 高并发场景利器之限流

WHY,为什么需要限流? 举一个常见场景,鄙人居住在北京,大天朝的地铁早高峰远近闻名,地铁人满为患,此时我们的安检员大大们会拉起长长的隔离线,乘客们有序排队进站。为什么要这样做呢,让大家自己随意进入会有什么问题呢?因为通过工作人员慢慢引流,会有效减少站台的压力,不会使大量无秩序乘客蜂拥而至堵在站台,导致想上的人上不去,想下的人下不来,地铁车门关不上,影响地铁正常行驶,还会引发冲突甚至安全事故。所以限流是为了保证每一位乘客最终能够顺利上车,同时保持整个过程井然有序。 回到我们...

2020-11-24 17:22:08 248 2

原创 搞懂这些,让MySQL性能监控和优化事半功倍

有多少人关注过自己MySQL性能?你现在的MySQL已经优化到极致了么?如何发现自己的MySQL性能问题?DROP TABLE IF EXISTS `hq_price`;CREATE TABLE `hq_price` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增属性', `province_id` int(10) unsigned NOT NULL COMMENT '省id', `city_id` i.

2020-11-18 12:54:51 715

原创 MySQL是如何实现事务ACID四个特性的?

事务的实现要了解事务是如何实现的,必须要先了解4个概念:redolog undolog purge group commit下面将分别介绍。redolog重做日志用来实现事务的原子性和持久性,主要需要关注下面几个概念点:日志由两部分组成,一部分是内存中的重做日志缓冲(redo log buffer),是容易丢失的,另一个部分是重做日志文件(redo log file),是持久到磁盘的。 为了确保每次日志都写入重做日志文件,在每次将重做日志缓冲写入重做日志文件后,InnoDB引擎

2020-10-30 21:51:41 552

原创 PHP实现opentracing链路追踪

说点废话之前写过一个GoLang版本的opentracing客户端实现,由于部门大部分服务还是用PHP实现的,所以打算用PHP实现一个基于jaeger的客户端。GoLang版本:https://success.blog.csdn.net/article/details/104100597参考文档和开源组件opentracing文档:https://wu-sheng.gitbooks.io/opentracing-io/content/pages/spec.htmlopentraci.

2020-10-24 23:51:00 607

原创 初探lldb调试MySQL,一条最简单的select语句是如何执行的?

安装MySQL1、下载linux通用源码:wgethttps://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.18.tar.gz2、解压压缩包:tar -zxvf mysql-8.0.18.tar.gz3、安装依赖工具:yum install cmake gcc-c++ ncurses-devel perl-Data-Dumper boost boost-doc boost-devel git4、删除CMakeCache.txt5、.

2020-10-10 01:24:32 226

原创 MySQL主从复制原理、实践和常见问题

配置主从注意:需要初始化启动2个mysql实例,需独立2个mysql实例目录和配置文件,安装参考:https://success.blog.csdn.net/article/details/83660180master配置文件:[mysqld]port=3306basedir=/usr/local/mysqldatadir=/usr/local/mysql/datacharacter-set-server=utf8lower-case-table-names=2default_

2020-10-04 17:31:15 417 2

原创 关于MySQL索引和filesort原因的探究

为何要探究之前对 MySQL 的索引和文件排序有过一些了解,但是只是大概知道查询条件满足最左原则用到索引列,排序字段在用到的索引列中,就可以避免文件排序。很明显自己了解不到位,因为关于where字段和order by字段,会有很多种不同的组合场景,今天做几个实验探究下。探究过程表结构CREATE TABLE `t_price` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', `customer_id` bi

2020-09-18 22:16:00 295

转载 MySQL提速器 - Change Buffer

核心概括(下面都是抄的,这句是我总结的):执行写操作时,如果数据在Buffer Pool中则直接更新缓存,如果不在Buffer Pool中则存入Change Buffer,目的是将同步随机写改为同步顺序写,异步随机写来提升性能。Change Buffer写入是只写内存,定时持久化,所以它并不是完全可靠的。如果未及时刷盘就挂掉了,数据是依赖redolog恢复的,也就是说redolog是起到数据可靠的关键角色,innodb_flush_log_at_trx_commit配置为1可保证数据可靠。写缓存(.

2020-08-20 22:53:39 212 2

原创 一篇文章玩转GDB/LLDB调试Redis源码

一、安装调试版redis参考博客:https://success.blog.csdn.net/article/details/83659776注意需要在makefile的开头定义CFLAGS 变量:CFLAGS = -g ,否则调试过程中无法跟踪代码二、使用gdb启动redis-serversudo gdb /usr/local/bin/redis-server会遇到如下问题:(gdb) r Starting program: /usr/local/bin/redis-ser

2020-08-09 21:39:48 257

原创 关于GoLang的concurrent map writes错误

作为一个GoLang萌新(其实就是并发编程萌新,之前一直在做PHP),对并发下共享资源的竞争了解不多。所以一开始写出了如下代码:type OriginPriceController struct { OriginPriceService *origin_price_service.OriginPriceService}func (self *OriginPriceController) action() { var wg sync.WaitGroup wg.Add(2) go f

2020-08-01 20:17:34 3079

转载 【转载】GoLang逃逸分析

写过C/C++的同学都知道,调用著名的malloc和new函数可以在堆上分配一块内存,这块内存的使用和销毁的责任都在程序员。一不小心,就会发生内存泄露,搞得胆战心惊。切换到Golang后,基本不会担心内存泄露了。虽然也有new函数,但是使用new函数得到的内存不一定就在堆上。堆和栈的区别对程序员“模糊化”了,当然这一切都是Go编译器在背后帮我们完成的。一个变量是在堆上分配,还是在栈上分配,是经过编译器的逃逸分析之后得出的结论。这篇文章,就将带领大家一起去探索逃逸分析——变量到底去哪儿,堆还是栈?

2020-07-28 17:51:47 128

转载 编程是一种思想,而不是敲代码【文章来源:微信公众号-新亮笔记】

作者公众号:编程是一个先思考再编码的过程,思考是优于编码技能的,在思考过程中我们会考虑代码的可重用性、可靠性、更容易被他人理解,这时就会使用到设计模式让代码编写工程化,这篇文章整理了设计模式的六大原则。单一职责原则单一职责原则(Single Responsibility Principle)There should never be more than one reason for a class to change.(有且仅有一个原因可以引起类的变更)不管让我干啥,我都只干一件事,

2020-07-24 13:04:19 162

原创 GoLang redigo包冲突in multiple modules

报错提示:build command-line-arguments: cannot load github.com/gomodule/redigo/redis: ambiguous import: found github.com/gomodule/redigo/redis in multiple modules: github.com/gomodule/redigo v2.0.0+incompatible (/Users/why/Desktop/go/pkg/mod/github.c

2020-07-19 18:58:19 1109

原创 关于RabbitMQ的跨部门分发使用权限控制和规范总结

背景在公司使用RabiitMQ进行消息分发时,如果仅仅是简单的一对一关系,开发起来非常容易,直接按照正常的分发和绑定即可。但是如果要进行生产、分发、消费,分别解耦,就需要制定一套完整的使用方案,并且对exchange、route、queue的命名要遵循一定的规范,并且需要对不同服务根据规范对名称进行写入和消费权限控制。场景举例触发场景:用户下单成功,需要通知短信服务哦、库存服务、商家服务生产者:订单服务消费者:短信服务(告知用户下单成功)、库存服务(库存更新)、商家服务(新订单生成)

2020-07-17 16:58:34 323

原创 VSCode常用插件和快捷键总结

快捷键搜索配置、插件、编辑器相关:F1 搜索指定文件:F1,退格取消小箭头后搜索 跳转到指定行:Ctrl + G,输入框输入指定行数,自动跳转 代码追踪:command + 鼠标左键 代码追踪返回:Ctrl + - 调整代码大小:command + -/+ 打开终端:Ctrl + ` 打开快捷键配置:按下command + k后,再按command + s 关闭当前文件:command + w更改主题代码和背景:Flatland Monkai 目录图标:VSCode Icons

2020-07-16 12:01:28 453

转载 一致性hash算法原理和PHP实现

今天在看redis集群实现原理时,提到了一致性hash算法。已经不是第一次听到这个词了,今天特意了解了一下实现原理。关于一致性hash算法的原理,主要是核心两点:hash环:解决动态扩容大面积节点缓存失效问题 节点虚拟分区:用于保证hash环的平衡型详细原理参考大佬博客:https://blog.csdn.net/sparkliang/article/details/5279393<?php/** * 一致性哈希实现接口 * Interface ConsistentHa.

2020-07-15 20:35:39 103

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

一、项目的终极目标 普通开发者在开发一个项目时,可能考虑到的都是如何实现业务逻辑,同时提高程序性能,好一点的开发者会同时考虑到代码的复用性和扩展性,没错,上面提到的几点都是一个优秀的技术开发需要必备的素质,但是如果想要真正的做出好的项目,是需要深入了解项目所属领域的专业知识,从而设计出易于维护,能够满足组织后续需求,可以不断演进的复杂软件。二、如何实现终极目标 很多项目最主要的复杂性往往不在技术上,而是来自领域本身、用户的活动或业务,当这种领域复杂性在设计中没有充分考虑并...

2020-07-05 17:39:40 271

原创 Go中闭包的隐含问题

问题package mainimport ( "fmt" "sync")var wg sync.WaitGroupfunc main() { for i := 0; i < 10; i++ { wg.Add(1) go func(){ fmt.Println(i) defer wg.Done() }() } wg.Wait()}[why@localhost] ~/Desktop/go/gin-frame$go run test.go 10

2020-06-26 15:56:43 143

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

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

2020-06-25 17:04:15 1185

原创 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_RESOLUTION 1000 /* LRU clock resolution in ms */ #define OBJ_SHARED_REFCOUNT INT_MAXtypedef struct redisO

2020-06-21 19:17:25 246

原创 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. */struct __attribute__ ((__packed__)) sdshdr5 { unsigned char flags; /* 3 lsb of type, and 5 msb of strin

2020-06-20 15:20:46 170

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

数据结构:双向链表作为LRU队列 链表尾指针 HashMap存储每个元素的地址添加、访问、删除操作:添加:直接通过尾指针加到队尾 修改:通过HashMap拿到对应节点的地址,通过前后指针删除当前节点,再通过尾指针加到队尾 删除:通过HashMap拿到对应节点的地址,通过前后指针删除当前节点代码:<?phpclass ListQueue{ public $head = null; public $tail = null; public $count

2020-06-13 11:14:48 596

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

首先思考几个问题:什么是消息队列?消息队列可以解决什么问题? RabbitMQ可以做什么? RabbitMQ可以实现消息的过期失效吗? RabbitMQ可以实现延迟队列吗? RabbitMQ为何消息堆积越多,性能越大幅度下降? RabbitMQ的可靠性体现在哪几方面?分别是如何实现的?什么是消息队列提供了以松散耦合的灵活方式集成应用程序的一种机制,为我们提供了基于存储和转发的应用程序之间的异步发送,用于异步、解耦、削峰。生产者:投递消息的一方 消费者:接收消息的一方 虚拟机:用于

2020-06-03 21:44:12 237

空空如也

nginx: [emerg] location "\.php/?.*" cannot be inside the exact location "/50x.ht

发表于 2018-12-05 最后回复 2018-12-10

php怎么验证保存表单复选框,急急急!!!

发表于 2016-08-04 最后回复 2016-08-05

关于无法解析php代码,急急急

发表于 2016-07-17 最后回复 2016-07-20

用结构体建立链表,为什么输出一个链表,就自动结束运行了?

发表于 2016-01-21 最后回复 2016-01-21

关于C语言的结构体,洗牌

发表于 2016-01-14 最后回复 2016-01-14

杨辉三角

发表于 2015-11-28 最后回复 2016-01-14

关于[i++]!=‘?’ 和 a[i]!=‘?’有什么区别

发表于 2015-11-19 最后回复 2015-11-28

空空如也

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

TA关注的人 TA的粉丝

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