自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(66)
  • 资源 (2)
  • 收藏
  • 关注

原创 TCMalloc分析笔记(gperftools-2.4)

TCMalloc是专门对多线并发的内存管理而设计的,TCMalloc主要是在线程级实现了缓存,使得用户在申请内存时大多情况下是无锁内存分配。整个 TCMalloc对小内存(小于等于256k)的管理实现了三级缓存,分别是ThreadCache(线程级缓存),Central Cache(中央缓存:CentralFreeeList),PageHeap(页缓存)。小内存的分配和释放流程如下图所示,红线

2015-04-18 15:15:45 4923 1

原创 MongoDB查询

返回所有的键find()> db.users.find(){ "_id" : ObjectId("5518ae1b1d802f6252d90e7b"), "emails" : [  "[email protected]",  "[email protected]",  "[email protected]",  "[email protected]",  "[email protected]",  "

2015-03-31 19:06:10 766

原创 MongoDB更新操作

插入文档操作db.foo.insert({"bar": "baz"})删除文档操作删除所有的数据:db.foo.remove()删除指定的数据db.foo.remove({"bar": "baz"})更新文档操作

2015-03-31 19:01:59 644

原创 nanomsg pair tcp SERVER端各个模块的状态

下面这个图描述了nanomsg PAIR协议基于TCP传输的SERVER端的连接建立的各个模块的状态变化.

2015-03-24 18:48:10 2342

原创 nanomsg: 协议NN_PAIR, TCP的SERVER端数据结构

下面这个图描述了nanomsg在NN_PAIR协议,基于TCP传输的各个模块之间的数据结构关系

2015-03-24 18:43:12 3281

原创 InnoDB INODE 页结构

1. Inode是用来管理一个段的,简单说,一个Inode就是代表一个数据段.Inode可以说是一个结构体,它也是像上面一样,按顺序存储到Inode页面中,一个Inode页面可以存储多个Inode节点.如果页面中所有的空间都用来存放已经使用的Inode,则这个页面就称为满Inode页面,否则为半满Inode页面.2. 当表空间的FSP_SEG_INODES_FREE中没有空闲的IN

2015-03-23 19:22:28 2124

原创 InnoDB 锁数管理据结构

对于表锁, InnoDB一般只是获取意向锁(意向共享锁LOCK_IS和意向排它锁LOCK_IX),一般不会去获取共享锁(LOCK_S)和排它锁(LOCK_X)。除非明确的执行LOCK TABLE 命令。一个例外是在在线ALTER TABLE命令的准备阶段,一个表将会被共享锁(LOCK_S) 锁住。Lock bitmap用于表示行锁,紧邻lock struct存放,每bit代表页内1行数据,使用he

2015-03-23 18:53:40 677

原创 InnoDB 死锁检测实现

InnoDB的死锁检测是通过等待图(Wait-For-Graph)的算法实现的,即检查所有在一个锁上等待的事务是否已经成环;如果成环了说明已经出现死锁,根据一定的策略将某个事务回退将环切断而解除死锁。   死锁的检测时机是在将事务加入等待队列是检测的(lock_table_enqueue_waiting(表), lock_rec_enqueue_waiting(记录) );死锁

2015-03-23 18:46:42 2228

原创 InnoDB Purge 过程

Purge流程Purge功能:InnoDB由于要支持多版本协议, 因此无论是更新, 删除, 都只是设置记录上的deleted bit标记位, 而不是真正的删除记录. 后续这些记录的真正删除, 是通过Purge后台进程(根据参数srv_n_purge_threads配置, 由下面两个线程中的一个来执行purge: srv_purge_thread(); srv_master_thre

2015-03-23 18:41:28 3585 1

原创 InnoDB 事务管理页的结构, 包括rollback segment和undo log页

1. 每个事务开始时,都会分配一个ROLLBACK SEG给这个事务(即trx_sys_struct->rseg_array[]数组中的一个元素, 这个数组中的元素由链表[trx_sys->rseg_list]来管理,在链表中选择segment是采用ROUND-ROBIN的方式来。即trx_sys_struct->latest_rseg来指示最新被使用的rollback segment) 

2014-09-02 19:28:11 2611

原创 InnoDB double write

InnoDB的double write的作用主要是为了防止部分写失效,即InnoDB默认的页是16k,而磁盘管理的页(即一次写磁盘的大小)一般不是16k,因此InnoDB一次写一个16k页时,操作系统和磁盘要多次写入,这样如果出现异常(断点或OS异常),会导致16k页只能部分写入。因为我们知道在flush buffer cache的时候,其实redo log已经写好了. 为什么还需要担心par

2014-09-02 19:22:49 802

原创 InnoDB Adaptive Hash Index(AHI)

1. InnoDB AHI的作用       InnoDB的适应哈希(AHI)是维护InnoDB叶子页记录的索引键值(或键值前缀)的到叶子节点记录的Hash映射关系。能够根据索引键值(或前缀)定位到记录的地址。这样可以不用再搜索B+树从root到叶子页的路径定位过程。2. InnoDB AHI的维护      为了避免频繁的更新AHI带来性能的开销,InnoDB的AHI不是随时

2014-09-02 19:22:40 1592

原创 InnoDB 页管理结构

1.段段是表空间文件中的主要组织结构,它是物理上的管理物理空间的一个逻辑概念,它是构成索引,表,回滚段的基本元素,创建一个索引(B树)时会同时创建两个段,分别是内节点段和叶子段,内节点段用来管理(存储)B树中非叶子节点(页面)的数据,叶子段用来管理(存储)B树中叶子节点的数据.  一个段由一个INODE节点来管理这个段下面的所有的簇(extend).2.簇

2014-09-02 19:21:16 1404

原创 InnoDB MVCC

MVCC:    multiversion concurrency control, 多版本并发控制,它提供基于某个时间的快照,使得对于事务看来,总是可以提供与事务开始时刻相一致的数据。而不管这个事务执行的时间有多长,故在不同事务看来,同一时刻看到的相同的行数据可能是不一样的,即:每一行数据会有多个版本数据(副本)。InnoDB的实现:InnoDB的MVCC主要是根据u

2014-09-02 19:08:00 740

原创 InnoDB INDEX页物理结构

2014-09-02 19:03:04 635

原创 InnoDB行记录格式(compact)

1. 变长字段长度列表       记录非NULL变长字段的长度列表; 并且安装列的循序的逆序进行放置,一列的长度如果小于255,用一字节表示,如果长度长度大于255,则用两字节表示,一字节还是两字节只对一列来讲,如果一行中既有大于255,也有小于255的,则大于255用两字节,小于255则用一字节。从分析文件的十六进制来看,如果大于255,则高字节的最高位是1.  还需要分析代码是否高位都是

2014-09-02 18:54:48 2411

原创 MyISAM索引文件头部结构(5.1.40)

MyISAM索引文件的头部结构  域长度(byte) MI_STATE_INFOheader24open_count2changed1sortkey1state.records8state.del8state.del8delli

2013-07-12 15:27:49 803

原创 MYSQL配置文件解析

1. 收集默认的目录: 接口 init_default_directories();主要是下面的目录:"/etc/""/etc/mysql/"环境变量中设置的: MYSQL_HOME当前用户的home目录 : "~/"2. 如果命令行参数中有"--no-defaults"选项, 则将"--no-defaults"选项直接从现有的命令行参数中去掉, 然后直接返回,即不

2013-07-12 15:22:47 1368

转载 LINUX 下安装 dropbox

https://www.dropbox.com/install?os=lnxInstall Dropbox via command lineThe Dropbox daemon works fine on all 32-bit and 64-bit Linux servers. To install, run the following command in

2013-07-03 10:38:23 846

原创 Redis主备同步(replication)

Redis主备同步流程图:

2013-05-14 18:11:25 1769

原创 Redis定时器

Redis有很多需要周期性执行的任务: 统计内存使用最高值,记录数据库的使用情况,对哈希表进行resize(如果哈希表的使用率小于10%时,需要对哈希表进行压缩),检查客户端连接是否超时,保存数据库到磁盘,检查key是否过期并删除,主备数据同步删除异步关闭的客户端;运行集群定时任务;运行定时监视任务;. . .       这些周期性任务是由REDIS自己来维护定时器机

2013-05-13 17:45:09 6906

原创 集合(REDIS_SET)

第一个添加到集合的元素, 决定了创建集合时所使用的编码:如果第一个元素可以表示为 long long 类型值(也即是,它是一个整数, 接口isObjectRepresentableAsLongLong), 那么集合的初始编码为 REDIS_ENCODING_INTSET 。否则,集合的初始编码为 REDIS_ENCODING_HT如果一个集合使用 REDIS_ENC

2013-05-10 19:16:38 1019

原创 队列(REDIS_LIST)

命令: lpush mylist "world"创建新队列时 Redis 默认使用 REDIS_ENCODING_ZIPLIST 编码, 当以下任意一个条件被满足时, 队列会被转换成 REDIS_ENCODING_LINKEDLIST编码:试图往队列新添加一个字符串值,且这个字符串的长度超过 server.list_max_ziplist_value(默认值

2013-05-09 19:34:09 956

原创 有序集合(REDIS_ZSET)

命令command       key            score      valuezadd               myzset       1            "one"key是作为db最上层字典索引的key;保存到底层的是score和value1.  如果第一个元素符合以下条件的话, 就创建一个 REDIS_ENCODING_Z

2013-05-09 19:19:12 2580

原创 哈希表(REDIS_HASH)

哈希表(REDIS_HASH)默认是用ziplist(REDIS_ENCODING_ZIPLIST)对象(redisObject)来保存数据的,只有key或value的长度超过server.hash_max_ziplist_value(默认64);或者ziplist存储的对象(entry)超过了server.hash_max_ziplist_entries(默认512)时,就对这个ziplist对

2013-05-09 19:13:24 1958

原创 redisDB内存结构

这里只将redesDB的整体结构图画出,后续详细分析各种底层的实现

2013-05-08 19:33:55 1035

原创 REDIS跳表(skiplist)

一个跳表,应该具有以下特征:一个跳表应该有几个层(level)组成;跳表的第一层包含所有的元素;每一层都是一个有序的链表;如果元素x出现在第i层,则所有比i小的层都包含x;跳表的插入过程如下; 蓝色线表示查找插入位置的过程,红色的都要记录在一个update[]数组中(反序的方式来记录,即从最高的level开始),即level变化时就需要记录下来,主要是为了后续插入后

2013-05-07 19:12:36 1746

原创 REDIS字典(dict)

REDIS用字典来实现键值的空间, 底层是由动态哈希来实现; 字典的结构如下面的图 在字典中有两个哈希桶来实现哈希的扩展; 在没有对哈希进行扩张和rehash的情况下, 只有ht[0]来保存数据库的键值; 在对哈希表进行扩展和rehash时,首先会将哈希桶扩大2倍,挂到ht[1]的哈希桶下面,并将rehashidx置为0(表示开始从哈希桶的第一个桶开始进行rehash),然后逐渐将ht

2013-05-07 09:18:03 914

原创 双向链表(REDIS)

REDIS的双向链表和一般的双向链表差不多,一个链表有一个链表头(list)来管理一个链表(listNode)。只是在链表头中增加了几个操作函数。链表头:typedef struct list {    // 表头指针    listNode *head;    // 表尾指针    listNode *tail;    // 节点数量    unsig

2013-05-07 09:08:39 994

原创 动态字符串(REDIS)

// sdshdr 结构struct sdshdr {    // buf 已占用长度    int len;    // buf 剩余可用长度    int free;    // 实际保存字符串数据的地方,会分配多一个字节用于存放'\0';    char buf[];};REDIS的字符串一般保存在以sdshdr为头的结

2013-05-06 18:09:23 772

原创 TCP发包客户端,可用于性能测试

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /*由于微秒定时器在计算机上精度是不准确的, 发送数据包

2013-04-25 19:41:26 2676

原创 多线程网络处理服务器demo

#include #include #include #include #include #include #include #include #include #include //#include //#include #include #include #include #include #include #include //#define DEBUG

2013-04-25 19:37:17 1123

原创 一个基于线程池的网络处理服务器demo

#include #include #include #include #include #include #include #include #include #include //#include //#include #include #include #include #include #include #include //#define DEBUG

2013-04-25 19:29:30 1104

原创 B树的实现

#include #include #define MIN_DEGREE (3)#define MAX_KEY (2*MIN_DEGREE -1 )#define true 1#define false 0#define NO_KEY 0typedef int bool;//B树节点结构typedef struct BTreeNode{//当前存储的数据个数

2013-04-25 19:23:53 741

原创 NGINX模块的功能

未完待续:有几个阶段是特例,它不调用挂载地任何的handler,也就是你就不用挂载到这几个阶段了NGX_HTTP_FIND_CONFIG_PHASENGX_HTTP_POST_ACCESS_PHASENGX_HTTP_POST_REWRITE_PHASENGX_HTTP_TRY_FILES_PHASE只有下面这几个phase会有多个handler,剩余的都是

2013-04-23 10:12:44 769

原创 LVS DR模式配置

arp_ignore:定义对目标地址为本地IP的ARP询问不同的应答模式0 0 - (默认值): 回应任何网络接口上对任何本地IP地址的arp查询请求 1 - 只回答目标IP地址是来访网络接口本地地址的ARP查询请求 2 -只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内 3 - 不回应该网络界面的arp请求,而只对

2013-04-23 09:59:58 1021

原创 berkeleydb 1.86 页面结构

typedef struct _page {//用于记录内存页的信息,位于页面的开头部分,含有 7 个成员变量 pgno_t pgno; /* this page's page number 页面编号*/ pgno_t prevpg; /* left sibling 左兄弟*/ pgno_t nextpg; /* right sibling 右兄弟*/#define P_BI

2013-04-12 18:19:12 779

原创 广度优先搜索

从某源顶点触发,将源顶点置为GRAY,将源顶点入队列,第一个顶点出队列,反问这个顶点的所有相邻顶点,如果相邻顶点是WHITE,则入队列,并置为GRAY,将本顶点置为BLACK. 取出队列的第一个顶点,继续上述步骤:#include #include #include "AdjacencyListGraph.h"#include "Array_queue.h"#defin

2013-04-11 19:17:08 583

原创 最小二项堆

最小二项堆:1. 节点的关键字(key)大于或等于父节点的关键字.2. degree表示子女的个数3. slibing指向紧右的兄弟结点,最右节点的slibing为NIL.4. 二项堆的根节点组织成一个链表(有slibing连接): 根表5. parent指向父节点,根节点的parent为NIL6.child指向左边第一个子节点7. head指向度数(d

2013-04-10 18:39:32 1141

原创 NGINX避免惊群和负载均衡

NGINX避免epoll_wait出现惊群比较简单,就是NGINX自己维护一个互斥变量ngx_accept_mutex; 每次需要从端口接收数据前都要尝试取获取(ngx_trylock_accept_mutex)这个互斥量;如果获得了就将本进程的监听句柄增加到epoll_wait等待队列中;这样就保证了每次都只有一个经常处于监听事件等待队列中,如果有新的连接进来也操作系统也只会唤醒一个进程取处理.

2013-04-06 16:06:05 819

SQL必知必会(第4版)高清完整.pdf版下载

SQL必知必会 第4版 PDF版, 文字版, 带目录。

2015-01-14

DFT 用正交矩阵形式实现

DFT 用正交矩阵形式实现; 一篇关于DFT实现的很好的文档。

2012-01-08

空空如也

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

TA关注的人

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