自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 4.消息100%投递的两种方案

前言:消息中间件 是用来 客户端 与 客户端之间通信的,那么就存在以下两个问题:如何避免消息重复消费(针对consumer)如何保证消息的可靠性投递(针对publisher)对于问题1,看《防止消息重复消费》一文下面讲问题2:保证消息的可靠性投递上图是消息投递的整个流程,熟悉该流程有助于该文章的理解要保证消息的可靠性投递,那么应满足以下几个条件:1. message成功发出去2. broker节点成功收到message3. publisher成功收到broker节点的确认应答4

2020-09-05 09:22:52 600

原创 Go实现雪花算法(snowflake)

将 时间戳左移22位,机器编号左移12位,序列号在最右侧不需要移动,再将3者按位或运算 |,得到一个 64 位二进制数,再将其转换为10进制数,即所需的雪花 ID。( 位或运算 | 的逻辑是只要两者中有1个数字是1,则结果为1,只有两者都是0时,结果才是0 )算法是Twitter公司推出,用来在一个分布式的环境中,生成分布式自增且不重复id的算法。该ID由一个64位二进制数组成,如上图。什么是雪花算法(snowflake)?算法实现的思路如上图。

2023-05-17 13:01:33 556

原创 Go实现一致性哈希算法

想象有一个圆,该圆由 2^32 个数字点组成,这样的环也叫做 哈希环。再假设有3个服务器 a, b, c,此时分别对 a,b,c 服务器进行哈希计算再用 2^32 取模,那结果肯定能对应到环上的某个点。再用同样的方法,对需要缓存的图片进行哈希计算和取模,也肯定能对应到环上的某个点。此时,按顺时针方向找,找到的第一个缓存服务器,就将该图片数据缓存到该服务器上。

2023-05-16 20:51:28 377

原创 github.com/pkg/errors错误处理包的用法

错误处理包 github.com/pkg/errors 的简单介绍

2022-11-22 18:07:09 537

原创 5.go实现LFU缓存淘汰算法

