自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

辛明辉的专栏

baby step

  • 博客(162)
  • 问答 (1)
  • 收藏
  • 关注

原创 Redis有哪些慢操作

redis 数据类型与底层数据结构的关系可以看到,String 类型的底层实现只有一种数据结构,也就是简单动态字符串。而 List、Hash、Set 和 Sorted Set 这四种数据类型,都有两种底层实现结构。通常情况下,我们会把这四种类型称为集合类型,它们的特点是一个键对应了一个集合的数据。redis 3.2后引入了quicklist结构键和值用什么结构组织Redis 使用了一个哈希表来保存所有键值对。一个哈希表,其实就是一个数组,数组的每个元素称为一个哈希桶。所以,我们常说,一个哈希表是由

2020-11-09 11:36:09 380 1

原创 redis组件大纲

访问框架索引模块存储模块高可用集群支持模块高扩展集群支持模块

2020-11-09 11:07:17 292

原创 Mysql SQL分析优化

慢SQL诱因无索引、索引失效锁等待InnoDB支持行锁,MyISAM支持表锁InnoDB支持行锁更适合高并发场景,但行锁有可能会升级为表锁一种情况是在批量更新时行锁是基于索引加的锁,如果在更新操作时,条件索引失效,那么行锁会升级为表锁基于表锁的数据库操作,会导致SQL阻塞等待,影响执行速度在写大于读的情况下,不建议使用MyISAM行锁相对于表锁,虽然粒度更细,并发能力提升,但也带来了新的问题,那就是死锁不恰当的SQLSELECT *SELECT COUNT(*)

2020-10-29 15:49:04 275

原创 MySQL -- 数据恢复

DELETE使用DELETE语句误删除了数据行,可以使用Flashback通过闪回把数据恢复Flashback恢复数据的原理:修改binlog的内容,然后拿到原库重放。前提:binlog_format=ROW和binlog_row_image=FULL针对单个事务对于INSERT语句,将Write_rows event改成Delete_rows event对于DELETE语句,将Delete_rows event改成Write_rows event对于UPDATE语句,binlog里面记录了

2020-10-26 15:05:31 247

原创 MySQL -- KILL + 客户端

