- 博客(146)
- 资源 (5)
- 收藏
- 关注
原创 grpc的粗浅理解与示例
接上一个protobuf的下载安装今天记录下grpc的自己写的一个小示例,网上找了很多,好像都比较老了,不过整理了一下终于写出来一套。
2022-07-26 16:00:47
293
1
原创 protobuf 下载 使用
protobuf是谷歌开源的一种数据格式,适合高性能,对响应速度有要求的数据传输场景。因为profobuf是二进制数据格式,需要编码和解码。数据本身不具有可读性。因此只能反序列化之后得到真正可读的数据。 优势:1. 序列化后体积相比Json和XML很小,适合网络传输2. 支持跨平台多语言3. 消息格式升级和兼容性还不错4. 序列化反序列化速度很快第一步:下载通用编译器 地址:https://github.com/protocolbuffers/protobuf/releases根
2022-05-24 18:06:32
1113
转载 Go并发编程原理
我们先来搞懂并发与并行的概念并发:同一时间做多件事情并行:同一时间处理多件事情“做”和“处理”的区别在于:做只是代表即将处理,但是只能选择一个。比如有a\b两件事情需要做,并发是一个进程在0.02s内,前0.01s做a、后0.01s做b,同一时间只能处理一个事情。并行是两个进程,在前0.01s分别同时做了a和b。所以单核状况下进程处理只能是并发,只不过cpu切换轮流处理速度太快了,导致你感觉像是并行处理的,其实非也。Go 语言的协程实现被称之为 goroutine,由 Go 运行时管理,在
2022-04-14 17:29:39
211
转载 Go sync.WaitGroup的用法
介绍经常会看到以下了代码:package mainimport ( "fmt" "time")func main(){ for i := 0; i < 100 ; i++{ go fmt.Println(i) } time.Sleep(time.Second)}主线程为了等待goroutine都运行完毕,不得不在程序的末尾使用time.Sleep() 来睡眠一段时间,等待其他线程充分运行。对于简单的代码,100个for循环可
2022-04-14 11:29:19
194
原创 gin框架记录
gin框架安装七牛云go env -w GO111MODULE=ongo env -w GOPROXY=https://goproxy.cn,direct阿里云go env -w GO111MODULE=ongo env -w GOPROXY=https://mirrors.aliyun.com/goproxy/,direct安装命令go get -u github.com/gin-gonic/gin
2021-08-30 18:10:54
155
原创 GO基础知识总结
1.函数外只能声明变量,不能写表达式 (函数外的声明必须以关键字var const func等开头)2.fmt.print()正常打印 fmt.println()末尾会加换行符 fmt.printf() 可以用占位符 %s字符串占位符 %v打印值 %b 打印二进制int类型 %d打印十进制int %o 打印八进制 %x打印16进制 %T打印数据类型fmt.Sprintf()格式化字符串并赋给新变量,我们在编写SQL语句的时候要用到,可以避免SQL注入3.方法中可以快速声明变量赋
2021-08-30 18:08:09
536
原创 Nginx 代理配置proxy_pass URL末尾加与不加/(斜线)的区别
假设访问路径的 /pss/bill.html加/的情况location /pss/ {proxy_pass http://127.0.0.1:18081/;}被访问的真实访问路径http://127.0.0.1:18081/bill.html不加/的情况location /pss/ {proxy_pass http://127.0.0.1:18081;}被访问的真实路径http://127.0.0.1:18081/pss/bill.html...
2021-07-08 15:21:50
170
原创 Redis底层数据结构之字典
字典又称为符号表或者关联数组、或映射(map),是一种用于保存键值对的抽象数据结构。字典中的每一个键 key 都是唯一的,通过 key 可以对值来进行查找或修改。C 语言中没有内置这种数据结构的实现,所以字典依然是 Redis自己构建的。Redis的字典是用哈希表作为底层实现的,一个哈希表中可以有多个哈希表节点,每个哈希表节点保存字典中的一个键值对。哈希表结构typedef struct dictht{ dictEntry **table;//哈希表数组 unsigned long size;
2021-04-14 20:29:21
178
转载 开发时怎么用好 Git 分支?
一、远程仓库有master和dev分支克隆代码git clone https://github.com/master-dev.git # 这个git路径是无效的,示例而已查看所有分支git branch --all # 默认有了dev和master分支,所以会看到如下三个分支# master[本地主分支] origin/master[远程主分支] origin/dev[远程开发分支]# 新克隆下来的代码默认master和origin/master是关联的,也就是他们的代码保持同
2021-02-07 10:59:39
237
原创 Redis底层数据结构之双端链表
链表这种数据结构相信大家也不陌生,有很多类型,比如单向链表,双向链表,循环链表等,链表相对于数组来说,一是不需要连续的内存块地址,二是删除和插入的时间复杂度是 O(1) 级别的,非常的高效,但比不上数组的随机访问查询方式。一样的那句话,没有最好的数据结构,只有恰到好处的数据结构,比如我们后面要介绍的更高层次的数据结构,字典,它的底层其实就依赖的链表规避哈希冲突,具体的我们后面再说。redis 中借助 C 语言实现了一个双向链表结构:struct listNode{ // 前一个节点的指针
2021-01-27 20:32:50
273
原创 Redis底层数据结构之字符串的SDS
前言PS:Redis有八种编码,但底层数据机构是六种。二、SDS(simple dynamic string)简单动态字符串结构定义struct sdshdr{ //记录buf数组中已使用字节的数量 //等于 SDS 保存字符串的长度 int len; //记录 buf 数组中未使用字节的数量 int free; //字节数组,用于保存字符串 char buf[];}SDS保存的字符串结构图示:优势:常数复杂度获取
2021-01-22 20:24:17
164
原创 Redis底层数据结构之有序集合的跳跃表
Redis 当一个有序集合包含的元素数量多,又或者有序集合中的元素的成员是比较长的字符串时,Redis就会使用跳跃表作为有序集合键的底层实现跳跃表的基本思想首先我们看一个普通的链表结构:这个链表中,如果要搜索一个数,需要从头到尾比较每个元素是否匹配,直到找到匹配的数为止,即时间复杂度是 O(n)。同理,插入一个数并保持链表有序,需要先找到合适的插入位置,再执行插入,总计也是 O(n)的时间。但假如我们每相邻两个节点之间就增加一个指针,让指针指向下一个节点,如下图:如上图,我们新创建一个链表,它
2021-01-21 22:01:22
243
转载 Redis为什么变慢了?一文讲透如何排查Redis性能问题 | 万字长文
Redis 作为优秀的内存数据库,其拥有非常高的性能,单个实例的 OPS 能够达到 10W 左右。但也正因此如此,当我们在使用 Redis 时,如果发现操作延迟变大的情况,就会与我们的预期不符。你也许或多或少地,也遇到过以下这些场景:在 Redis 上执行同样的命令,为什么有时响应很快,有时却很慢?为什么 Redis 执行 SET、DEL 命令耗时也很久?为什么我的 Redis 突然慢了一波,之后又恢复正常了?为什么我的 Redis 稳定运行了很久,突然从某个时间点开始变慢了?如果你并不清楚
2021-01-20 20:32:01
653
1
原创 在 Laravel Eloquent 模型类中使用作用域进行查询
我们已经学习了如何在 Eloquent 模型类中进行各种查询,但是这些查询大多需要手动调用查询构建器提供的各种方法来实现。如果有一些查询需要在多个地方调用,那么在每个地方都要编写同样的代码,有没有什么办法对这种场景下的查询代码进行优化呢?从调用方式或者过滤器的作用范围来说,可以把「作用域」分为「全局作用域」和「局部作用域」。「作用域」都是围绕模型类展开的,不管是全局作用域还是局部作用域,都是作用到某个模型类上。接下来,我们就来演示如何在 Eloquent 模型类上使用「作用域」进行查询。全局作用域所谓
2021-01-19 10:01:13
373
原创 Laravel8集成阿里OSS多图片批量上传并返回url
1.安装扩展包jacobcyl/ali-oss-storage": "^2.1composer require jacobcyl/ali-oss-storage:^2.12.然后在 config/app.php 文件中注册 Jacobcyl\AliOSS\AliOssServiceProvider :'providers' => [ // Other service providers... Jacobcyl\AliOSS\AliOssServiceProvider::clas
2020-12-31 14:30:53
1011
原创 本地新laravel原始代码如何推送到新的远端码云
1.新建码云远端从仓库2.在WWW目录下创建项目文件夹在项目文件夹下新建本地git仓库,并克隆码云仓库代码到本地仓库(虽然只有README.md和README.en.md)3.下载laravel框架代码4.复制laravel框架源码到项目文件夹下(READMD.md会和框架自带的readme.md冲突,留READMD.md)5.将项目文件夹下的laravel源码推送到码云远端仓库...
2020-12-07 17:28:44
164
原创 [译]变量在 PHP7 内部的实现(二)
本文第一部分和第二均翻译自Nikita Popov(nikic,PHP 官方开发组成员,柏林科技大学的学生) 的博客。为了更符合汉语的阅读习惯,文中并不会逐字逐句的翻译。要理解本文,你应该对 PHP5 中变量的实现有了一些了解,本文重点在于解释 PHP7 中 zval 的变化。第一部分讲了 PHP5 和 PHP7 中关于变量最基础的实现和变化。这里再重复一下,主要的变化就是 zval 不再单独分配内存,不自己存储引用计数。整型浮点型等简单类型直接存储在 zval 中。复杂类型则通过指针指向一个独立的结构
2020-12-04 15:59:17
104
原创 [译]变量在 PHP7 内部的实现(一)
本文第一部分和第二均翻译自Nikita Popov(nikic,PHP 官方开发组成员,柏林科技大学的学生) 的博客。为了更符合汉语的阅读习惯,文中并不会逐字逐句的翻译。要理解本文,你应该对 PHP5 中变量的实现有了一些了解,本文重点在于解释 PHP7 中 zval 的变化。由于大量的细节描述,本文将会分成两个部分:第一部分主要描述 zval(zend value) 的实现在 PHP5 和 PHP7 中有何不同以及引用的实现。第二部分将会分析单独类型(strings、objects)的细节。PHP5
2020-12-04 15:00:16
155
原创 laravel5.8集成RabbitMQ实现异步队列
自行安装所基于Erlang环境 RabbitMQ客户端上链接 https://www.jianshu.com/p/3874a446a1e01.安装RabbitMQ扩展composer require vladimir-yuldashev/laravel-queue-rabbitmq:版本号根据laravel版本安装对应的版本https://github.com/vyuldashev/laravel-queue-rabbitmq2.在config/queue.php的 connections数
2020-11-27 18:48:54
576
原创 Mysql的两阶段提交的过程和关于redolog binlog疑问解答
MySQL 里有两个日志,即:重做日志(redo log)和归档日志(binlog)。其中,binlog 可以给备库使用,也可以保存起来用于恢复数据库历史数据。它是实现在 server 层的,所有引擎可以共用。redo log 是 InnoDB 特有的日志,用来支持 crash-safe 能力。有了 redo log , InnoDB 就可以保证即使数据库发生异常重启,之前提交的记录都不会丢失,这个能力称为 crash-safe 。你一定听过 MySQL 事务的两阶段提交,指的就是在事务提交的时候,分
2020-11-11 16:50:26
940
原创 InnoDB的磁盘文件及落盘机制
任何一个技术都有其底层的关键基础技术,这些关键技术很有可能也是其他技术的关键技术,学习这些底层技术,就可以一通百通,让你很快的掌握其他技术。如何在磁盘上存储数据,如何使用日志文件保证数据不丢失以及如何落盘,不仅是MySQL等数据库的关键技术,也是MQ消息队列或者其他中间件的关键技术之一。 上图详细显示了InnoDB存储引擎的体系架构,从图中可见,InnoDB存储引擎由内存池,后台线程和磁盘文件三大部分组成。接下来我们就来简单了解一下磁盘文件相关的概念和原理。InnoDB的主要的磁盘文件主要分为三大块:
2020-11-09 15:13:14
335
1
原创 InnoDB的内存结构和特性
MySQL区别于其他数据库的最为重要的特点就是其插件式的表存储引擎。而在众多存储引擎中,InnoDB是最为常用的存储引擎。从MySQL5.5.8版本开始,InnoDB存储引擎是默认的存储引擎。InnoDB存储引擎支持事务,其设计目标主要面向在线事务处理(OLTP)的应用。其特点是行锁设计、支持外键,并支持非锁定读,即默认读操作不会产生锁。InnoDB通过使用多版本并发控制(MVCC)来获取高并发性,并且实现了SQL标准的4中隔离级别,默认为REPEATABLE级别。同时,使用一种被称为next-key-
2020-11-09 14:45:27
247
原创 SQL语句执行过程详解
当希望MySQL能够以更高的性能运行查询时,最好的办法就是弄清楚MySQL是如何优化和执行查询的。一旦理解了这一点,很多查询优化工作实际上就是遵循一些原则能够按照预想的合理的方式运行 如下图所示,当向MySQL发送一个请求的时候,MySQL到底做了什么:1.客户端发送一条查询给服务器。2.服务器先检查查询缓存,如果命中了缓存,则立刻返回存储在缓存中的结果。否则进入下一阶段。3.服务器端进行SQL解析、预处理,再由优化器生成对应的执行计划。4.MySQL根据优化器生成的执行计划,再调用存储引擎的
2020-11-09 11:02:43
1603
原创 Mysql innDB体系架构图和merge执行流程
、merge 的执行流程是这样的:1. 从磁盘读入数据页到内存(老版本的数据页);2. 从 change buffer 里找出这个数据页的 change buffer 记录 ( 可能有多个),依次应用,得到新版数据页;3. 写 redo log 。这个 redo log 包含了数据的变更和 change buffer 的变更。到这里 merge 过程就结束了。这时候,数据页和内存中 change buffer 对应的磁盘位置都还没有修改,属于脏页,之后各自刷回自己的物理数据,就是另外一个过
2020-11-05 18:24:10
297
1
转载 手把手教你用Strace诊断问题
闲话不多说,先贴一下strace常用的选项备用-c 统计每一系统调用的所执行的时间,次数和出错的次数等.-d 输出strace关于标准错误的调试信息.-f 跟踪由fork调用所产生的子进程.-ff 如果提供-o filename,则所有进程的跟踪结果输出到相应的filename.pid中,pid是各进程的进程号.-F 尝试跟踪vfork调用.在-f时,vfork不被跟踪.-h 输出简要的帮助信息.-i 输出系统调用的入口指针.-q 禁止输出关于脱离的消息.-r 打印出相对时间关于,,每一个
2020-09-29 15:53:50
378
原创 PHP生命周期5个阶段
0、模块初始化阶段PHP框架、Zend引擎初始化操作。入口函数为:php_module_startup()。主要进行操作如下:启动Zend引擎初始化垃圾回收器注册PHP定义的常量:PHP_VERSION等解析php.ini注册扩展,包括静态编译的扩展和动态加载的扩展1、请求初始化阶段请求处理前的阶段,例如Fpm, worker进程accept一个请求且读取、解析完请求数据后,会进入该阶段。处理函数为php_request_startup()。具体进行操作如下:激活Zend引擎激活SAP
2020-09-29 15:19:02
1316
转载 Swoole引擎原理(swoole为什么能提升PHP的速度)
1、php-fpm 是如何处理web请求的?有什么问题?我们用的 PHP 主要用于 web 开发,通过 nginx、apache 等服务端程序调用 php-fpm 处理服务端的业务逻辑,处理完后 php 撤消内存并返回结果。一个 web 请求就要加载一次 php 的全部文件,需要的系统资源开销很大,这是目前 php-fpm 的缺点之一;并且因为 php-fpm 在一次请求结束就释放内存,无法做连接池,也不合适 service 端的开发。我们用的 PHP 主要用于 web 开发,通过 nginx、apach
2020-09-27 17:07:32
2234
原创 Mysql的各种锁机制
不少人在开发的时候,应该很少会注意到这些锁的问题,也很少会给程序加锁(除了库存这些对数量准确性要求极高的情况下),即使我们不会这些锁知识,我们的程序在一般情况下还是可以跑得好好的。因为数据库隐式帮我们加了这些锁了,只有在某些特定的场景下我们才需要手动加锁。对于UPDATE、DELETE、INSERT语句,InnoDB会自动给涉及数据集加排他锁(X) 。而MyISAM在执行查询语句SELECT前,会自动给涉及的所有表加读锁,在执行增、删、改操作前,会自动给涉及的表加写锁,这个过程并不需要我们去手动操作。那
2020-08-04 15:58:51
374
转载 更快的方式实现PHP数组去重
/* 创建一个包含重复值的,一共四个元素的数组 */$array = array('green','blue','orange','blue');/* 翻转数组,你将会得到唯一键值的数组*/ $array = array_flip($array);array('green'=>0,'blue'=>1,'orange'=>2); /* 然后再翻转一次,将键和值重新放置,然后得到数组: */$array = array_flip($array);array(0=&.
2020-06-02 09:33:35
194
原创 Codis安装部署Redis5.x集群
1.Go安装Go下载地址 解压tar zxf go1.9.1.linux-amd64.tar.gz -C /usr/local/ -------------------------------------------------------mkdir -p /usr/local/gopath ###go第三方包的安装包路径 在gopath文件夹下必须要有 bin pkg src三个文件夹cd /usr/local/gopath/mkdir binmkdir pkgmkdir src
2020-05-29 14:55:07
236
原创 Redis5.x用cluster搭建集群
Redis版本:5.0.51机6节点、3主3从1.装Redis5.0.5版本至/usr/local/redis/目录下2.给每个实例创建1个目录,以端口号为区分,用来存放持久化文件和日志等文件。mkdir /usr/local/redis/6379mkdir /usr/local/redis/6380mkdir /usr/local/redis/6381mkdir /usr/local/redis/6382mkdir /usr/local/redis/6383mkdir /usr/loca
2020-05-27 17:32:08
314
原创 Laravel6使用hhxsv5/laravel-s实现高性能webSocket服务
接上篇1.修改config/laravels.conf配置文件'websocket' => [ 'enable' => true, // 看清楚,这里是true 'handler' => \App\Services\WebSocketService::class,],'swoole' => [ //... // dispatch_mode只能设置为2、4、5,https://wiki.swoole.com/wiki/
2020-05-09 11:27:11
2278
2
原创 Laravel6使用hhxsv5/laravel-s实现高性能Http服务
1.保证服务器安装了LNMP环境且php版本>=7.12.安装swoole扩展,并删除掉与swoole冲突的扩展3.安装laravelcomposer create-project --prefer-dist laravel/laravel blog "6.*"4.先通过 Composer 安装 LaravelS 扩展包:composer require hhxsv5/laravel-s5.运行如下 Artisan 命令相应脚本和配置文件发布到根目录下:php artisan la
2020-05-09 11:03:45
3327
Yii 2.0进阶版 高级组件 ES/Redis/ Sentry 优化京东平台 收藏 难度高级
2018-06-07
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人