- 博客(42)
- 收藏
- 关注
原创 golang之channel源码解析
type hchan struct { dataqsiz uint //缓冲槽大小 buf unsafe.Pointer//缓冲槽指针 sendx uint // 发送索引 recvx uint // 接受索引 recvq waitq // 接收队列 sendq waitq // 发送队列}异步和同步的区别,在于是............
2021-04-17 15:11:52
486
原创 MySql中“too many connections“错误
有时候在使用mysql过程中会出现"too many connections"的错误,顾名思义是因为连接数过多造成的,造成连接数过多的原因主要有:系统硬件等限制:根据官方说明,连接数受到线程库质量、RAM的可用性,响应时间,可用的文件描述符数量等影响,这种方式的解决方式为增加服务器或提高服务器的性能。连接的释放:这个很好理解,连接如果没有被正常释放,也可能导致连接数过多。最大连接数设置过低前面两种情况不做过多讲解,重点来讲一下如何合理的设置最大连接数。max_connections查看最大连
2021-04-07 11:40:01
784
原创 ab压测
常用命令表示一次发送1000请求,并发请求100个$ ab -n 1000 -c 100 http://localhost:8030/buy/goodsThis is ApacheBench, Version 2.3 <$Revision: 1874286 $>Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/Licensed to The Apache Software Foundati
2021-04-02 10:37:56
503
原创 golang的json源码解析
golang序列化和反序列化在encoding/json包,主要方法为encoding/json.Marshal和encoding/json.Unmarshal,序列化和反序列化主要是通过反射来实现的。序列化一开始序列化会定义一个encodeState结构体,因为在序列化过程中可以理解为一种树形的解析方式,这个后面会讲,树形的方式常规的一种方式就是用递归的方式去实现,我们知道递归很容易引起性能问题,所以go源码里也做了缓存的优化,encodeState里用到了bytes.Buffer,正是在递归过程中不
2021-01-26 11:42:14
1536
原创 golang的struct tag
格式type strutName struct{ fieldName type `key:"value,opt1,opt2,opts..." key2:"value2,opt1,opt2,opts..."`}结构体字段fieldName首字母必须是大写,在go中首字母大小写代表公私有属性tag都是以key:"value"的形式存在,多个键值对之间用空格隔开,这个的好处是可以构建多个json解析器举例说明多json解析器忽略空值omitempty表示在编码时如果字段为空,则忽略这
2021-01-08 08:22:31
2483
原创 etcd网络层源码分析(一)
etcdserver.NewServer//轻量级,用了不会关闭var err errort.streamRt, err = newStreamRoundTripper(t.TLSInfo, t.DialTimeout)if err != nil { return err}//对于大的数据pipeline,用了立刻关闭的入口t.pipelineRt, err = NewRoundTripper(t.TLSInfo, t.DialTimeout)if err != nil { retur
2020-10-31 22:44:05
394
原创 etcd配置文件
成员标志-name此成员的可读名称默认值:“default”环境变量:ETCD_NAME-data-dir数据目录的路径环境变量:ETCD_WAL_DIR–wal-dir专用wal目录的路径。如果设置了此标志,etcd会将WAL文件写入walDir而不是dataDir。这允许使用专用磁盘,并有助于避免日志记录和其他IO操作之间的io竞争。–snapshot-count触发快照到磁盘的已提交事务数默认值:“100000”环境变量:ETCD_SNAPSHOT_CO
2020-09-11 08:29:49
3406
1
原创 etcd安装
github下载etcd$ git clone https://github.com/etcd-io/etcd.git$ cd etcd$chmod +x build$ ./build运行服务端cd /bin./etcd客户端cd /bin./etcdctl put foo bar./etcdctl get foo安装参考
2020-09-11 07:54:34
154
翻译 etcd的v3基准测试
etcd自带基准测试基准测试在目录tool/benchmark,可以通过go install安装后运行测试# write to leaderbenchmark --endpoints=${HOST_1} --target-leader --conns=1 --clients=1 \ put --key-size=8 --sequential-keys --total=10000 --val-size=256benchmark --endpoints=${HOST_1} --target-lea
2020-09-10 11:54:31
814
1
原创 redis6.0源码整数集合
整数集合是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时,Redis就会使用整数集合键的底层实现。typedef struct intset { //编码方式 uint32_t encoding; //集合包含的元素数量 uint32_t length; //保存元素的数组 int8_t contents[];} intset;contents数组是整数集合的底层实现:整数集合的每个元素都是contents数组的一个数据项(i
2020-07-30 21:28:26
142
原创 Innodb锁讲解
概述上一章我们讲到,MyISAM和MEMORY存储引擎采用的是表级锁;BDB存储引擎采用的是页面锁,但也支持表级锁;InnoDB存储引擎即支持行级锁,也支持表级锁。行锁的共享锁和排它锁InnoDB实现了一下两种类型行锁:共享锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。排他锁(X): 允许获得排他锁的事务更新数据,阻止其他事务取得相同数据集的共享锁和排他锁。另外,为了允许行锁和表锁共存,实现多粒度机制,InnoDB还有两种内部使用的意向锁(Intention Locks)
2020-06-09 10:34:51
1173
原创 SQL优化连弹四之show profile
MySQL从5.0.37版本开始增加了对show profiles和show profile语句的支持。是否支持mysql> select @@have_profiling;+------------------+| @@have_profiling |+------------------+| YES |+------------------+1 row in set, 1 warning (0.00 sec)开启mysql> select .
2020-05-28 14:13:04
179
转载 mysql分布式事务XA
在MySQL中,使用分布式事务的应用程序及一个或多个资源管理器和一个事务管理器。资源管理器(RM)用于提供通向事务资源的途径。数据库服务器是一种资源管理器。该管理器必须可以提交或回滚由RM管理的事务。事务管理器™用于协调作为一个分布式事务一部分的事务。TM与管理每个事务的RMs进行通信。在一个分布式事务中,各个单个事务均是分布式事务的“分支事务”。分布式事务和各分支通过一种命名方法进行标识。MySQL执行XA MySQL时,MySQL服务器相当于一个用于管理分布式事务中XA事务的资源管理器。与MyS
2020-05-27 20:08:58
277
转载 mysql join
数据库中join又称连接我们会以两张表做例子customer:mysql> select * from customer;+------------+-----------+| customerid | name |+------------+-----------+| 1 | Joe || 2 | Christian || 3 | Zero || 4 | Karl .
2020-05-20 10:16:53
145
转载 mysql数据类型
数值类型日期和时间类型字符串类型参考:https://www.kancloud.cn/thinkphp/mysql-design-optimalize/39325更多讲解,欢迎关注我的github:go成神之路
2020-05-19 09:17:33
167
原创 vscode调试redis
系统:ubunturedis:redis-6.0.31.在vs中安装c/c++编译插件2.用vscode打开redis-6.0.33.在菜单中找到run->Add Configuration…4.会在目录中生成一个./vscode目录,里面包含launch.json,修改launch.json中的program:${workspaceFolder}/src/redis-server5.在./vscode目录下新建tasks.json{"version": "2.0.0","ta
2020-05-18 13:48:42
6436
2
原创 redis6.0源码跳跃表
跳跃表主要用于有序集合键,另一个是在集群节点中用作内部数据结构。结构体定义跳跃表的结构定义在server.h/zskiplisttypedef struct zskiplistNode { sds ele;//成员对象 double score;//分数 struct zskiplistNode *backward; //层 struct zskiplistLevel { //前进指针 struct zskiplistNode *f.
2020-05-18 10:48:27
306
原创 redis6.0源码字典的实现
哈希表节点typedef struct dictht { //哈希表数组 dictEntry **table; //哈希表大小 unsigned long size; unsigned long sizemask; unsigned long used;} dictht;哈希表typedef struct dictEntry { //键 void *key; //值 union { void *val;
2020-05-13 10:03:32
306
原创 redis6.0源码双端链表
链表节点adlist.h/listNodetypedef struct listNode { struct listNode *prev;//前置节点 struct listNode *next;//后置节点 void *value;//节点值} listNode;typedef struct list { listNode *head;//表头节点 ...
2020-05-12 07:56:28
189
原创 SQL优化连弹二之show status
show status查看服务器状态信息mysql提供show status命令可以查看服务器的状态信息,故可以用这个命令了解各个SQL的执行频率。SHOW [GLOBAL | SESSION] STATUS [LIKE 'pattern' | WHERE expr]从命令可以看出show status分别可以从全局global和当前session去查询服务器的状态信息,不填的话默...
2020-05-07 11:46:52
365
原创 SQL优化连弹一之慢查询日志开启
查看是否开启慢查询slow_query_log慢查询开启状态,默认OFFslow_query_log_file慢查询日志文件存放的路径mysql> show variables like 'slow_query%';+---------------------+-----------------------------------+| Variable_name | V...
2020-05-07 10:22:50
130
原创 redis6.0源码动态字符串SDS
redis中没有使用传统c语言的字符串,而是自己构建了sds与c字符串的异同:C字符串SDS获取字符串长度的复杂度为O(N)获取字符串长度的复杂度为O(1)API是不安全的,可能会造成缓冲区溢出(手动分配)API是安全的,不会造成缓冲区溢出(预分配)修改字符串长度N次必然需要执行N次内存重分配修改字符串长度N次最多需要N次内存重分配(做了预分配和惰性空间释...
2020-05-04 22:38:10
391
原创 redis分布式锁官方解读
概述在许多环境中,不同的进程必须以互斥的方式使用共享资源进行操作,就用到分布式锁。分布式锁具有的特性:安全性:在任意给定时刻,只有一个客户端可以获得锁,具有排它性。容错性A:避免死锁。客户端最终一定可以获得锁,即使锁住某个资源的客户端在释放锁之前崩溃或者发生网络分区。容错性B:只要大多数的节点都处于运行状态,客户端就可以获取和释放锁。Redlock算法介绍在算法的分布式版本中,假...
2020-04-24 21:54:23
234
原创 go module初探
在设置go module最好先设置一下环境变量:export GO111MODULE=onexport GOPROXY=https://goproxy.io // 设置代理
2020-04-12 17:02:24
688
原创 redis主从复制之配置
概述redis的复制的流程是怎样的?复制有哪几种方式比方说现在有两台机192.168.85.110主节点,192.168.85.111是从节点,前置-安全性校验在开启主从复制之前,redis配置默认有保护模式配置,需要设置一下,否则会导致开启主从复制失败。方式一修改保护模式:redis默认只允许本地客户端进行连接,所以在设置主从复制的时候,需要关闭主节点的保护,在配置中修改prot...
2020-04-02 08:44:45
140
原创 go双链表list源码解读
什么是双链表双向链表,又称为双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。基本结构golang的双链表在container/list中包中,整个链表称为List。双向链表也是线性结构,由一个root节点起始,形成的双向循环链表Listtype ...
2020-03-21 10:40:26
182
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人