KILLKILL QUERY THREAD_ID 终止这个线程中正在执行的语句KILL [ CONNECTION ] THREAD_ID 断开这个线程的连接,如果该线程有语句在执行,先停止正在执行的语句锁等待表初始化CREATE TABLE `t` ( `id` INT(11) NOT NULL, `c` INT(11) NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB;INSERT INTO t VALUES (1,1);操作次序

2020-10-26 13:02:59 251

原创 MySQL 全表扫描

Server层-- db1.t有200GBmysql -h$host -P$port -u$user -p$pwd -e "select * from db1.t" > $target_file查询数据InnoDB的数据是保存在主键索引上,全表扫描实际上是直接扫描表t的主键索引获取一行,写到net_buffer中,默认为16K,控制参数为net_buffer_length重复获取行,直到写满net_buffer,然后调用网络接口发出去如果发送成功,就清空net_buffer,然后继

2020-10-10 16:04:39 1174

原创 Mysql Join

表的初始化CREATE TABLE `t2` ( `id` INT(11) NOT NULL, `a` INT(11) DEFAULT NULL, `b` INT(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `a` (`a`)) ENGINE=InnoDB;DROP PROCEDURE IF EXISTS idata;DELIMITER ;;CREATE PROCEDURE idata()BEGIN DECLA

2020-10-09 12:28:47 153

原创 leetcode两数之和

//给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 //// 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。 //// //// 示例: //// 给定 nums = [2, 7, 11, 15], target = 9////因为 nums[0] + nums[1] = 2 + 7 = 9//所以返回 [0, 1]// // Related Topics 数组 哈希表 //

2020-09-29 14:52:16 124

原创 MySQL JOIN优化

表初始化CREATE TABLE t1(id INT PRIMARY KEY, a INT, b INT, INDEX(a));CREATE TABLE t2 LIKE t1;DROP PROCEDURE idata;DELIMITER ;;CREATE PROCEDURE idata()BEGIN DECLARE i INT; SET i=1; WHILE (i <= 1000) DO INSERT INTO t1 VALUES (i,1001-

2020-09-29 14:42:27 366

原创 grpc Q&A问答

gRPC Metadata 是通过什么传输?调用 grpc.Dial 会真正的去连接服务端吗?会,但是是异步连接的,连接状态为正在连接。但如果你设置了 grpc.WithBlock 选项,就会阻塞等待(等待握手成功)。另外你需要注意,当未设置 grpc.WithBlock 时,ctx 超时控制对其无任何效果。调用 ClientConn 不 Close 会导致泄露吗?会,除非你的客户端不是常驻进程,那么在应用结束时会被动地回收资源。但如果是常驻进程,你又真的忘记执行 Close语句,会造成的泄露。如

2020-09-22 15:52:47 768

原创 grpc 客户端连接请求源码

func main() { conn, err := grpc.Dial(":"+PORT, grpc.WithInsecure()) ... defer conn.Close() client := pb.NewSearchServiceClient(conn) resp, err := client.Search(context.Background(), &pb.SearchRequest{ Request: "gRPC", }) ...}创建拨号连接func D

2020-09-22 10:57:43 1340

原创 grpc Server初始化注册监听源码

func main() { server := grpc.NewServer() pb.RegisterSearchServiceServer(server, &SearchService{}) lis, err := net.Listen("tcp", ":"+PORT) server.Serve(lis)}为什么四行代码,就能够起一个 gRPC Server初始化// grpc.NewServer()func NewServer(opt ...ServerOption)

2020-09-21 18:36:24 1285

原创 grpc client与servre如何交互

对 Client 端调用 Server 端进行抓包去剖析。如图所示MagicSettingsHeadersDataSettingsWindow_updatePingHeadersDataHeadersWindow_UpdatepingMagicMagic 帧的主要作用是建立 HTTP/2 请求的前言。在 HTTP/2 中,要求两端都要发送一个连接前言,作为对所使用协议的最终确认,并确定 HTTP/2 连接的初始设置,客户端和服务端各自发送不同的连接前言。而上图中的 Ma

2020-09-21 15:53:36 419

原创 grpc-go 调用模式

一元调用(同步请求)servertype SearchService struct{}func (s *SearchService) Search(ctx context.Context, r *pb.SearchRequest) (*pb.SearchResponse, error) { return &pb.SearchResponse{Response: r.GetRequest() + " Server"}, nil}const PORT = "9001"func

2020-09-21 15:29:09 378

原创 缓存击穿策略singleFlight

简介缓存击穿:缓存失效时,有大量并发请求过来。大量请求从缓存上拿不到数据,请求压力全部打到数据库上。场景1:活动结束前。为了完成活动任务,请求活动配置数据请求一般会有爆发性增长。当你的服务没有做防止缓存击穿的话,就有可能让你的数据库宕机singleFlight包singleFlight会将对同一个key的所有请求,变成一个请求,所有请求共享一个请求返回的数据。场景:活动尾声大量并发请求获取活动配置数据。设置该活动key为activity_key,所有请求都会开个goroutine处理。所有请求都通

2020-09-16 16:17:26 545

原创 MySQL 用户临时表

临时表 VS 内存表内存表,指的是使用Memory引擎的表,建表语法:CREATE TABLE … ENGINE=Memory。所有数据都保存在内存中,系统重启时被清空,但表结构还在临时表,可以使用各种引擎如果使用的是InnoDB或者MyISAM引擎,数据需要写到磁盘上当然也可以使用Memory引擎特征session Asession BCREATE TEMPORARY TABLE t(c int) ENGINE=MyISAM;(创建临时表)SHOW CR

2020-07-31 15:45:15 322

原创 MySQL 内部临时表

UNIONUNION语义:取两个子查询结果的并集,重复的行只保留一行表初始化CREATE TABLE t1(id INT PRIMARY KEY, a INT, b INT, INDEX(a));DELIMITER ;;CREATE PROCEDURE idata()BEGIN DECLARE i INT; SET i=1; WHILE (i<= 1000) DO INSERT INTO t1 VALUES (i,i,i); SET

2020-07-30 12:02:48 455

原创 MySQL Memory引擎

数据组织表初始化CREATE TABLE t1 (id INT PRIMARY KEY, c INT) ENGINE=Memory;CREATE TABLE t2 (id INT PRIMARY KEY, c INT) ENGINE=InnoDB;INSERT INTO t1 VALUES (1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9),(0,0);INSERT INTO t2 VALUES (1,1),(2,2),(3,3),(4,4)

2020-07-28 18:15:25 463

原创 MYSQL 自增主键

自增不连续表初始化CREATE TABLE `t` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `c` INT(11) DEFAULT NULL, `d` INT(11) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `c` (`c`)) ENGINE=InnoDB;```## 自增值```goINSERT INTO t VALUES (null,1,1);-- AUTO_INCREMEN

2020-07-27 12:38:52 395

原创 MySQL INSERT语句的锁

INSERT…SELECT表初始化CREATE TABLE `t` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `c` INT(11) DEFAULT NULL, `d` INT(11) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `c` (`c`)) ENGINE=InnoDB;INSERT INTO t VALUES (null,1,1);INSERT INTO t VALUES (null

2020-07-22 21:40:45 438

原创 MySQL拷贝表

初始化CREATE DATABASE db1;USE db1;CREATE TABLE t(id INT PRIMARY KEY, a INT, b INT, INDEX(a)) ENGINE=InnoDB;DELIMITER ;;CREATE PROCEDURE idata()BEGIN DECLARE i INT; SET i=1; WHILE (i <= 1000) DO INSERT INTO t VALUES (i,i,i);

2020-07-22 17:36:30 136

原创 nsq TCPServer(一)

TCPServerfunc TCPServer(listener net.Listener, handler TCPHandler, logf lg.AppLogFunc) error { //listener是在nsqd New的时候创建的 logf(lg.INFO, "TCP: listening on %s", listener.Addr()) var wg sync.WaitGroup for { clientConn, err := listener.Accept() if

2020-07-22 12:06:16 190

原创 nsqd New函数

func New(opts *Options) (*NSQD, error) { var err error dataPath := opts.DataPath //从datapath读路径 if opts.DataPath == "" { cwd, _ := os.Getwd()//没有配置默认在当前目录 dataPath = cwd } if opts.Logger == nil { opts.Logger = log.New(os.Stderr, opts.LogPrefix,

2020-07-21 21:40:44 123

原创 nsqd Main函数

源码func (n *NSQD) Main() error { ctx := &context{n} exitCh := make(chan error)//退出chan 无缓存的 var once sync.Once exitFunc := func(err error) {//定义退出函数 once.Do(func() {//once 保证只执行一次 if err != nil { n.logf(LOG_FATAL, "%s", err) } exitC

2020-07-21 20:48:51 136

原创 nsq Message定义

源码const ( MsgIDLength = 16 minValidMsgLength = MsgIDLength + 8 + 2 // Timestamp + Attempts)type MessageID [MsgIDLength]bytetype Message struct { ID MessageID//长度为16的byte数组 Body []byte //消息体 Timestamp int64 //msg生成的时间戳 Attempt

2020-07-21 17:25:52 306

原创 MySQL权限

创建用户CREATE USER 'ua'@'%' IDENTIFIED BY 'pa';用户名+地址才表示一个用户,ua@ip1和ua@ip2代表的是两个不同的用户在磁盘上,往mysql.user表里插入一行,由于没有指定权限,所有表示权限的字段都是N在内存里,往数组acl_users里插入一个acl_user对象,该对象的access字段的值为0mysql> SELECT * FROM mysql.user WHERE user = 'ua'\G;******************

2020-07-21 12:05:59 194

原创 MySQL分区表

表初始化CREATE TABLE `t` ( `ftime` DATETIME NOT NULL, `c` int(11) DEFAULT NULL, KEY (`ftime`)) ENGINE=InnoDB DEFAULT CHARSET=latin1 PARTITION BY RANGE (YEAR(ftime)) (PARTITION p_2017 VALUES LESS THAN (2017) ENGINE = InnoDB, PARTITION p_20

2020-07-20 22:04:27 260

原创 MySQL 自增ID耗尽

显示定义ID表定义的自增值ID达到上限后,在申请下一个ID时,得到的值保持不变-- (2^32-1) = 4,294,967,295-- 建议使用 BIGINT UNSIGNEDCREATE TABLE t (id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY) AUTO_INCREMENT=4294967295;INSERT INTO t VALUES (null);-- AUTO_INCREMENT没有改变mysql> SHOW CREATE TA

2020-07-20 21:01:31 355

原创 MySQL -- 空间回收

InnoDB的物理存储InnoDB表的组成:表结构(frm)+数据(ibd)MySQL 8.0开始,允许将表结构定义(占用空间很小)放在系统数据表中控制参数innodb_file_per_tableON:每个InnoDB表数据存储在一个以.ibd为后缀的文件中,推荐。更容易管理,DROP TABLE会直接删除这个文件OFF:InnoDB表数据存储在共享表空间,DROP TABLE,空间也是不会回收的SHOW VARIABLES LIKE '%innodb_file_per_table%

2020-07-20 10:01:33 484

原创 nsqd启动加载历史数据LoadMetadata

func (n *NSQD) LoadMetadata() error { atomic.StoreInt32(&n.isLoading, 1)//函数开始 原子写入n.isLoading为1 defer atomic.StoreInt32(&n.isLoading, 0)//函数退出时 原子写入 n.isLoading为0 fn := newMetadataFile(n.getOpts())//从n的opt里面拿出data-path 历史数据的文件目录地址 data, err

2020-07-16 21:34:25 367

原创 NSQ简介(一)

NSQ组件nsqd是一个守护进程,负责接收,排队,投递消息给客户端。它可以独立运行,不过通常它是由 nsqlookupd 实例所在集群配置的(它在这能声明 topics 和 channels,以便大家能找到)。它在 2 个 TCP 端口监听,一个给客户端,另一个是 HTTP API。同时,它也能在第三个端口监听 HTTPS。nsqlookupd 是守护进程负责管理拓扑信息。客户端通过查询 nsqlookupd 来发现指定话题(topic)的生产者,并且 nsqd 节点广播话题(topic)和通道(

2020-07-16 21:14:03 2113

原创 mysql幻读

表初始化CREATE TABLE `t` ( `id` INT(11) NOT NULL, `c` INT(11) DEFAULT NULL, `d` INT(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `c` (`c`)) ENGINE=InnoDB;INSERT INTO t VALUES (0,0,0),(5,5,5),(10,10,10),(15,15,15),(20,20,20),(25,25,25);定义与

2020-07-16 18:07:36 130

原创 nsq初始化读取config函数

var cfg config configFile := flagSet.Lookup("config").Value.String()//config的值是toml文件的地址。 if configFile != "" { _, err := toml.DecodeFile(configFile, &cfg)//将toml文件中配置decode成元数据 if err != nil { logFatal("failed to load config file %s - %s", co

2020-07-14 21:01:36 234

原创 nsq命令行参数解析

源码PS:这篇的目的是熟悉nsq的配置参数顺带说一下命令行解析func nsqdFlagSet(opts *nsqd.Options) *flag.FlagSet { flagSet := flag.NewFlagSet("nsqd", flag.ExitOnError)//返回一个带有错误处理的 空的flag set。 // basic options flagSet.Bool("version", false, "print version string")//以下类似的函数都是 nam

2020-07-14 10:01:31 726

原创 nsqd ID基于MD5的实现

nsqd 源码部分hostname, err := os.Hostname()h := md5.New()io.WriteString(h, hostname) defaultID := int64(crc32.ChecksumIEEE(h.Sum(nil)) % 1024)将hostname进行md5 hash后 通过循环冗余校验后对1024取余,表名id在1024以内唯一。ChecksumIEEE(data []byte) uint32go md5的实现md5是属于hash算法,g

2020-07-13 21:24:41 191

原创 redis的适用场景与不适用场景

redis适用啥场景、缓存,毫无疑问这是Redis当今最为人熟知的使用场景。再提升服务器性能方面非常有效;排行榜,如果使用传统的关系型数据库来做这个事儿,非常的麻烦,而利用Redis的SortSet数据结构能够非常方便搞定;计算器/限速器,利用Redis中原子性的自增操作,我们可以统计类似用户点赞数、用户访问数等,这类操作如果用MySQL,频繁的读写会带来相当大的压力;限速器比较典型的使用场景是限制某个用户访问某个API的频率,常用的有抢购时,防止用户疯狂点击带来不必要的压力;好友关系,利用集合的

2020-05-14 18:08:20 3094

原创 redis选择单线程模型笔记

PS:redis在4.0前使用的是单线程模型,redis4.0后 选择性 的使用多线程模型。概述提出2个问题:为什么 Redis 在最初的版本中选择单线程模型?为什么 Redis 在 4.0 之后的版本中加入了多线程的支持?Redis 作为一个内存服务器,它需要处理很多来自外部的网络请求,它使用 I/O 多路复用机制同时监听多个文件描述符的可读和可写状态,一旦受到网络请求就会在内存中快速处理,由于绝大多数的操作都是纯内存的,所以处理的速度会非常地快。在 Redis 4.0 之后的版本,情况就

2020-05-14 17:17:49 117

原创 go-redis库使用笔记

安装go get -u github.com/go-redis/redis连接普通连接func NewClient() (c *redis.Client, err error) { c = redis.NewClient(&redis.Options{ Addr: "localhost:6379", Password: "", DB: 0, }) _, err = c.Ping().Result() if err != nil { retur

2020-05-14 12:10:43 831

原创 https建立连接原理笔记

建立https连接TCP协议–通信双方通过三次握手建立tcp连接TLS(transport layer security)协议–通信双方通过四次握手建立TLS连接HTTP协议–client向server发起request,server发挥responsePS:以下笔记只针对tls1.2TCPtcp三次握手建立连接客户端向服务端发送带有 SYN 的数据段以及客户端开始发送数据段(Segment)的初始序列号 SEQ = 100服务端收到数据段时,向客户端发送带有 SYN 和 ACK 的数

2020-05-13 18:30:39 269

原创 Go编译器原理笔记

阶段前端(frontend):对源码进行分析,生成AST源代码语法结构物。后端(backend):将源代码转换为机器码,并进行优化。1. parsing2. AST transformation3. SSA generation4. machine code generationexample go1.14.0package mainfunc main() { a := 1 b := 2 if true { add(a, b) }}

2020-05-12 11:32:14 330

空空如也

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

TA关注的人

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