自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

sryan的专栏

点点滴滴

  • 博客(78)
  • 资源 (3)
  • 收藏
  • 关注

原创 [INNODB] ibd文件之结构组成与空间分配

ibd是一个完整的表空间文件,其中最基本的单位为页(Page),一个Page通常为16k。page有不同的种类,用于不同类型的用途。在介绍页文件的分类前,我们先介绍对页进行分类管理的2个页组。extendextend,也叫作区,用于分配页。一个extend有64个连续的页,也就是1MB。当表空间页不足了要分配新页的时候,不会一页一页的分配,而是直接分配一个extend。se...

2018-05-11 11:16:37 2589

原创 [INNODB]ibd文件之索引页页目录(Directory slot)

B+树的具体体现在于非叶子节点,用于标识范围并指向叶子节点页,也就是说,通过某个索引,我们无法获得具体的行位置,只能获得行所在的叶子页。所以非叶节点就是B+树的非叶子页,用于范围索引,而叶子页就是B+树的叶子页,用于存储数据。我们在定位到了叶子页后,我们还需要检索叶子页的数据,这个检索需要由页目录来进行二分查找来找到具体的行数据。同时由于非叶节点页也有页目录,我们也可以通过页目录来快速的定位到...

2018-05-11 11:15:45 1717

原创 [INNODB] ibd文件之通过B+树索引和页目录查找行数据

### 准备工作首先,为了说明方便,本文使用了[innoisp](https://github.com/sryanyuan/innoisp) 来解析ibd文件来获取各个page的信息。ibd文件为innodb的存储文件,存储着各种数据,比如行数据、undolog、insert buffer等。在任意情况下,会存在系统ibd文件,所有的库表数据都会在其中。用户也可以选择将表给分离开来,使用一个表一个...

2018-05-11 11:13:31 1213

原创 MySQL与MariaDB基于GTID的主从同步

MySQL与MariaDB基于GTID的主从同步最近在做数据库同步,主要业务场景是同步目前中间件分库分表的库表至单库单表中做OLAP。前期的同步是基于binlog filename和pos的,前几天DBA告知了一个可能的风险,仔细想想也的确是的,假如主节点挂了,从节点提升为主,那么其实主从的binlog pos是不一致的,那么继续注册上从同步肯定会有问题,再加之目前db使用的是vip,切换可能无感知

2017-04-20 17:27:04 2957

原创 Raft一致性算法

Raft一致性算法今天和明天都得值班,基本主要是看监控,趁着空闲时候大概看了会raft算法,以前比较粗略的了解了一下,今天仔细的学习了会,在这里做个笔记吧。在分布式系统中,一致性是个很棘手的问题,单节点没有这个问题,但是为了保证高可用,往往会多机房部署,这样每个服务的一致性就必须得保证,raft一致性算法就是为了解决这个问题。在Raft中,每个服务都有三个角色:FollowerCandidate

2017-01-27 15:37:17 564

原创 TCP头部的ACK与SEQ

TCP头部的ACK与SEQ这几天临近过年了,很多人都回去了,趁着闲着,把TCP/IP协议详解大概过了一过,有些以前似懂非懂的,现在貌似还是似懂非懂,不过至少比以前理解的好一点儿了,不过对于TCP的发包与回应之间的确认序号有点儿搞懵了,于是大概看了下,顺便在这里做了个笔记。之前的工作大概都属于上层工作吧,至少在协议之上,各种操作系统的IO模型,倒是底层没怎么去看,只知道大概的三次握手啊之类的,还是得对

2017-01-23 12:00:17 4015

原创 C++11中的右值引用

C++11中的右值引用C++11中新的标准比较多,牵扯到的概念也比较多,有些一开始听上去好玄乎,但是了解了它的产生是有道理的后就能比较好的理解了。首先,右值引用这个概念感觉很难理解,它和引用有啥关系呢?其实和引用一样,只是有点儿差异:右值引用它是引用了一个临时变量的(大部分情况下),当然你也可以把某个对象变成右值引用。右值引用是为了解决深拷贝带来的消耗问题的。大家都知道,一个对象拷贝给另一个对象的时

2016-12-23 17:37:54 710

原创 c遍历lua中table的方法

