- 博客(24)
- 资源 (1)
- 收藏
- 关注
原创 redis beforesleep
本来想把redis main函数附带都读完再写笔记,但实在太大了,所以现在决定一部分一部分地记录。eventloop中在每次进入循环时都会调用beforeSleep回调(因为processevents通常都会挂起一定时间等待事件发生),redis的beforeSleep做什么工作呢,看看下面:void beforeSleep(struct aeEventLoop* eventLoop) {
2013-06-24 23:06:32 2474 1
原创 用python -i写交互式shell
cabinet是公司的一个数据存储服务,需要添加一个shell client,查看数据,做简单操作。用python写了一个比想象的简单。代码如下:#! /usr/bin/python -i# coding: utf-8import sysimport osdirname = os.path.dirname(sys.argv[0])sys.path.append(dirna
2013-06-24 14:27:09 3603
原创 redis aof
aof是append only file,它的好处是增量的,每个操作可以马上写到文件中,不好的地方是里面的记录都是命令,所以不太紧凑。基本上aof.c和rdb.c接口差不多,都有load,还有Rewrite, RewriteBackground。load过程(loadAppendOnlyFile): loading的主要思路是fake出一个新的client(这个client的replsta
2013-06-23 18:40:19 1732
原创 redis pubsub.c
channel是一个精确的名字,pattern则是glob匹配(通配符匹配)。这个文件主要包含了以下接口:int listMatchPubsubPattern(void *a, void *b) ; // a和b指向pubsubPattern结构:/* typedef struct pubsubPattern { redisClient* client; r
2013-06-23 11:46:21 1533
原创 Redis bio
还是一个很小的模块。bio就是background io的意思,既然要background,就要创建线程,创建几个线程呢?有几种类型的io,就创建几个线程。同一种类型的job需要排队,所以存放各自的工作链表里面。redis目前有两种类型的job:一个是close file descriptor,另一个是aof sync。线程的堆栈默认设为4M,每个线程运行开始时还要把SIG_ALR
2013-06-22 21:26:22 2066
原创 Redis slowlog
和mongo的slowlog一样,redis中对于操作时间较长(默认为10秒)的命令也会记录下来,不过它将它们保存在redisServer结构中的slowlog这个链表中,新进来的log排在链表头部,这个链表的长度可以配置,超过长度(默认为128)则将链表尾部元素踢掉。链表中的元素是slowlogEntry:// This structure defines an entry inside
2013-06-22 18:05:15 2798
原创 _exit和exit的区别
redis源码中看到rdbbgSave时fork的子进程完成工作后调用_exit而不是exit。搜了一下,是这么说的:为何在一个fork的子进程分支中使用_exit函数而不使用exit函数?‘exit()’与‘_exit()’有不少区别在使用‘fork()’,特别是‘vfork()’时变得很突出。‘exit()’与‘_exit()’的基本区别在于前一个调用实施与调用库里用户状态结构(use
2013-06-22 12:38:01 1019
原创 redis rdb
这是比较大的一块。顾名思义,就是rdb的常用接口了。接口如下:// rdb没有little endian和big endian的区别(除了最后的checksum),所以rdb文件在不同系统中可能不能移植// type只占一个字节int rdbSaveType(rio* rdb, unsigned char type);int rdbLoadType(rio* rdb);
2013-06-21 23:53:15 4608
原创 Redis util
主要是字符串通配符匹配和数字与字符串互转的几个函数。// 通配符模式匹配int stringmatchlen(const char* p, int plen, const char* s, int slen, int nocase);int stringmatch(const char* p, const char* s, int nocase);// 字节数(如"-1G"
2013-06-20 22:46:22 2281
原创 Redis intset
Redis intset也非常简单。它是一个有序整数集合,实际上是一个有序数组,查找时二分查找,添加时可能需要内存挪动。唯一不同的是,它的整数类型是变动的,可以支持int16,int32,int64三种,当然用越小的单位越省内存。只有当当前的整数类型存不下更大的整数时,才让整数类型变大。看结构就了解了:typedef struct intset { uint32_t encoding
2013-06-20 21:14:20 1983
原创 尝试了GnuPlot
以前看过gperftool里面用gnuplot绘图,心痒痒的。今天导数据的时候尝试了一下,感觉不错。参考:http://stackoverflow.com/questions/10921043/how-to-use-gnuplot-to-plot-a-time-series-chart-from-a-csv-file-date-and-time-sto
2013-06-20 19:21:16 1012
原创 redis ziplist
ziplist中的代码多一些,其实不用倒不用仔细看代码,因为这是一种紧密编码格式的双向链表。我们了解下它的编码方式和接口就可以了。关于它的编码方式,ziplist.c开头的注释很详细。ziplist是一种内存高效的特殊编码的双向链表,它可以保存字符串和整数。在两边做push和pop操作都只要O(1)时间(注:这种说法把realloc和memcpy都当作O(1)了)。但是每个操作都要rela
2013-06-19 22:49:38 2123
原创 Redis anet
anet.c -- Basic TCP socket stuff made a bit less boring.这里接口很简洁,值得复用!// 返回socketint anetTcpConnect(char* err, char* addr, int port);int anetTcpNonBlockConnect(char* err, char* addr, int port);
2013-06-19 21:24:18 1411
原创 Redis adlist
adlist是redis的双向链表,比较简单,一目了然。结构如下:typedef struct listNode { struct listNode *prev; struct listNode *next; void *value;} listNode;typedef struct listIter { listNode *next
2013-06-19 21:06:11 1454
原创 Redis dict
今天看了redis dict部分的源码(dict.h,dict.c),跟大家分享一下。这两个文件包含了redis的hashtable的接口和实现。Redis中hashtable的主要特点是增量rehash,rehash毕竟是一个耗时的操作,redis把它分摊到hashtable的各个小操作中,从而让字典操作性能曲线比较平滑。既然要增量rehash,就要在一个dict中保留两个hasht
2013-06-16 20:58:41 2117
原创 Redis AE模块
读的源码是2.6.9。AE模块是一个简单的事件驱动库,是作者为tcl解释器写的事件循环加以修改便于复用的C库。支持io事件和定时器,看看其中用到的结构吧:/* State of an event based program */typedef struct aeEventLoop { int maxfd; // 当前注册的fd最大值,初始值是-1 int s
2013-06-16 12:31:21 2762
原创 Redis ae_epoll.c
redis中ae是一个event loop的模块,其中使用到的事件轮询,按照系统的不同,使用的是select,epoll,kqueue等对应ae_select.c,ae_epoll.c,ae_kqueue.c,ae_evport.c,这些.c文件提供相同的接口。以ae_epoll.c为例:// aeEventLoop结构中apidata就是这个类型.typedef struct a
2013-06-16 11:05:52 2500
原创 Redis rio
Redis rio的代码很少,基本上包了一个虚基类:struct _rio { void (*update_cksum)(struct _rio *, const void *buf, size_t len); /* The current checksum */ uint64_t cksum; /* Backend-specific vars.
2013-06-15 20:28:50 1944
原创 VIM技巧拾遗
一行超过80高亮显示:highlight OverLength ctermbg=red ctermfg=white guibg=#525229match OverLength /\%81v.\+/切换目录至当前编辑文件所在目录:cd %:p:h再切回去:cd -
2013-06-15 19:45:50 933
原创 Redis的sds
Redis 源码中的sds,是一个动态字符串库(A dynamic string library).结构如下:struct sdshdr { int len; int free; char buf[];};len是字符串长度,free是缓存区中的剩余大小,其中的内存分配当然用zmalloc。typedef char* sds; sds类型的指针退sizeof
2013-06-15 18:45:20 2237
原创 Redis中的zmalloc
Redis中zmalloc对内存分配函数进行封装,允许按配置使用tcmalloc,jemalloc等快速、内存使用率高的库,并支持统计内存使用率。tcmalloc是google perftool的一部分,与一般的内存池不同,它直接与os打交道,内存闲置时os会进行回收(stl内存池就不回收),同时使用TLS(Thread local storage)管理内存池,避免一个线程内分配内存都要同步。
2013-06-15 12:29:29 4293 1
原创 nfs的使用
server端共享在/etc/export中写入。client端mount:mkdir mount_testmount -t nfs -o rw 192.168.1.12:/home mount_testumount mount_test如果umount时提示设备忙,使用fuser -m -v mount_test/查看占用的进程。要开机自动挂载,修改/etc/fstab,
2013-06-15 11:12:40 830
原创 ldap命令初试
ldap是企业基础设施,我对其配置一直很感兴趣。今天读了一篇网上的“陈云川的OPENLDAP系列",对其有了基本的认识,结合公司的ldap,尝试了一下:ldapsearch -h 192.168.1.10 -D "uid=enlaizhou,ou=People,dc=example,dc=com" -W -b "ou=People,dc=example,dc=com"ldapmodif
2013-06-06 23:21:29 1872
原创 nginx中对指定的IP不使用密码对区域外IP使用密码访问
## example admin siteserver { server_name $HOSTNAME.dashboard.example.com; listen 80; # http://serverfault.com/questions/242218/how-to-disable-http-basic-auth-in-nginx-for-a-s
2013-06-01 17:41:50 1653
Scons User Guide 2.01
2011-05-11
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人