注:以下的缓存淘汰算法实现,不考虑 并发 和 GC(垃圾回收) 问题本文讨论的是 进程内缓存,是存放在内存中的,因此容量有限。当缓存容量达到某个阈值时,应该删除一条或多条数据。至于移出哪些数据?答案是移出那些 “无用” 的数据。而如何判断数据是否 “无用”,就设计到 缓存淘汰算法常见的缓存淘汰算法有以下三种:FIFO(first in first )先进先出算法《go实现FIFO缓存淘汰算法》LFU(least frequently used)最少使用算法看本文LRU(least rece

2020-09-10 16:20:20 452

原创 4.go实现LRU缓存淘汰算法

注:以下的缓存淘汰算法实现,不考虑 并发 和 GC(垃圾回收) 问题本文讨论的是 进程内缓存,是存放在内存中的,因此容量有限。当缓存容量达到某个阈值时,应该删除一条或多条数据。至于移出哪些数据?答案是移出那些 “无用” 的数据。而如何判断数据是否 “无用”,就设计到 缓存淘汰算法常见的缓存淘汰算法有以下三种:FIFO(first in first )先进先出算法《go实现FIFO缓存淘汰算法》LFU(least frequently used)最少使用算法《go实现LFU缓存淘汰算法》LR

2020-09-10 16:18:49 474

原创 3.go实现FIFO缓存淘汰算法

注:以下的缓存淘汰算法实现,不考虑 并发 和 GC(垃圾回收) 问题本文讨论的是 进程内缓存,是存放在内存中的,因此容量有限。当缓存容量达到某个阈值时,应该删除一条或多条数据。至于移出哪些数据?答案是移出那些 “无用” 的数据。而如何判断数据是否 “无用”,就设计到 缓存淘汰算法常见的缓存淘汰算法有以下三种:FIFO(first in first )先进先出算法看本文LFU(least frequently used)最少使用算法[《go实现LFU缓存淘汰算法》]LRU(least rec

2020-09-08 15:38:10 442

原创 2.为什么要内存对齐?

一. 什么是内存对齐(Memory alignment),也叫字节对齐在计算机中,内存是按 字节(byte, 1byte = 8bit) 划分的,而cpu在读取内存数据时,并不是一字节一字节读取的。实际上是按 块 来读取的。块的大小可以是1,2,4,8,16等等,这块的大小也称为 内存访问粒度而 内存对齐 是将特定的数据类型按照一定的规则摆放在内存上,以此 提高cpu访问内存的速度看如下示例:如上图,内存访问颗粒度为4,数据大小为4字节的场景:场景1:做了内存对齐,index 2-3 补充空

2020-09-07 16:34:58 279

原创 1.什么是缓存

缓存(cache) 这个概念,最早是出现在 计算机硬件设计 中。比如 cpu cache,是用于减少处理器访问内存所需平均时间的部件。该部件的容量小于内存,但速度比内存高很多,接近处理器的频率。如上图示,在 计算机硬件设计中当处理器(cpu)发送内存访问请求时,先查看缓存中是否有请求数据,如果存在(命中),则不访问内存直接返回该数据;如果不存在(未命中),则先把内存中的数据存入缓存,再讲其返回处理器由于缓存速度高于内存速度,因此能整体提高计算机的性能。由于该设计思路的优秀,在 计算机

2020-09-05 16:49:52 416

原创 3.幂等性和避免消息重复消费

先理解 幂等性 这个概念,有助于后续理解 如何避免消息重复消费幂等性:在编程上,指任意多次执行所产生的影响均与一次执行的影响相同。在数学上,指幂等方法,是可以使用相同的参数重复执行,并获得相同结果的函数。不用担心重复执行会对系统造成改变。避免消息重复问题上,就是要实现类似 幂等方法 的功能,使消费者即使多次消费了同样的信息,结果也只跟消费了1次消息的结果一样,不会对业务造成影响。下面用一个实际场景来举例幂等性的实现:场景1:秒杀活动(如双十一,春节高铁买票)用count表示库存比如库存10

2020-09-03 19:29:57 444

原创 2.AMQP协议和rabbitMQ

AMQP,即 高级消息队列协议(Advanced Message Queuing Protocol),是一个消息中间件应用层协议,用于组件之间的解耦,来提供 统一消息服务。主要功能是 排序消息,路由消息(包括点对点和订阅-发布),保证消息的可靠性和安全性。遵循AMPQ协议的客户端,都能通过 消息中间件 相互通信。这样 客户端 就可以采用不同的开发语言实现,彼此无强依赖关系,降低客户端复杂性,提高开发效率也利于后期维护。AMQP 的模型架构如下:最左端和最右端,publisher(消息生产者),co

2020-09-03 19:27:31 195

原创 1.什么是消息中间件,为什么要使用?

先理解 消息 ,消息队列 这两个概念,才能更好的理解什么是 消息中间件消息(message):指在服务之间传送的数据。可以是简单的文本消息,也可以使复杂包含嵌入对象的消息消息队列(message queue):指用来存放消息的队列,一般采用先见先出的队列方式消息中间件:指管理消息队列的一个服务。队列的一端接收生产者的消息,另一端去取出消息供消费者消费。其中 消息生产者 只管把 消息 发送到 消息中间件,而不用管谁来取。消息消费者 只管从 消息中间件 取出消息,而不用管是谁发布的。这样将 生产

2020-09-01 20:39:44 349

原创 2.btree索引和优化

索引的作用是什么大大减小服务器查找数据所需要的时间。索引类似目录,可以快速定位到某个区域,找到响应的数据,减少服务器扫描的数据量,效率快。而如果没有索引,只能一页一页翻找寻找需要的内容。在磁盘上表现就是要遍历扫描查找,查找的数据量大,效率慢。另外在索引通常是按键值顺序存放的,而数据行的物理地址则是随机分布的。使用索引进行查找能让随机IO,变成顺序IO,而磁盘的顺序IO,性能肯定好于随机IO。索引的类型主要有以下几种:1. Btree索引2. 自适应HASH索引3. 全文索引4. 空间索.

2020-09-01 15:42:17 341

原创 1.影响mysql性能的因素

####问:影响mysql性能的因素有哪些?答:服务器硬件磁盘io网卡流量操作系统(32位,64位,系统不同性能不同,另外操作系统的一些参数也会影响db性能)mysql存储引擎(一主多从,两主多从等等)mysql架构设计( innodb,myisam,archive 等等)mysql表格设计(影响挺大)日志文件格式(二进制日志格式,基于段的格式STATEMENT,基于行的格式ROW)sql查询速度(慢查询,工作中这个接触较多)大事务(运行时间长,或操作数据量大)大表(记录行数巨大,

2020-09-01 10:34:26 165

原创 自动化部署CI/CD和微服务

如上图,使用微服务开发时的整个流程。在上面流程中,开发人员只需要将代码提交到相应的分支,环境会自动对代码做测试并生成相应的镜像,并再根据新的镜像生成新的服务微服务可以理解为项目的模块,运行在docker(主流),而管理这些docker,用k8s(主流)为什么要用到微服务?在传统的架构中,应用如果频繁升级,开发团队会非常痛苦。因为企业系统经过多年发展,往往会非常庞大,复杂性太高,要改变...

2019-10-23 22:26:59 1375

原创 05)容器编排docker swarm

所有操作都在本地一台机器进行,容器都在一台机器。但有些app部署在一台机器上根本无法满足需求,需要部署在多台机器,那问题来了,如下:如上图问题,这时候就需要用到容器编排技术,docker swarm 是docker 自带的一种编排工具docker swarm 是一个集群架构既然是集群,肯定有node,而node又有角色(如leader,follower等)swarm共有2种角色,ma...

2019-09-30 17:23:04 314

原创 04)docker 的网路

