自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

jollyjumper的专栏

一点记录

  • 博客(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

Scons号称下一代自动编译工具,相比于make,它的生成脚本使用Python而不像makefile那样新创造一种语言。我认为它是autoconfig,makefile的很好替代。

2011-05-11

空空如也

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

TA关注的人

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