c遍历lua中table的方法遍历一个table,肯定是不知道table的每个key的,所以lua_getfield肯定是不可行的。要遍历table,最主要的是lua_next函数,该函数主要接受一个int参数,代表当前table所在的索引,索引之上应该需要一个key,每次lua_next都会从当前的key遍历下一个key,于是我们想要得到第一个key,则只需要压入一个nil就行了。当lua_nex

2016-12-22 17:52:52 2602

原创 简析DNS解析过程

简析DNS解析过程以前对于DNS的流程,以前也只停留在域名->IP的简单理解上,今天想看下cdn的原理,于是发现DNS貌似没那么简单,于是在网上收集了点资料,自己做了点理解,顺便做个简单的笔记。首先,以gocode.cc做个例子,这个是我另外一个博客,从最开始来梳理下解析到IP地址的过程,当然,HOST文件、DNS缓存什么都不考虑,只考虑从头至尾的大概流程。1.一般是请求ISP的DNS服务器,DNS

2016-11-10 17:52:58 620

原创 简析令人头大的定义 void (*(*f[])())()

简析令人头大的定义 void (*(*f[])())()解析在v2ex闲逛发现有人在谈怎么学习c语言,有人推荐tcpl,然后写了个反人类的变量定义 void (*(*f[])())(),这么复杂的定义在c++实际的项目中其实也不常见,反正我喜欢研究下到底是什么,就花了点时间去看看这个定义,其实复杂的变量定义在csdn有一个人详细的解读过,不过凭着三脚猫的功底,我还是按着自己的理解去解读下吧。首先提取

2016-10-31 14:34:48 3390

原创 VSCODE golang环境配置