上图,docker 的网络类型有4种。在底层实现上,利用的是linux 内核的network namespace,大概图如下上图,linux 内核中不同的 network namespace 通过一对 veth 通信的方法下图,docker 通过veth 通信的方法问题1:container之间如何实现互相访问?在启动docker 时,默认会创建1个docker0的 ne...

2019-09-30 15:58:49 125

原创 3)dockerfile 文件构建docker image

参考(https://www.cnblogs.com/panwenbin-logs/p/8007348.html添加链接描述)什么是dockerfile?dockerfile 是用来构建docker image 的脚本文件,内含一些列命令和参数用dockerfile 构建image 分2步:1. 编写dockerfile 文件2. docker build 命令,构建 image...

2019-09-30 15:07:51 932

原创 2)什么是docker

《docker的常用命令》Docker 容器技术的一种实现方法,是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上docker 的架构大概如上图,安装docker后,有2个部分,server端和client端server端提供restful-api 接口供 client 端访问,server端和...

2019-09-30 11:16:43 134

原创 1)centos7安装docker

流程:1. 卸载旧版本docker2. 安装docker依赖3. 设置源库4. 安装docker5. 设置docker镜像源地址6. 拉取 hello-world 镜像,测试是否安装成功1. 卸载旧版本docker进入docker官网,左边社区版本,有各种系统的详细安装文档,这里选择 centos7,如下图sudo yum remove docker \ ...

2019-09-14 16:14:03 179

原创 vagrant安装centos7

流程如下:1. 下载安装vitural-box2. 下载vagrant3. 添加box4. 初始化box,初始化系统,启动系统1.下载安装virtural-box地址:https://www.virtualbox.org/如上图示,找到对应的版本下载,我用的是window系统,就下载window。至于安装,没什么好说,选好安装路劲,一直点下一步就行。2.下载安装vagr...

2019-09-14 14:30:03 5850 5

原创 gRPC实现简单helloworld

用golang,结合gRPC,实现远程调用,输出 hello world关于gRPC的安装看《centos7安gRPC》流程如下: 1. 编写 .proto文件 2. 用 protoc 工具生成go代码 3. 编写 gRPC 服务端 4. 编写 gRPC 客户端 5. 运行测试目录结构如下图示例:1. 编写proto文件syntax = "proto3";// 指...

2019-09-13 20:39:16 670

原创 centos7安gRPC

gRPC是由Google主导开发的RPC框架,使用HTTP/2协议并用Protobuf作为序列化工具,因此需要安装2个工具protobuf 序列化框架:https://github.com/protocolbuffers/protobufprotoc-gen-go工具:将proto文件转换成go代码,https://github.com/golang/protobuf/protoc-gen-...

2019-09-13 15:42:26 654

原创 go get github没速度的替代方法

有时github网页能正常打开,但是一用到 go get 命令下载包,网速就会特别慢,跟着网上修改 dns 也没效果,可以用以下方法替代 1. 克隆到 码云 里面 2. 再用 码云 克隆包本地 3. 进入响应的克隆宝,运行 go install 安装以 go get -d -u github.com/golang/protobuf/protoc-gen-go 为例,如下图示:...

2019-09-13 15:28:19 1327

原创 15)mysql无限分类表设计和优化

