Redis 深入分析 之 服务器篇

介绍  
目前许多NoSql的数据库开始踊跃出现,作为性能比较出色的Nosql DB,Redis还是不错的选择,并且Redis 支持多种数据结构 SortSet,SET ,LIST, 并且在1.3.4版本支持SortSet的RANK功能,如果您想要计算排名服务不妨试试它、 

Redis 官方网站:  
http://code.google.com/p/redis/ 

以下是Redis 服务器端代码的分析  
C代码   收藏代码
  1. //Title: Redis 深入分析之服务器篇  
  2. //author: liuzheng  
  3. //注意: 本篇文章仅供参考  
  4.   
  5. main(int argc, char **argv)  
  6. {  
  7.     //一 加载配置  
  8.     loadServerConfig();  
  9.     ///二 配置项  
  10.      maxidletime,port,bindaddr,verbosity,logfile,dbnum,maxclients,maxmemory,masterhost,masterport,replstate,masterauth,glueoutputbuf,shareobjects,rdbcompression  
  11.      sharingpoolsize,daemonize,appendonly,appendfsyncm,requirepass,pidfile,dbfilename  
  12.         //三 初始化服务器  
  13.     initServer();  
  14.          //1.赋值server 属性  
  15.      //2.创建定时器,1ms执行一次  
  16.      aeCreateTimeEvent(server.el, 1, serverCron, NULL, NULL); //这个是个定时器链表  
  17.      //long long aeCreateTimeEvent(aeEventLoop *eventLoop, long long milliseconds,  
  18.          //aeTimeProc *proc, void *clientData,  
  19.          //aeEventFinalizerProc *finalizerProc)  
  20.      //3.server Crontab  
  21.      serverCron();  
  22.      //1.log数据库信息  
  23.      //2.log client connections  
  24.      //3.Show info about connections of clients  
  25.      //4.Close connections of timedout clients  
  26.      //5.1 Check if a background saving or AOF rewrite in progress terminated,  
  27.      //5.2 If there is not a background saving in progress check if we have to save now   
  28.                if (server.dirty >= sp->changes && now-server.lastsave > sp->seconds)  
  29.             rdbSaveBackground(server.dbfilename)-> rdbSave(server.dbfilename);  
  30.             //1.创建 "temp-%d.rdb"  
  31.             //2.  
  32.              for (j = 0; j < server.dbnum; j++) {  
  33.                     redisDb *db = server.db+j;  
  34.                 //1.保存类型  
  35.                 //2.保存大小  
  36.                 //遍历 DB 写入每个 entry  
  37.                 //写入方式    
  38.                 //        1.写入原始值-一般为string类型  
  39.                 //        2.将内存值转换为string写入  
  40.              }  
  41.              //写入文件数据结构为  
  42.              //DB_TYPE,DB_LEN,Entry_type,Entry_len,Entry_object_string......  
  43.              //DB_TYPE,DB_LEN,Entry_type,Entry_len,Entry_object_string......  
  44.              //...16个DB  
  45.            //这里只有发生变化就会触发  
  46.          server.dirty++;  
  47.            //但是mset 使用的是如下算法      
  48.          server.dirty += (c->argc-1)/2;  
  49.   
  50.       //6. Try to expire a few timed out keys  
  51.       //7. Check if we should connect to a MASTER ,SYNC  
  52.           syncWithMaster(void);  
  53.           //1.valid and auth  
  54.           //2.按块(1024)读取数据库文件  
  55.          while(可以读到数据)  
  56.          {  
  57.              nread = read(fd,buf,(dumpsize < 1024)?dumpsize:1024); #  
  58.              nwritten = write(dfd,buf,nread);  
  59.              nwritten.to(temp_file);  
  60.                  }  
  61.          rename(temp_file,server.dbfilename);  
  62.          emptyDb();  
  63.          rdbLoad(server.dbfilename);  
  64.            
  65.       
  66.         //四 Load File to memory  
  67.     if (server.appendonly) {  
  68.             if (loadAppendOnlyFile(server.appendfilename) == REDIS_OK)  
  69.                 redisLog(REDIS_NOTICE,"DB loaded from append only file");  
  70.         } else {  
  71.                 if (rdbLoad(server.dbfilename) == REDIS_OK)  
  72.                     redisLog(REDIS_NOTICE,"DB loaded from disk");  
  73.         }  
  74.   
  75.     //五 侦听client事件  
  76.     aeCreateFileEvent(server.el, server.fd, AE_READABLE,acceptHandler, NULL) == AE_ERR)  
  77.       //aeCreateFileEvent(aeEventLoop *eventLoop, int fd, int mask,aeFileProc *proc, void *clientData)  
  78.     //六 开启所有侦听事件  
  79.     aeMain();  
  80.     //七 清楚完成事件  
  81.     aeDeleteEventLoop(server.el);  
  82. }  
  83.   
  84.   
  85. //Redis 数据结构介绍  
  86. //DB struct  
  87. //创建数据库  
  88. server.db = zmalloc(sizeof(redisDb)*server.dbnum);  
  89. for (j = 0; j < server.dbnum; j++) {  
  90.         server.db[j].dict = dictCreate(&hashDictType,NULL);  
  91.         server.db[j].expires = dictCreate(&setDictType,NULL);  
  92.         server.db[j].id = j;  
  93. }  
  94.   
  95. /* Create a new hash table */  
  96. dict *dictCreate(dictType *type, void *privDataPtr)  
  97. {  
  98.     dict *ht = _dictAlloc(sizeof(*ht));  
  99.     _dictInit(ht,type,privDataPtr);  
  100.     return ht;  
  101. }  
  102.   
  103. /* Initialize the hash table */  
  104. int _dictInit(dict *ht, dictType *type,void *privDataPtr)  
  105. {  
  106.     _dictReset(ht);  
  107.     ht->type = type;  
  108.     ht->privdata = privDataPtr;  
  109.     return DICT_OK;  
  110. }  
  111.   
  112. /* Resize the table to the minimal size that contains all the elements, 
  113.  * but with the invariant of a USER/BUCKETS ration near to <= 1 */  
  114. static void _dictReset(dict *ht)  
  115. {  
  116.     ht->table = NULL;  
  117.     ht->size = 0;  
  118.     ht->sizemask = 0;  
  119.     ht->used = 0;  
  120. }  
  121.   
  122. typedef struct dictEntry {  
  123.     void *key;  
  124.     void *val;  
  125.     struct dictEntry *next;  
  126. } dictEntry;  
  127.   
  128. typedef struct dictType {  
  129.     unsigned int (*hashFunction)(const void *key);  
  130.     void *(*keyDup)(void *privdata, const void *key);  
  131.     void *(*valDup)(void *privdata, const void *obj);  
  132.     int (*keyCompare)(void *privdata, const void *key1, const void *key2);  
  133.     void (*keyDestructor)(void *privdata, void *key);  
  134.     void (*valDestructor)(void *privdata, void *obj);  
  135. } dictType;  
  136.   
  137. typedef struct dict {  
  138.     dictEntry **table;  
  139.     dictType *type;  
  140.     unsigned long size;  
  141.     unsigned long sizemask;  
  142.     unsigned long used;  
  143.     void *privdata;  
  144. } dict;  
  145.   
  146.   
  147. typedef struct redisDb {  
  148.     dict *dict;  
  149.     dict *expires;  
  150.     int id;  
  151. } redisDb;  
  152.   
  153.   
  154. ///  
  155. //Save Struct  
  156. appendServerSaveParams(60*60,1);  /* save after 1 hour and 1 change */  
  157. appendServerSaveParams(300,100);  /* save after 5 minutes and 100 changes */  
  158. appendServerSaveParams(60,10000); /* save after 1 minute and 10000 changes */  
  159. static void appendServerSaveParams(time_t seconds, int changes) {  
  160.     server.saveparams = zrealloc(server.saveparams,sizeof(struct saveparam)*(server.saveparamslen+1));  
  161.     server.saveparams[server.saveparamslen].seconds = seconds;  
  162.     server.saveparams[server.saveparamslen].changes = changes;  
  163.     server.saveparamslen++;  
  164. }  
  165.   
  166. static void resetServerSaveParams() {  
  167.     zfree(server.saveparams);  
  168.     server.saveparams = NULL;  
  169.     server.saveparamslen = 0;  
  170. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值