歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Redis通信協議優化

1、命令簡化
分析:redis通信協議中的命令,用的是原始的set、get、hset、hget等字符串,可以用0x01、0x02、0x03、0x04等單字節代替。
好處:節省網絡傳輸流量,減少dump文件和aof文件的大小。
壞處:不易閱讀(這個好象不是問題。。。)。

2、命令分隔符簡化
分析:redis通信協議中的命令分隔符,用的是"\r\n",同HTTP協議,可以用"\r"或"\n"代替。
好處:節省網絡傳輸流量,減少dump文件和aof文件的大小。
壞處:好象沒有。

3、命令大小寫優化(這與1有關,如果1做了,就不會有此條)
分析:redis通信協議文檔中,並未說明協議中命令用大寫好,還是小寫好,但仔細閱讀其源代碼,會發現,用小寫最好。
好處:減少大寫轉小寫次數,加速命令查找。
壞處:無。
參考:

  1. // 以下代碼來自redis.c   
  2.   
  3. /* A case insensitive version used for the command lookup table. */  
  4. int dictSdsKeyCaseCompare(void *privdata, const void *key1,  
  5.         const void *key2)  
  6. {  
  7.     DICT_NOTUSED(privdata);  
  8.   
  9.     return strcasecmp(key1, key2) == 0;  
  10. }  
  11.   
  12.   
  13. /* Command table. sds string -> command struct pointer. */  
  14. dictType commandTableDictType = {  
  15.     dictSdsCaseHash,           /* hash function */  
  16.     NULL,                      /* key dup */  
  17.     NULL,                      /* val dup */  
  18.     dictSdsKeyCaseCompare,     /* key compare */  
  19.     dictSdsDestructor,         /* key destructor */  
  20.     NULL                       /* val destructor */  
  21. };  
  22.   
  23. void initServerConfig() {  
  24.   
  25.     // ...   
  26.   
  27.     /* Command table -- we intiialize it here as it is part of the 
  28.      * initial configuration, since command names may be changed via 
  29.      * redis.conf using the rename-command directive. */  
  30.     server.commands = dictCreate(&commandTableDictType,NULL);  
  31.     populateCommandTable();  
  32.     server.delCommand = lookupCommandByCString("del");  
  33.     server.multiCommand = lookupCommandByCString("multi");  
  34.   
  35.     // ...   
  36. }  
  37.   
  38.   
  39. // 以下代碼來自linux kernel 3.4.4內核中的lib/string.c文件   
  40.   
  41. #ifndef __HAVE_ARCH_STRCASECMP   
  42. int strcasecmp(const char *s1, const char *s2)  
  43. {  
  44.     int c1, c2;  
  45.   
  46.     do {  
  47.         c1 = tolower(*s1++);  
  48.         c2 = tolower(*s2++);  
  49.     } while (c1 == c2 && c1 != 0);  
  50.     return c1 - c2;  
  51. }  
  52. EXPORT_SYMBOL(strcasecmp);  
  53. #endif  

關鍵函數strcasecmp比較的時候,是先將s1和s2中的對應字符轉化為小寫再比較的。

Copyright © Linux教程網 All Rights Reserved