参考:平然老师的《与MySQL的零距离接触》5-13小节为什么要有无线分类表设计?在实际的开发中,比如商品类别,其有很多延伸。比如图书,可以分类为小说,历史,哲学,音乐等,而小说里面又可以分为科幻小说,游戏小说等等,还可以再一级一级继续分,那么这种分类就属于无限分类。理论上可以设计很多张表,但随着分类的逐步增多,表的数目会越来越多,所以要有无限分类表的设计语法结构如下:type_i...

2019-09-10 22:17:18 477

原创 go context 包

在Go服务器中,每个传入的请求都在其自己的goroutine中处理。请求处理程序通常会启动其他goroutine来访问后端,例如数据库和RPC服务处理请求的goroutine集合通常需要访问特定于请求的值,例如最终用户的身份,授权令牌和请求的截止日期。当请求被取消或超时时,处理该请求的所有goroutine都应该快速退出,以便系统可以回收它们正在使用的任何资源。go提供了一个’contex...

2019-09-10 14:14:13 106

原创 go实现上传和下载excel接口

编写html文件<html><head> <title>下载excel文件</title></head><body> <form enctype="multipart/form-data" action="http://127.0.0.1:8080/upload" method="POST"> &...

2019-09-10 14:03:52 3866

原创 go创建读取excel文件

github地址https://github.com/360EntSecGroup-Skylar/excelizeExcelize 是 Go 语言编写的一个用来操作 Office Excel 文档类库,基于 ECMA-376 Office OpenXML 标准。可以使用它来读取、写入 XLSX 文件。相比较其他的开源类库,Excelize 支持写入原本带有图片(表)的文档,还支持向 Exce...

2019-09-09 22:42:17 2208

原创 thrift框架封装实现简单的hello world

第一步:编写 thrift 文件定义 命名空间,数据结构,服务接口数据结构并非一定要定义,但在实际项目中一般会将需要的数据做封装,即定义数据结构#命名空间namespace go rpc# 服务接口service hello { string helloString(1:i64 uid)}thrift 工具生成代码,如下hello-remote.go 为生成的...

2019-09-05 10:57:18 260

原创 centos7安装thrift

下载压缩包http://thrift.apache.org/download安装依赖环境sudo yum install automake libtool flex bison pkgconfig gcc-c++ boost-devel libevent-devel zlib-devel python-devel ruby-devel openssl-devel解压压缩文件,进入thri...

2019-09-05 10:48:13 572

原创 xorm 反转代码工具

参考 xorm 使用文档http://gobook.io/read/github.com/go-xorm/manual-zh-CN/安装go get github.com/go-xorm/cmd/xorm安装后输入 xorm help 查看具体命令The commands are:reverse reverse a db to codesshell a gene...

2019-09-05 10:18:25 778

原创 7) redis(zset)命令详解,时间复杂度及演示

2019-09-05 09:50:05 2095

原创 6) redis(set)命令详解,时间复杂度及演示

2019-09-05 09:40:33 448

原创 5) redis(list)命令详解,时间复杂度及演示

(list)列表命令Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)...

2019-09-05 09:37:54 338

原创 4) redis(hash)命令详解,时间复杂度及演示

(hash)哈希表命令hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。每个 hash 可以存储 232 - 1 键值对(40多亿)

2019-09-05 09:13:49 1657

原创 3) redis(string)命令详解,时间复杂度及演示

(string)字符串命令,一个键最大能存512m

2019-09-05 09:13:20 478

原创 2) redis通用命令详解,时间复杂度及演示

通用命令:keys,dbsize, exists key, del key [key...], expire key seconds, type key 因为keys要遍历数据库,速度慢,一般不在生产环境中使用

2019-09-05 09:12:47 217

原创 1) redis的安装常用数据类型及图示

https://www.redis.net.cn/download/redis官网有下载安装教程

2019-09-05 09:10:54 111

原创 《TCP/IP协议》详解

内容来自网络,本文为个人总结参考: (https://www.cnblogs.com/buxiangxin/p/8336022.htmlhttps://www.cnblogs.com/duanwandao/p/9941411.htmlhttps://blog.csdn.net/wn_hello/article/details/50066339https://blog.csdn.net/q...

2019-09-05 08:48:54 244

原创 14)mysql事务

什么是事务事务是数据库执行操作的最小单元事务可以有一个sql组成,也可以由多个sql组成组成事务的sql要么全执行成功,要么全执行失败事务的语法START TRANSACTION / BEGIN SELECT ... UPDATE ... INSERT ...COMMIT / ROLLBACK用start transaction 或者 b...

2019-09-04 16:08:25 101

空空如也

空空如也

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

TA关注的人

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