- 博客(50)
- 资源 (2)
- 收藏
- 关注
原创 常见排序算法
go语言实现常见排序算法冒泡func maopaoArray(nums []int) { for i:=0; i<len(nums); i++ { for j:=0;j<len(nums);j++ { if nums[j] > nums[j+1] { nums[j], nums[j+1] = nums[j+1], nums[j] } } }}+ 快排func quickSort(nums []int, start, end int) {
2021-05-25 08:59:57
126
原创 redis底层数据结构-quicklist
redis底层数据结构-quicklistquicklistRedis对外暴露的list数据类型,它底层实现所依赖的内部数据结构就是quicklist。quicklist是一个双向链表,而且是一个ziplist的双向链表,也就是说quicklist的每个节点都是ziplistziplistziplist是一个有序列表,而且是一个内存紧缩的列表,即一整块连续内存(各个数据项在内存上前后相邻)quicklist和ziplist 优缺点双向链表便于在表的两端进行push和pop操作,但是
2020-11-10 22:18:06
397
原创 常见分布式唯一ID生成方案
分布式id要求全局唯一高性能,高可用,低延时,否则可能会成为系统瓶颈好接入,拿来即用的原则尽量满足趋势递增生成方式UUID数据库自增id数据库多主模式号段模式redis雪花算法(SnowFlake)滴滴出品(TinyID)百度(Uidgenerator)美团(leaf)...
2020-11-10 21:49:18
170
原创 GO内存管理
GO内存管理虚拟内存虚拟内存是操作系统的一大功能,它向进程屏蔽了底层的RAM和磁盘,并向进程提供了远超物理内存大小的内存空间,就是说所有进程使用的内存之和要远大于物理内存。在没有虚拟内存的时代,物理内存是被多个进程共享的,多进程同时访问同一个物理内存是存在并发访问的问题的,需要加锁操作。引入虚拟内存后,每个进程都有各自的虚拟内存,内存的并发访问问题的粒度从多进程级别降低到了多线程级别。进程访问内存,实际访问的是虚拟内存,虚拟内存通过页表查看,当前要访问的虚拟内存地址,是否已经加载到物理内存,如果已
2020-11-07 13:02:00
258
1
原创 简述http1.0/1.1/2.0及https
http1.0/1.1性能问题1、早期 HTTP/1.0 性能上的一个很大的问题,那就是每发起一个请求,都要新建一次 TCP 连接(三次握手),而且是串行请求,做了无谓的 TCP 连接建立和断开,增加了通信开销。2、为了解决上述 TCP 连接问题,HTTP/1.1 提出了长连接的通信方式,也叫持久连接。这种方式的好处在于减少了 TCP 连接的重复建立和断开所造成的额外开销,减轻了服务器端的负载。3、http1.1的管道网络传输,即可在同一个 TCP 连接里面,客户端可以发起多个请求,只要第一个请求
2020-11-05 13:29:00
775
原创 TCP全链接队列
问题最近发现客户端调用RT比较高,并且偶尔Connection reset出现,而查看服务运行情况,资源占用cpu、memory和线程都正常。通过分析是服务的一个api接口处理过慢,慢接口导致tcp全链接队列溢出全链接队列和半链接队列tcp三次握手时,linux内核会维护两个队列:全链接队列,也称为syn队列半链接队列,也称为accept队列三次握手过程1、 客户端发送SYN包,并进入SYN_SENT状态2、服务端接收到数据包将相关信息放入半连接队列(SYN 队列),并返回SYN+ACK
2020-11-03 17:44:16
415
原创 常见分布式事务解决方案
常见分布式事务解决方案前提mysql的锁机制,行锁,表锁,间隙锁。行锁仅对有索引的查询才生效,是作用在索引上的,锁住的是数据记录。表锁是针对没有索引的字段查询时,会加表锁,或者dba在操作数据库表时会加表锁,表锁锁住的也是数据记录。间隙锁是mysql为了解决RR(可重复读)隔离级别下,当前读的幻读问题,间隙锁不锁数据记录,它锁住的是数据之间的间隙(B+树叶子节点页内数据之间的间隙)mysql的当前读和快照读,所有当前读都会加行锁,常见当前读有selece for update、update、d
2020-11-01 20:14:28
106
原创 mysql分库分表
mysql分库分表用户表拆分水平分表用户表索引字段 用户uid 手机号水平分为128张表,分片键为用户id,采用hash取模方式,id mod 128, 128张表可以在一个库里,也可以在比如4个库里,每个库32张表。查询时,用户id直接mod 128就知道去查那张表,如果用户表比如有手机号索引字段,那么根据手机号怎么查询用户信息呢,这就需要建立手机号和用户id映射表,同时映射表也需要分表,采用手机号作为分片键,查询先根据手机号查到用户id,在根据id去查询用户信息。整体采用空间换时间的思想
2020-10-31 12:21:29
424
原创 InnoDB 存储引擎浅析
InnoDB 存储引擎浅析InnoDB 主要分为两大块:InnoDB内存架构 (InnoDB In-Memory Structures)InnoDB磁盘架构 (InnoDB On-Disk Structures)InnoDB 内存架构Buffer Pool当我们执行dml语句时,mysql不会直接去修改磁盘数据,因为这样做太慢了,mysq会先改内存,然后记录redolog和binlog(redolog和binlog采用两阶段提交机制,确保binlog写入完整性进而保证主从架构的从库数据
2020-10-28 13:20:03
76
原创 分布式数据库之数据分区
分布式数据库之数据分区顺序分布比如:1-100个数字,要保存到3个节点上,每个节点平均存储,1-33存储在第1个节点,34-66存储到2节点,剩余存储到3节点。顺序存储常用在关系型存储上hash分布节点取余分区比如100个数据,对每个数据进行hash运算之后,再于节点数进行取余运算,根据余数保存在不同节点上。缺点:当节点扩容或缩容时需要迁移的数据量较大一致性hash分区将所有0-2的32次方的所有数据进行hash运算,结果组成一个hash环,对数据进行hash找到在环上的位置,顺时针方
2020-08-25 17:44:34
490
原创 redis集群三种解决方案
redis 主从redis sentinelsentinel模式是建立在主从模式的基础上,解决了主从模式下master挂掉后,不会自动故障转移的缺点,当master节点挂了以后,sentinel会在slave中选择一个做为master,并修改它们的配置文件,其他slave的配置文件也会被修改,比如slaveof属性会指向新的master,当master节点重新启动后,它将不再是master而是做为slave接收新的master节点的同步数据。sentinel因为也是一个进程有挂掉的可能,所以s
2020-06-01 22:44:56
210
原创 sql优化系列之explain执行计划
关于explain执行计划,这些知识点,你不得不知道,否则你怎么敢说你做过sql调优呢???explain 用处当explain和sql一起使用时,mysql会显示来自优化器关于sql执行的信息。也就是说,mysql会解释它将如何处理该sql语句,包括是否会使用索引,可能使用到的索引,以及最终使用的索引,表链接及顺序等等。所以学会查看explain执行计划非常重要。explain所有字段总的来说,explain包含如下字段:id、select_type、table、partitions、type、p
2020-05-31 21:47:20
191
原创 数据库服务要容器化吗
项目中,你的数据库服务有docker化吗,将数据库服务容器化会带来什么问题。问题1.数据安全性问题2.容器网络问题3.资源隔离问题总结在docker中容器化无状态服务是很不错的,可以实现服务的水平伸缩,通过容器编排避免单点故障的问题,但是数据库这种有状态的服务,我们的数据是需要存储到宿主机的,如果数据库服务做横向伸缩,那么数据必然将保存在多个节点上,我们知道docker容器挂掉,是会重...
2020-03-19 22:07:13
546
原创 项目中为什么要使用redis
你的项目中为什么要使用redis呢,相信主要是从性能和并发考虑。优点1.纯内存操作2.单线程操作,避免了频繁的上下文切换3.采用了非阻塞I\O多路复用机制对于变动较少的数据,或者查询时间比较长的数据,我们可以将查询结果缓存到redis,这样请求就能够迅速响应。特别是秒杀系统,在这种高并发情况下,可以有效缓解数据库压力。常见问题1.缓存和数据库数据一致性问题2.缓存雪崩问题3.缓存...
2020-03-19 21:18:29
2071
原创 go语言-变量逃逸
go变量逃逸go语言的一个变量是在堆上分配,还是在栈上分配,是经过golang编译器的逃逸分析之后得出结论的,这一切都是编译器帮我们完成的。什么是变量逃逸简单来说,变量逃逸就是一个变量由栈逃逸到堆的过程。我们知道c和c++变量的内存分配和销毁都是需要程序员手动来执行的。举个栗子,在函数内部定义了一个局部变量,然后返回这个局部变量的地址,这些局部变量是在栈上分配的(静态分配内存),一旦函数...
2020-03-17 21:47:54
477
原创 微服务
微服务广义上讲,微服务是一种分布式系统解决方案,推动细粒度服务的使用,这些服务协同工作。简而言之,微服务架构风格是将单个应用作为一组小型服务开发的方法,每个服务程序都在自己的进程总进行,并与轻量级机制rpc或httpApi进程通信。这些服务是围绕着业务功能构建的,可以通过全自动部署机器进行独立部署。这些服务可以用不同的编程语言编写,使用不同的存储技术,并尽量不用集中方式进行管理。protob...
2020-03-14 09:02:38
83
原创 go守护进程
go守护进程将你的go应用运行为守护进程,这里介绍一个github包,跨平台,简单易用。前提知识点linux系统下注册为系统服务,实现守护进程运行,主要通过systemd实现。systemd是系统启动的第一个进程systemctl是管理systemd的工具systemctl常用来管理和监督常驻服务,确保其运行。 类似supervisor守护进程工具。systemctl命令sy...
2020-03-10 16:04:38
1471
原创 sql执行过程
sql执行过程一个sql语句是如何执行的?从mysql服务架构说起。mysql内部大致分为服务层和存储引擎层两部分服务层:包含连接器、查询缓存、分析器、优化器、执行器等。涵盖mysql的大多数核心服务功能及所有内置函数(如日期、时间、数据和加密等)所有跨存储引擎的功能都将在这一层实现,比如存储过程、触发器、视图、函数等,也包括通用的binlog日志模块。存储引擎层:包含数据的存储和...
2020-03-06 23:01:57
199
原创 docker swarm集群
初始化一个docker swarm集群 在manager节点上执行docker swarm init ,执行输出的命令,其他节点加入集群即可service操作 创建一个名字为demo的service docker service create --name demo busybox 将demo的service横向扩展为5个 docker servide scale demo...
2020-03-06 22:31:44
171
原创 docker swarm
docker swarm 部署服务一部分docker swarm init 初始化docker swarm集群managerdocker service create --name demo busybox 创建一个servicedocker servide scale demo=5 横向扩展为5个docker service ls 查看服务docker se...
2020-03-06 14:24:34
168
原创 AES对称加解密
python实现AES对称加解密关于aes对称加密的概念网上很多,在此不在赘述,直接上代码。import base64from Crypto.Cipher import AES"""AES加密解密工具类数据块128位key 为16位iv 为16位AES加密模式为cbc填充 pkcs7padding"""class MyRes(object): def __in...
2020-02-20 15:19:29
331
原创 非对称加密RSA
python实现rsa加解密概念网上很多,不再赘述,直接上代码。import rsaimport base64# 1、公私钥由服务端生成(agent配置文件是服务端生成)# 2、对称加密key必须是16位字符串,采用公钥加密,私钥解密# 3、body数据采用key进行res对称加密class MyRsa(object): # 生成公私钥 def genkey(sel...
2020-02-20 15:16:11
269
转载 go实现rsa加解密
go实现rsa加解密概念网上很多,不再赘述,直接上代码。github地址:https://github.com/farmerx/gorsa
2020-02-20 15:12:24
403
原创 golang处理高并发
golang处理高并发,保证线性安全的各种方式package mainimport ( "fmt" "sync" "sync/atomic")func main() { var num int64 var wg sync.WaitGroup for i := 0; i < 1000; i ++ { wg.Add(1) go func() { defe...
2019-12-03 22:38:10
259
原创 数据结构与算法--树
golang版本package mainimport ( "fmt")type Node struct { value int left *Node right *Node}func newNode(value int) *Node{ return &Node{ value: value, left: nil, right: nil, }}...
2019-11-17 10:15:48
83
原创 寻找最长不含有重复字符的子串
寻找最长不含有重复字符的子传golang没有char类型,只有runegolang遍历字符串时,拿到的字符不是char类型package mainimport "fmt"func main() { fmt.Println(findMaxlength("wersddss")) fmt.Println(findMaxlength("")) fmt.Println(findMax...
2019-11-16 13:05:06
130
原创 golang高级语法及特点
golang基础及语法特点golang特点枚举类型 iota没有char 只有runego语言所有类型都有默认值原生支持复数类型switch后可以没有表达式只有for 没有while for可以不要条件 可以只有退出条件函数没有缺省参数数组是值类型,调用func f(arr [10]int)会 拷贝 数组go只有值传递没有引用传递, 所以用指针类型来补充其他语言的引用传递...
2019-11-16 10:51:03
998
原创 mysql索引
mysl索引分类B+树索引、Hash索引、全文索引是mysql数据库中的三类索引,今天着重学习最常用到的innodb存储引擎中的b+树索引。基础知识,首先你需要了解二叉查找树,平衡二叉树和B树这三种数据结构。二叉查找树特点:任何节点的左子节点的键值都小于当前节点,右子节点的键值都大于当前节点。平衡二叉树在二叉查找树的基础上保持树的平衡,特点每个节点的左右子树的高度差不能超过...
2019-11-09 22:25:38
92
原创 docker-compose
docker-compose 容器的批处理工具,仅适合本地开发测试用。目前为止3个版本, Versin1/2/3docker-compose up -d 创建并启动容器docker-compose ps 查看容器docker-compose stop 停止容器服务docker-compose start 开启容器服务docker-compose down 停止并删除容器d...
2019-11-09 21:47:41
76
原创 dockerfile
dockerfile讲解FROMFROM scratch 制作base imageFROM centos 使用base imageFROM ubuntu:14.04 使用base imageLABELmaintainer 维护者descripe 描述RUN 执行命令并创建新的image layer,(构建image时用来执行命令)RUN shell命令 ...
2019-11-09 12:46:54
59
原创 docker容器网络模式
docker网络模式1.Nat ( network address translation) 桥接模式 docker容器的默认模式网络资源隔离无需手动配置可以访问外网外界无法直接访问容器ip低性能端口管理麻烦 (需要端口映射)容器访问外界使用的是iptables的SNAT规则外界访问容器使用的是DNAT规则ifconfig 其中docker0地址是docker容器的网关查...
2019-11-02 19:47:52
606
原创 jinkins自动化部署
docker常用命令docker exec -it 容器id /bin/bash 进入容器docker psdocker ps -adocker rm 容器iddocker rmi 镜像iddocker start 容器iddocker stop 容器iddocker imagesdocker build -t 镜像名字:tag . (基于当前目录下的dockerfil...
2019-11-02 08:42:32
856
原创 链表笔试题
反转链表# 节点class Node(object): def __init__(self, elem): self.elem = elem self.next = None# 链表class SingleList(object): def __init__(self, head): self.head = head...
2019-09-15 22:46:28
92
原创 mysql单表记录和优化
mysql单表最大记录数其实mysql本身并没有对单表最大记录数进行限制,但是从性能考虑,肯定是有影响的。曾广为流传的一个说法:mysql单表数据量超过2000万行,性能会明显下降,当年的百度DBA测试mysql性能时发现,当单表数据量在2000万行量级的时候,SQL操作性能急剧下降,因此结论由此而来。阿里巴巴《java开发手册》提出单表行数超过500万行或者单表容量超过2GB,才推荐进行分...
2019-09-15 08:42:12
187
原创 mysql索引,哈希索引,聚集索引,二级索引
哈希索引哈希索引,只有精确匹配索引所有列的查询才有效,对于每一行数据,存储引擎都会对所有的索引计算一个哈希码。哈希索引将所有的哈希码存储在索引中,同时在哈希表中保存指向每个数据行的指针。(如果多个列的哈希值相同,索引会以链表的方式存放多个指针记录到同一个哈希条目中。)因为索引自身只存储对应的哈希值,所以索引的结构十分紧凑,哈希索引查找的速度非常快,但是哈希索引也有它的限制:1、哈希索引不是...
2019-09-07 21:03:45
349
原创 mysql索引,B树和B+树
索引是一种用于快速查询行的数据结构,存储引擎使用索引也是,先在索引中找到对应的值,然后根据匹配的索引记录找到对应的行。B树和B+树B树大多数存储引擎都支持B树索引,b树通常意味着所有值都是按顺序存储的,并且每一个叶子到根的距离相同,因为存储引擎不再需要进行全表扫描来获取数据。B+树B+树是B树的升级版B+树和B树的区别:1、 B树的节点没有重复元素(采用二分法则,左小右大,左边放小...
2019-09-07 20:31:18
332
原创 docker命令
docker 基本组成 容器 镜像 仓库docker是c/s架构镜像是容器的基石,层叠的只读文件系统,bootfs,rotfs(root)联合加载一次加载多个文件系统,add emacs add apache容器通过镜像启动,容器中可以运行客户的一个或多个进程启动和执行阶段可写文件系统写时赋值镜像栈registry仓库 保存用户构建的镜像 分为共有和私有docker...
2019-09-07 19:26:52
68
原创 Nginx配置简介
nginx配置文件结构:全局配置段http配置段 server配置段(项目或应用) location配置段(url配置)1.全局配置段* user 设置使用用户(worker) * worker_processes 进行增大并发连接数的处理 跟 cpu 保持一致 八核设置八个 * error_log nginx 的错误日志 * pid nginx 服务启动时候 pid * ...
2019-08-27 22:24:01
101
原创 Redis持久化
1、RDB持久化:在指定的时间间隔对你的数据进行快照存储。2、AOF持久化:记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据。(AOF命令以redis协议追加保存每次写的操作到文件末尾.Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大)...
2019-08-26 19:13:38
80
原创 简述mysql数据库引擎Innodb和Myisam区别
innodb 支持事务, myisam 不支持事务innodb 支持外键, myisam 不支持外键innodb 支持行级锁, myisam 支持表级锁myisam 保存了表的总行数count(*), innodb没有保存,需要扫描全表查询...
2019-08-26 19:06:54
829
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人