VSCODE golang环境配置准备安装好vscode后,安装golang插件,可以使用ctrl+shift+p或者f1呼出命令面板,输入extensions,输入关键词Go然后安装然后将一个文件夹拉入VSCODE中,然后通过文件->首选项->工作区设置来做工作区设置的任务。我们在工作区的配置文件settings.json中,需要设置的是go.gopath{ "go.gopath":

2016-10-18 10:42:28 7456

原创 对libevent中bufferevent的深入理解

对libevent中bufferevent的深入理解在libevent 2.x.x中,新增了bufferevent来封装了socket操作,用来简化编码操作。当前项目有个点实在是有点儿绕,我自己在libevent基础上做了一个网络引擎的wrapper,未来打算替换,在实现的过程中,发现了一些问题,于是这些日子在空闲的时候阅读了下libevent的实现以及从前没有接触过的epoll模型,心里也算是有点

2016-10-13 17:38:08 8595 8

原创 网络编程中的阻塞,非阻塞、同步,异步概念

网络编程中的阻塞,非阻塞、同步,异步概念网络编程中,我们常常接触阻塞,非阻塞,同步,异步等概念,有些概念可能交叉使用,比如异步非阻塞,同步非阻塞,同步阻塞等等,这些概念看似相似,却往往又有着不同的概念,也往往很绕。刚刚查了点资料总结了一下,通过结合具体的网络模型来给这些概念做个笔记。阻塞阻塞是最容易理解的,对应于各种阻塞的api,recv send等等都是阻塞的API,这些API的特性就是在内核的数

2016-10-11 16:20:15 3135

原创 使用redis写一个简单的分布式锁

对于一个进程来说,内部的资源锁有很多的实现方式,也都很高效,对于同一个机器的不同进程做同步的话,也有很多的方式去实现,对于不同机器上部署的程序来说,假如要进行同步,则比较麻烦。最简单的方式可能就是使用redis了,redis的实现是所有的操作放入单线程中处理的,所以对于并发的请求,都有先后顺序,那么对于实现分布式锁来说有着得天独到的优势。其实所谓的分布式锁,就是在某个共享节点上做一个资源的标记,当标

2016-09-22 15:56:27 1338

原创 使用nsqlookupd来推送消息

使用nsqlookupd来推送消息其实有点儿文不对题,不是使用nsqlookupd来推送的,最终还是使用nsqd来进行推送。nsq的golang客户端中,consumer实现了从nsqlookupd中动态拉取服务列表,并进行消费,但是producer中没有实现这个,假设有N个nsqd节点,某一个不可用了,那么不就完蛋了?于是今天自己封装了一个producer,用来实现从nsqlookupd中拉取ns

2016-09-08 17:56:35 3045

原创 Golang中的覆盖率测试

Golang中的覆盖率测试golang中提供了不少工具链,可以使用它们方便的进行单元测试、分析性能瓶颈,提供运行时信息等,总而言之是非常有用的。go test这个工具大家用的应该比较多,之前我使用也大多是用来做单元测试的,go中做单元测试非常的方便,然而我忽视了覆盖率测试。单元测试覆盖了多少代码呢?golang的go test工具其实还支持显示覆盖率,最简单的用法就是执行go test -c -co

2016-09-02 15:50:07 6376

原创 A星寻路算法

A星寻路算法这几天实现了一个A*寻路算法,其实在刚毕业的时候就写了一个,算法不复杂,就是效率有点儿低,这些天趁着空闲时间,重新实现了一遍。算法其实也不复杂,首先有以下几个概念:开启的节点表(OpenTable)存放着所有的待检测的节点(坐标),每次都会从其中寻找出符合某个条件的坐标。关闭的节点表(ClosedTable)存放着所有不会被检测的节点(坐标),每次检测都会忽略它们。首先,我们定义了

2016-09-01 15:30:29 3329

原创 内存管理之分页

内存管理之分页昨晚读《go语言学习笔记》的时候,看到了内存管理这一章,提到了内存的分页。其实分段与分页在微机接口这课程也学过,只是一直在弄上层的东西,有点儿生疏了,今天有空查了点资料,做了点笔记。虚拟地址与物理地址首先假定平台为32位平台。首先从应用层谈起,在应用层,我们有一个4G的完整的内存空间,我们可以通过对变量的寻址来读写某个变量,对于应用这一层来说,底层的内存管理的确是不可见的,而且对于应用

2016-08-30 13:29:50 950

原创 golang 模板(template)的常用基本语法

golang 模板(template)的常用基本语法模板在写动态页面的网站的时候,我们常常将不变的部分提出成为模板,可变部分通过后端程序的渲染来生成动态网页,golang提供了html/template包来支持模板渲染。这篇文章不讨论golang后端的模板读取及渲染方法,只讨论模板中嵌入变量,渲染变量、循环等一些基本用法。变量在golang渲染template的时候,可以接受一个interface{

2016-08-29 16:01:47 63319

原创 NSQ的golang客户端简单使用

NSQ的golang客户端简单使用NSQ 是由国外的一个短链服务商bitly使用golang开发的一个消息队列系统,正好使用到了这个东西,在这里简单的记录下。获取客户端nsq的golang客户端是官方版本的go get github.com/nsqio/go-nsq即可简单的消费者和生产者使用该客户端有原始的command函数用于一些基础操作,也有consumer和producer的封装,我这里是

2016-08-29 11:19:52 8477

原创 将Go函数导入Lua中供lua调用

有一个需求,就是使用go语言来实现一些基本模块,使用lua来实现基本逻辑,于是就有了在lua中调用go函数的需求。go的资料非常少,好在go可以嵌入c语言,使得这个实现变得有可行性。最终使用了lua中的full userdata来实现这个东西。将go中的函数全部封装成userdata,供lua调用。这样是可行的,由于userdata可以设置metatable,metatable内可以设置一个原方法_

2016-08-19 15:22:25 2669 2

原创 socket accept后的fd是否占用新端口

今天小组讨论了下自动化部署的架构与实现。在讨论推送配置的时候,我发现了一个问题,这也让我知道了我以前一直忽略的一个东西。很多人socket编程很熟悉,但是能知道下面细节的人就不是那么多了。以前就想读tcp ip协议详解,可惜那时候的功力还没到,看来等有时间还是得细细品读。大家都很熟悉,在server端编程,首先得创建一个socket并bind一个地址,然后进行listen和

2016-07-21 20:24:13 5871 1

原创 golang x/net/context包笔记

golang x/net/context包笔记基本是 https://blog.golang.org/context 的笔记,能翻墙的话,还是建议大家看看简介以前一直见到这个包,感觉很神秘,而context的意思让人觉得不知道它到底是干什么的。context包主要用于request请求。request请求中,我们可能需要开启不同的routine来获取数据,比如从database获取数据。所以我们可能

2016-07-20 15:49:28 5720

原创 用Go写一个简单的TCP server or client 模型

对Conn封装的基本思路go内置了net包已经很好的封装了socket通讯。然而在实际使用中,由于net/Conn的Read/Write方法是堵塞的原因,必须将其放入单独的goroutine中进行处理。我们先简单的整理下思路,对于连接(Conn)的处理,我们可以开启2条goroutine进行处理,一条用于堵塞的Read的处理,另一条进行Write的处理。这里必须指出,其实Write本身就是线程安全的

2016-07-14 16:52:35 9858

原创 Git使用小结

在刚工作的时候,肯定要接触到版本控制系统,版本控制系统对于大型项目的开发还是很重要的。毕业工作后,第一个接触的版本控制系统就是svn,这个使用也的确简单,不过用的是图形化的软件,只是点点什么的,使用起来很方便。由于svn的限制,不能本地离线的commit。后来移动项目逐步迁移到了git上,那时候接触git。从svn转到git还是非常不适应的,变化很大,而且感觉git很不好用,那时候的想法是比svn差

2016-07-14 16:48:44 428

原创 golang的sql.DB的一些注意事项及读写锁的总结

最近在写一个用于存储protobuf配置的配置管理服务,业务逻辑不难,2天就搞定,但是后续bug不少,也踩了很多坑,在这里记录下。首先,一直以为golang内的sql模块是单链接的,所以一开始在每个goroutine内都open了一个DB,并写了一个连接池进行管理。后续发现是多此一举,白白写了好多代码。golang的sql模块自带连接池功能,在执行sql语句的时候才会分配连接,执行完毕

2016-07-14 16:42:38 7274

原创 多线程情况下慎用localtime_r

最近有个需求,需要提升日志模块的性能。当前日志模块每秒钟处理的日志数量大概在55w左右,于是进行优化,在日志的IO线程中将sprintf剥离,提前将时间、日志等级等格式化处理。于是这样就产生了一个问题,在IO线程中频繁的使用localtime_r来获取日期时间,在单线程中性能影响可能不大,然而我将localtime_r移动到各工作线程后,首先在windows下性能还是有55%左右的提升的,大概

2016-04-26 11:56:52 10514 2

原创 Sourcetree使用ssh后出现 The server's host key is not cached in the registry问题的解决办法

下载一个plink,执行对应的plink host,host为git的域名路径,然后点y再pull一下就不会出现这个问题了

2016-02-22 16:14:46 11371

原创 换一种思路实现c调用lua函数

一直想解决这个问题,最近闲了点儿,就顺便完成了这个小模块。最简单的c回调lua函数大家可能都比较熟悉了,对于调用lua中的全局函数,一个lua_getglobal和lua_call就行了,但是这需要宿主程序内写死lua中的函数名,耦合性太强,我正是因为以前实现的事件通知方式有问题才想换一种方法实现的。后来,我又用了另外一种方式,即函数名注册方式,lua中写了一个函数,并将这个函数名注册给宿

2015-12-03 17:29:29 750

原创 让golang的cron库支持带事件参数的回调

一直在寻觅c/c++下的cron库,可惜一直没找到。目前对我来说,cron可以做定时的某活动,比如晚上八点怎么怎么的,golang下有大神提供的cron库,那么这部分的实现还是放到go实现的服务器下面吧,然后再通知别的服务器,只能绕路子了。go下的cron库使用的是 github.com/robfig/cron,最终使用的是 github.com/jakecoffman/cron,后者

2015-12-01 14:46:32 5852

原创 c++计算网络延迟毫秒数

注:核心内容使用了http://www.cnblogs.com/goagent/p/4078940.html的实现,我只是做了下小封装开一个线程专门来刷ip的延时,可以使用在类似于联机大厅计算到各IP的延迟。有一个需求需要计算N个ip的延迟,所以才知道了有ICMP这个东西,学习了。简易的线程封装,支持基于message的同步#ifndef _INC_THREAD

2015-10-08 16:19:47 8308 3

转载 C++实现Ping

转载于 http://www.cnblogs.com/goagent/p/4078940.html这是一个老话题了,但是我刚学会... 我们的目的是实现这么个东西:之所以用红框框一下是因为,从baidu.com到123.125.114.144的过程是DNS解析,我们暂时先实现ping的部分。 基础知识ping的

2015-10-08 10:58:16 1935

转载 在Go语言里检测内存泄漏

转载于:在Go语言里检测内存泄漏 | DLCoder.com http://dlcoder.com/archives/5648在影响软件系统稳定性的因素里,我们最担心的一个问题是内存泄漏,随着系统的运行,系统消耗的内存越来越多,直到最后整个操作系统越来越慢,甚至还会导致系统崩溃。在Go语言里,我们检测内存泄漏主要依靠的是go里面的pprof包,除此之外,我们还可以使用浏览器来查

2015-07-18 11:19:50 8718

转载 Sublime Text 2支持GB2312和GBK,解决中文显示乱码问题

Sublime Text 2是一个非常不错的源代码及文本编辑器,但是不支持GB2312和GBK编码在很多情况下会非常麻烦。不过Sublime Package Control所以供的插件可以让Sublime Text 2几乎完美地支持CJK编码的文本。安装Sublime Package Control非常简单,在Sublime Text 2上用Ctrl+~打开控制台并在里面输入以

2015-06-18 15:53:24 458

转载 golang: 常用数据类型底层结构分析

转自 http://www.cnblogs.com/moodlxs/p/4133121.html虽然golang是用C实现的,并且被称为下一代的C语言,但是golang跟C的差别还是很大的。它定义了一套很丰富的数据类型及数据结构,这些类型和结构或者是直接映射为C的数据类型,或者是用C struct来实现。了解golang的数据类型和数据结构的底层实现,将有助于我们更好的理解go

2015-06-16 10:15:45 2828

原创 常用排序算法笔记之冒泡排序、快速排序

写个笔记。冒泡算法不多说,很简单,基本思路就是不断的把最大的数送往最大数该有的位置,然后把第二大数送往第二大应有的位置。简单粗糙的实现代码:void SortArray(int* _pArray, int _nArraySize){ for(int i = 0; i < _nArraySize - 1; ++i) { for(int j = 0; j < _nArraySize

2015-04-03 11:30:48 634

转载 Redis学习手册(Key操作命令)

from http://www.cnblogs.com/stephen-liu74/archive/2012/03/26/2356951.html一、概述:      在该系列的前几篇博客中,主要讲述的是与Redis数据类型相关的命令,如String、List、Set、Hashes和Sorted-Set。这些命令都具有一个共同点,即所有的操作都是针对与Key关联的Val

2015-01-08 15:17:47 460

转载 hiRedis Synchronous API

github: https://github.com/redis/hiredisfrom: http://blog.csdn.net/pla1988/article/details/8510721hiRedis操作同步API的接口函数只需下面三个即可:redisContext*redisConnect(const char *ip, int

2015-01-07 17:28:24 632

转载 在Windows上以服务方式运行 MSOPenTech/Redis

原文:http://www.cnblogs.com/shanyou/archive/2013/01/17/redis-on-windows.htmlServiceStack.Redis 使用教程里提到Redis最好还是部署到Linux下去,Windows只是用来做开发环境,现在这个命题发生改变了,在Windows上也可以部署生产环境的Redis,这都要感谢微软的开放,把Redi

2015-01-07 14:02:19 1690

原创 将Go函数导入Lua中供lua调用

有一个需求,就是使用go语言来实现一些基本模块,使用lua来实现基本逻辑,于是就有了在lua中调用go函数的需求。go的资料非常少,好在go可以嵌入c语言,使得这个实现变得有可行性。最终使用了lua中的full userdata来实现这个东西。将go中的函数全部封装成userdata,供lua调用。这样是可行的,由于userdata可以设置metatable,metatable内可以设置一

2014-12-03 16:59:22 6584

HGE 扫雷游戏

用HGE写的一款扫雷游戏,分离游戏逻辑和界面

2012-03-25

ryscreen源码

用qt写的截图工具,仿qq,可用性还不错的

2011-07-08

QT写的简陋记事本 qt写的记事本

qt写的记事本 只完成了 打开 保存 另存为 查找 替换

2011-06-11

空空如也

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

TA关注的人

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