Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
¿ÉÄÜÊÇĿǰ×îÏêϸµÄRedisÄÚ´æÄ£Ðͼ°Ó¦Óýâ¶Á
 
  2304  次浏览      44
 2018-9-11  
 
±à¼­ÍƼö:
±¾ÎÄÀ´×ÔÓÚ±à³ÌÃÔ˼²©¿ÍÔ°,Ö÷Òª½éÉÜRedisµÄÄÚ´æÄ£ÐÍ(ÒÔ3.0ΪÀý)£¬°üÀ¨RedisÕ¼ÓÃÄÚ´æµÄÇé¿ö¼°ÈçºÎ²éѯ¡¢²»Í¬µÄ¶ÔÏóÀàÐÍÔÚÄÚ´æÖеıàÂ뷽ʽ¡¢ÄÚ´æ·ÖÅäÆ÷(jemalloc)¡¢¼òµ¥¶¯Ì¬×Ö·û´®(SDS)¡¢RedisObjectµÈ;È»ºóÔÚ´Ë»ù´¡ÉϽéÉܼ¸¸öRedisÄÚ´æÄ£Ð͵ÄÓ¦Óá£

ǰÑÔ

RedisÊÇĿǰ×î»ð±¬µÄÄÚ´æÊý¾Ý¿âÖ®Ò»£¬Í¨¹ýÔÚÄÚ´æÖжÁдÊý¾Ý£¬´ó´óÌá¸ßÁ˶ÁдËÙ¶È£¬¿ÉÒÔ˵RedisÊÇʵÏÖÍøÕ¾¸ß²¢·¢²»¿É»òȱµÄÒ»²¿·Ö¡£

ÎÒÃÇʹÓÃRedisʱ£¬»á½Ó´¥RedisµÄ5ÖÖ¶ÔÏóÀàÐÍ(×Ö·û´®¡¢¹þÏ£¡¢ÁÐ±í¡¢¼¯ºÏ¡¢ÓÐÐò¼¯ºÏ)£¬·á¸»µÄÀàÐÍÊÇRedisÏà¶ÔÓÚMemcachedµÈµÄÒ»´óÓÅÊÆ¡£ÔÚÁ˽âRedisµÄ5ÖÖ¶ÔÏóÀàÐ͵ÄÓ÷¨ºÍÌØµãµÄ»ù´¡ÉÏ£¬½øÒ»²½Á˽âRedisµÄÄÚ´æÄ£ÐÍ£¬¶ÔRedisµÄʹÓÃÓкܴó°ïÖú£¬ÀýÈ磺

1¡¢¹ÀËãRedisÄÚ´æÊ¹ÓÃÁ¿¡£Ä¿Ç°ÎªÖ¹£¬ÄÚ´æµÄʹÓóɱ¾ÈÔÈ»Ïà¶Ô½Ï¸ß£¬Ê¹ÓÃÄÚ´æ²»ÄÜÎÞËù¹Ë¼É;¸ù¾ÝÐèÇóºÏÀíµÄÆÀ¹ÀRedisµÄÄÚ´æÊ¹ÓÃÁ¿£¬Ñ¡ÔñºÏÊʵĻúÆ÷ÅäÖ㬿ÉÒÔÔÚÂú×ãÐèÇóµÄÇé¿öϽÚÔ¼³É±¾¡£

2¡¢ÓÅ»¯ÄÚ´æÕ¼Óá£Á˽âRedisÄÚ´æÄ£ÐÍ¿ÉÒÔÑ¡Ôñ¸üºÏÊʵÄÊý¾ÝÀàÐͺͱàÂ룬¸üºÃµÄÀûÓÃRedisÄÚ´æ¡£

3¡¢·ÖÎö½â¾öÎÊÌâ¡£µ±Redis³öÏÖ×èÈû¡¢ÄÚ´æÕ¼ÓõÈÎÊÌâʱ£¬¾¡¿ì·¢ÏÖµ¼ÖÂÎÊÌâµÄÔ­Òò£¬±ãÓÚ·ÖÎö½â¾öÎÊÌâ¡£

ÕâÆªÎÄÕÂÖ÷Òª½éÉÜRedisµÄÄÚ´æÄ£ÐÍ(ÒÔ3.0ΪÀý)£¬°üÀ¨RedisÕ¼ÓÃÄÚ´æµÄÇé¿ö¼°ÈçºÎ²éѯ¡¢²»Í¬µÄ¶ÔÏóÀàÐÍÔÚÄÚ´æÖеıàÂ뷽ʽ¡¢ÄÚ´æ·ÖÅäÆ÷(jemalloc)¡¢¼òµ¥¶¯Ì¬×Ö·û´®(SDS)¡¢RedisObjectµÈ;È»ºóÔÚ´Ë»ù´¡ÉϽéÉܼ¸¸öRedisÄÚ´æÄ£Ð͵ÄÓ¦Óá£

Ò»¡¢RedisÄÚ´æÍ³¼Æ

¹¤ÓûÉÆÆäʱØÏÈÀûÆäÆ÷£¬ÔÚ˵Ã÷RedisÄÚ´æÖ®Ç°Ê×ÏÈ˵Ã÷ÈçºÎͳ¼ÆRedisʹÓÃÄÚ´æµÄÇé¿ö¡£

ÔÚ¿Í»§¶Ëͨ¹ýredis-cliÁ¬½Ó·þÎñÆ÷ºó(ºóÃæÈçÎÞÌØÊâ˵Ã÷£¬¿Í»§¶ËÒ»ÂÉʹÓÃredis-cli)£¬Í¨¹ýinfoÃüÁî¿ÉÒԲ鿴ÄÚ´æÊ¹ÓÃÇé¿ö£º

info memory

¿ÉÄÜÊÇĿǰ×îÏêϸµÄRedisÄÚ´æÄ£Ðͼ°Ó¦Óýâ¶Á

ÆäÖУ¬infoÃüÁî¿ÉÒÔÏÔʾredis·þÎñÆ÷µÄÐí¶àÐÅÏ¢£¬°üÀ¨·þÎñÆ÷»ù±¾ÐÅÏ¢¡¢CPU¡¢ÄÚ´æ¡¢³Ö¾Ã»¯¡¢¿Í»§¶ËÁ¬½ÓÐÅÏ¢µÈµÈ;memoryÊDzÎÊý£¬±íʾֻÏÔʾÄÚ´æÏà¹ØµÄÐÅÏ¢¡£

·µ»Ø½á¹ûÖбȽÏÖØÒªµÄ¼¸¸ö˵Ã÷ÈçÏ£º

(1)used_memory£ºRedis·ÖÅäÆ÷·ÖÅäµÄÄÚ´æ×ÜÁ¿(µ¥Î»ÊÇ×Ö½Ú)£¬°üÀ¨Ê¹ÓõÄÐéÄâÄÚ´æ(¼´swap);Redis·ÖÅäÆ÷ºóÃæ»á½éÉÜ¡£used_memory_humanÖ»ÊÇÏÔʾ¸üÓѺá£

(2)used_memory_rss£ºRedis½ø³ÌÕ¼¾Ý²Ù×÷ϵͳµÄÄÚ´æ(µ¥Î»ÊÇ×Ö½Ú)£¬Óëtop¼°psÃüÁî¿´µ½µÄÖµÊÇÒ»ÖµÄ;³ýÁË·ÖÅäÆ÷·ÖÅäµÄÄÚ´æÖ®Í⣬used_memory_rss»¹°üÀ¨½ø³ÌÔËÐб¾ÉíÐèÒªµÄÄÚ´æ¡¢ÄÚ´æË鯬µÈ£¬µ«ÊDz»°üÀ¨ÐéÄâÄÚ´æ¡£

Òò´Ë£¬used_memoryºÍused_memory_rss£¬Ç°ÕßÊÇ´ÓRedis½Ç¶ÈµÃµ½µÄÁ¿£¬ºóÕßÊÇ´Ó²Ù×÷ϵͳ½Ç¶ÈµÃµ½µÄÁ¿¡£¶þÕßÖ®ËùÒÔÓÐËù²»Í¬£¬Ò»·½ÃæÊÇÒòΪÄÚ´æË鯬ºÍRedis½ø³ÌÔËÐÐÐèÒªÕ¼ÓÃÄڴ棬ʹµÃǰÕß¿ÉÄܱȺóÕßС£¬ÁíÒ»·½ÃæÐéÄâÄÚ´æµÄ´æÔÚ£¬Ê¹µÃǰÕß¿ÉÄܱȺóÕß´ó¡£

ÓÉÓÚÔÚʵ¼ÊÓ¦ÓÃÖУ¬RedisµÄÊý¾ÝÁ¿»á±È½Ï´ó£¬´Ëʱ½ø³ÌÔËÐÐÕ¼ÓõÄÄÚ´æÓëRedisÊý¾ÝÁ¿ºÍÄÚ´æË鯬Ïà±È£¬¶¼»áСµÃ¶à;Òò´Ëused_memory_rssºÍused_memoryµÄ±ÈÀý£¬±ã³ÉÁ˺âÁ¿RedisÄÚ´æË鯬ÂʵIJÎÊý;Õâ¸ö²ÎÊý¾ÍÊÇmem_fragmentation_ratio¡£

(3)mem_fragmentation_ratio£ºÄÚ´æË鯬±ÈÂÊ£¬¸ÃÖµÊÇused_memory_rss / used_memoryµÄ±ÈÖµ¡£

mem_fragmentation_ratioÒ»°ã´óÓÚ1£¬ÇÒ¸ÃÖµÔ½´ó£¬ÄÚ´æË鯬±ÈÀýÔ½´ó¡£mem_fragmentation_ratio<1£¬ËµÃ÷RedisʹÓÃÁËÐéÄâÄڴ棬ÓÉÓÚÐéÄâÄÚ´æµÄý½éÊÇ´ÅÅÌ£¬±ÈÄÚ´æËÙ¶ÈÒªÂýºÜ¶à£¬µ±ÕâÖÖÇé¿ö³öÏÖʱ£¬Ó¦¸Ã¼°Ê±ÅŲ飬Èç¹ûÄÚ´æ²»×ãÓ¦¸Ã¼°Ê±´¦Àí£¬ÈçÔö¼ÓRedis½Úµã¡¢Ôö¼ÓRedis·þÎñÆ÷µÄÄÚ´æ¡¢ÓÅ»¯Ó¦Óõȡ£

Ò»°ãÀ´Ëµ£¬mem_fragmentation_ratioÔÚ1.03×óÓÒÊDZȽϽ¡¿µµÄ״̬(¶ÔÓÚjemallocÀ´Ëµ);ÉÏÃæ½ØÍ¼ÖеÄmem_fragmentation_ratioÖµºÜ´ó£¬ÊÇÒòΪ»¹Ã»ÓÐÏòRedisÖдæÈëÊý¾Ý£¬Redis½ø³Ì±¾ÉíÔËÐеÄÄÚ´æÊ¹µÃused_memory_rss ±Èused_memory´óµÃ¶à¡£

(4)mem_allocator£ºRedisʹÓõÄÄÚ´æ·ÖÅäÆ÷£¬ÔÚ±àÒëʱָ¶¨;¿ÉÒÔÊÇ libc ¡¢jemalloc»òÕßtcmalloc£¬Ä¬ÈÏÊÇjemalloc;½ØÍ¼ÖÐʹÓõıãÊÇĬÈϵÄjemalloc¡£

¶þ¡¢RedisÄÚ´æ»®·Ö

Redis×÷ΪÄÚ´æÊý¾Ý¿â£¬ÔÚÄÚ´æÖд洢µÄÄÚÈÝÖ÷ÒªÊÇÊý¾Ý(¼üÖµ¶Ô);ͨ¹ýÇ°ÃæµÄÐðÊö¿ÉÒÔÖªµÀ£¬³ýÁËÊý¾ÝÒÔÍ⣬RedisµÄÆäËû²¿·ÖÒ²»áÕ¼ÓÃÄÚ´æ¡£

RedisµÄÄÚ´æÕ¼ÓÃÖ÷Òª¿ÉÒÔ»®·ÖΪÒÔϼ¸¸ö²¿·Ö£º

1¡¢Êý¾Ý

×÷ΪÊý¾Ý¿â£¬Êý¾ÝÊÇ×îÖ÷ÒªµÄ²¿·Ö;Õⲿ·ÖÕ¼ÓõÄÄÚ´æ»áͳ¼ÆÔÚused_memoryÖС£

RedisʹÓüüÖµ¶Ô´æ´¢Êý¾Ý£¬ÆäÖеÄÖµ(¶ÔÏó)°üÀ¨5ÖÖÀàÐÍ£¬¼´×Ö·û´®¡¢¹þÏ£¡¢ÁÐ±í¡¢¼¯ºÏ¡¢ÓÐÐò¼¯ºÏ¡£Õâ5ÖÖÀàÐÍÊÇRedis¶ÔÍâÌṩµÄ£¬Êµ¼ÊÉÏ£¬ÔÚRedisÄÚ²¿£¬Ã¿ÖÖÀàÐÍ¿ÉÄÜÓÐ2ÖÖ»ò¸ü¶àµÄÄÚ²¿±àÂëʵÏÖ;´ËÍ⣬RedisÔÚ´æ´¢¶ÔÏóʱ£¬²¢²»ÊÇÖ±½Ó½«Êý¾ÝÈÓ½øÄڴ棬¶øÊÇ»á¶Ô¶ÔÏó½øÐи÷ÖÖ°ü×°£ºÈçredisObject¡¢SDSµÈ;ÕâÆªÎÄÕºóÃæ½«Öصã½éÉÜRedisÖÐÊý¾Ý´æ´¢µÄϸ½Ú¡£

2¡¢½ø³Ì±¾ÉíÔËÐÐÐèÒªµÄÄÚ´æ

RedisÖ÷½ø³Ì±¾ÉíÔËÐп϶¨ÐèÒªÕ¼ÓÃÄڴ棬Èç´úÂë¡¢³£Á¿³ØµÈµÈ;Õⲿ·ÖÄÚ´æ´óÔ¼¼¸Õ×£¬ÔÚ´ó¶àÊýÉú²ú»·¾³ÖÐÓëRedisÊý¾ÝÕ¼ÓõÄÄÚ´æÏà±È¿ÉÒÔºöÂÔ¡£Õⲿ·ÖÄÚ´æ²»ÊÇÓÉjemalloc·ÖÅ䣬Òò´Ë²»»áͳ¼ÆÔÚused_memoryÖС£

²¹³ä˵Ã÷£º³ýÁËÖ÷½ø³ÌÍ⣬Redis´´½¨µÄ×Ó½ø³ÌÔËÐÐÒ²»áÕ¼ÓÃÄڴ棬ÈçRedisÖ´ÐÐAOF¡¢RDBÖØÐ´Ê±´´½¨µÄ×Ó½ø³Ì¡£µ±È»£¬Õⲿ·ÖÄÚ´æ²»ÊôÓÚRedis½ø³Ì£¬Ò²²»»áͳ¼ÆÔÚused_memoryºÍused_memory_rssÖС£

3¡¢»º³åÄÚ´æ

»º³åÄÚ´æ°üÀ¨£º

¿Í»§¶Ë»º³åÇø¡¢¸´ÖÆ»ýѹ»º³åÇø¡¢AOF»º³åÇøµÈ;

ÆäÖУ¬¿Í»§¶Ë»º³å´æ´¢¿Í»§¶ËÁ¬½ÓµÄÊäÈëÊä³ö»º³å;

¸´ÖÆ»ýѹ»º³åÓÃÓÚ²¿·Ö¸´Öƹ¦ÄÜ;

AOF»º³åÇøÓÃÓÚÔÚ½øÐÐAOFÖØÐ´Ê±£¬±£´æ×î½üµÄдÈëÃüÁî¡£

ÔÚÁ˽âÏàÓ¦¹¦ÄÜ֮ǰ£¬²»ÐèÒªÖªµÀÕâЩ»º³åµÄϸ½Ú;Õⲿ·ÖÄÚ´æÓÉjemalloc·ÖÅ䣬Òò´Ë»áͳ¼ÆÔÚused_memoryÖС£

4¡¢ÄÚ´æË鯬

ÄÚ´æË鯬ÊÇRedisÔÚ·ÖÅä¡¢»ØÊÕÎïÀíÄÚ´æ¹ý³ÌÖвúÉúµÄ¡£ÀýÈ磬Èç¹û¶ÔÊý¾ÝµÄ¸ü¸ÄƵ·±£¬¶øÇÒÊý¾ÝÖ®¼äµÄ´óСÏà²îºÜ´ó£¬¿ÉÄܵ¼ÖÂredisÊͷŵĿռäÔÚÎïÀíÄÚ´æÖв¢Ã»ÓÐÊÍ·Å£¬µ«redisÓÖÎÞ·¨ÓÐЧÀûÓã¬Õâ¾ÍÐγÉÁËÄÚ´æË鯬¡£ÄÚ´æË鯬²»»áͳ¼ÆÔÚused_memoryÖС£

ÄÚ´æË鯬µÄ²úÉúÓë¶ÔÊý¾Ý½øÐеIJÙ×÷¡¢Êý¾ÝµÄÌØµãµÈ¶¼ÓйØ;´ËÍ⣬ÓëʹÓõÄÄÚ´æ·ÖÅäÆ÷Ò²ÓйØÏµ£ºÈç¹ûÄÚ´æ·ÖÅäÆ÷Éè¼ÆºÏÀí£¬¿ÉÒÔ¾¡¿ÉÄܵļõÉÙÄÚ´æË鯬µÄ²úÉú¡£ºóÃæ½«ÒªËµµ½µÄjemalloc±ãÔÚ¿ØÖÆÄÚ´æË鯬·½Ãæ×öµÄºÜºÃ¡£

Èç¹ûRedis·þÎñÆ÷ÖеÄÄÚ´æË鯬ÒѾ­ºÜ´ó£¬¿ÉÒÔͨ¹ý°²È«ÖØÆôµÄ·½Ê½¼õСÄÚ´æË鯬£ºÒòÎªÖØÆôÖ®ºó£¬RedisÖØÐ´ӱ¸·ÝÎļþÖжÁÈ¡Êý¾Ý£¬ÔÚÄÚ´æÖнøÐÐÖØÅÅ£¬ÎªÃ¿¸öÊý¾ÝÖØÐÂÑ¡ÔñºÏÊʵÄÄÚ´æµ¥Ôª£¬¼õСÄÚ´æË鯬¡£

Èý¡¢RedisÊý¾Ý´æ´¢µÄϸ½Ú

1¡¢¸ÅÊö

¹ØÓÚRedisÊý¾Ý´æ´¢µÄϸ½Ú£¬Éæ¼°µ½ÄÚ´æ·ÖÅäÆ÷(Èçjemalloc)¡¢¼òµ¥¶¯Ì¬×Ö·û´®(SDS)¡¢5ÖÖ¶ÔÏóÀàÐͼ°ÄÚ²¿±àÂë¡¢redisObject¡£ÔÚ½²Êö¾ßÌåÄÚÈÝ֮ǰ£¬ÏÈ˵Ã÷Ò»ÏÂÕ⼸¸ö¸ÅÄîÖ®¼äµÄ¹ØÏµ¡£

ÏÂͼÊÇÖ´ÐÐset hello worldʱ£¬ËùÉæ¼°µ½µÄÊý¾ÝÄ£ÐÍ¡£

ͼƬÀ´Ô´£ºhttps://searchdatabase.techtarget.com.cn/7-20218/

(1)dictEntry£ºRedisÊÇKey-ValueÊý¾Ý¿â£¬Òò´Ë¶Ôÿ¸ö¼üÖµ¶Ô¶¼»áÓÐÒ»¸ödictEntry£¬ÀïÃæ´æ´¢ÁËÖ¸ÏòKeyºÍValueµÄÖ¸Õë;nextÖ¸ÏòÏÂÒ»¸ödictEntry£¬Óë±¾Key-ValueÎ޹ء£

(2)Key£ºÍ¼ÖÐÓÒÉϽǿɼû£¬Key(¡±hello¡±)²¢²»ÊÇÖ±½ÓÒÔ×Ö·û´®´æ´¢£¬¶øÊÇ´æ´¢ÔÚSDS½á¹¹ÖС£

(3)redisObject£ºValue(¡°world¡±)¼È²»ÊÇÖ±½ÓÒÔ×Ö·û´®´æ´¢£¬Ò²²»ÊÇÏñKeyÒ»ÑùÖ±½Ó´æ´¢ÔÚSDSÖУ¬¶øÊÇ´æ´¢ÔÚredisObjectÖС£Êµ¼ÊÉÏ£¬²»ÂÛValueÊÇ5ÖÖÀàÐ͵ÄÄÄÒ»ÖÖ£¬¶¼ÊÇͨ¹ýredisObjectÀ´´æ´¢µÄ;¶øredisObjectÖеÄtype×Ö¶ÎÖ¸Ã÷ÁËValue¶ÔÏóµÄÀàÐÍ£¬ptr×Ö¶ÎÔòÖ¸Ïò¶ÔÏóËùÔڵĵØÖ·¡£²»¹ý¿ÉÒÔ¿´³ö£¬×Ö·û´®¶ÔÏóËäÈ»¾­¹ýÁËredisObjectµÄ°ü×°£¬µ«ÈÔÈ»ÐèҪͨ¹ýSDS´æ´¢¡£

ʵ¼ÊÉÏ£¬redisObject³ýÁËtypeºÍptr×Ö¶ÎÒÔÍ⣬»¹ÓÐÆäËû×Ö¶ÎͼÖÐûÓиø³ö£¬ÈçÓÃÓÚÖ¸¶¨¶ÔÏóÄÚ²¿±àÂëµÄ×Ö¶Î;ºóÃæ»áÏêϸ½éÉÜ¡£

(4)jemalloc£ºÎÞÂÛÊÇDictEntry¶ÔÏ󣬻¹ÊÇredisObject¡¢SDS¶ÔÏ󣬶¼ÐèÒªÄÚ´æ·ÖÅäÆ÷(Èçjemalloc)·ÖÅäÄÚ´æ½øÐд洢¡£ÒÔDictEntry¶ÔÏóΪÀý£¬ÓÐ3¸öÖ¸Õë×é³É£¬ÔÚ64λ»úÆ÷ÏÂÕ¼24¸ö×Ö½Ú£¬jemalloc»áΪËü·ÖÅä32×Ö½Ú´óСµÄÄÚ´æµ¥Ôª¡£

ÏÂÃæÀ´·Ö±ð½éÉÜjemalloc¡¢redisObject¡¢SDS¡¢¶ÔÏóÀàÐͼ°ÄÚ²¿±àÂë¡£

2¡¢jemalloc

RedisÔÚ±àÒëʱ±ã»áÖ¸¶¨ÄÚ´æ·ÖÅäÆ÷;ÄÚ´æ·ÖÅäÆ÷¿ÉÒÔÊÇ libc ¡¢jemalloc»òÕßtcmalloc£¬Ä¬ÈÏÊÇjemalloc¡£

jemalloc×÷ΪRedisµÄĬÈÏÄÚ´æ·ÖÅäÆ÷£¬ÔÚ¼õСÄÚ´æË鯬·½Ãæ×öµÄÏà¶Ô±È½ÏºÃ¡£jemallocÔÚ64λϵͳÖУ¬½«ÄÚ´æ¿Õ¼ä»®·ÖΪС¡¢´ó¡¢¾Þ´óÈý¸ö·¶Î§;ÿ¸ö·¶Î§ÄÚÓÖ»®·ÖÁËÐí¶àСµÄÄÚ´æ¿éµ¥Î»;µ±Redis´æ´¢Êý¾Ýʱ£¬»áÑ¡Ôñ´óС×îºÏÊʵÄÄÚ´æ¿é½øÐд洢¡£

jemalloc»®·ÖµÄÄÚ´æµ¥ÔªÈçÏÂͼËùʾ£º

ͼƬÀ´Ô´£ºhttp://blog.csdn.net/zhengpeitao/article/details/76573053

ÀýÈ磬Èç¹ûÐèÒª´æ´¢´óСΪ130×ֽڵĶÔÏó£¬jemalloc»á½«Æä·ÅÈë160×Ö½ÚµÄÄÚ´æµ¥ÔªÖС£

3¡¢redisObject

Ç°ÃæËµµ½£¬Redis¶ÔÏóÓÐ5ÖÖÀàÐÍ;ÎÞÂÛÊÇÄÄÖÖÀàÐÍ£¬Redis¶¼²»»áÖ±½Ó´æ´¢£¬¶øÊÇͨ¹ýredisObject¶ÔÏó½øÐд洢¡£

redisObject¶ÔÏó·Ç³£ÖØÒª£¬Redis¶ÔÏóµÄÀàÐÍ¡¢ÄÚ²¿±àÂë¡¢ÄÚ´æ»ØÊÕ¡¢¹²Ïí¶ÔÏóµÈ¹¦ÄÜ£¬¶¼ÐèÒªredisObjectÖ§³Ö£¬ÏÂÃæ½«Í¨¹ýredisObjectµÄ½á¹¹À´ËµÃ÷ËüÊÇÈçºÎÆð×÷Óõġ£

redisObjectµÄ¶¨ÒåÈçÏÂ(²»Í¬°æ±¾µÄRedis¿ÉÄÜÉÔÉÔÓÐËù²»Í¬)£º

typedef struct redisObject {
unsigned type:4;
unsigned encoding:4;
unsigned lru:REDIS_LRU_BITS; /* lru time (relative to server.lruclock) */
int refcount;
void *ptr;
} robj;

redisObjectµÄÿ¸ö×ֶεĺ¬ÒåºÍ×÷ÓÃÈçÏ£º

(1)type

type×ֶαíʾ¶ÔÏóµÄÀàÐÍ£¬Õ¼4¸ö±ÈÌØ;Ŀǰ°üÀ¨REDIS_STRING(×Ö·û´®)¡¢REDIS_LIST (Áбí)¡¢REDIS_HASH(¹þÏ£)¡¢REDIS_SET(¼¯ºÏ)¡¢REDIS_ZSET(ÓÐÐò¼¯ºÏ)¡£

µ±ÎÒÃÇÖ´ÐÐtypeÃüÁîʱ£¬±ãÊÇͨ¹ý¶ÁÈ¡RedisObjectµÄtype×ֶλñµÃ¶ÔÏóµÄÀàÐÍ;ÈçÏÂͼËùʾ£º

(2)encoding

encoding±íʾ¶ÔÏóµÄÄÚ²¿±àÂ룬ռ4¸ö±ÈÌØ¡£

¶ÔÓÚRedisÖ§³ÖµÄÿÖÖÀàÐÍ£¬¶¼ÓÐÖÁÉÙÁ½ÖÖÄÚ²¿±àÂ룬ÀýÈç¶ÔÓÚ×Ö·û´®£¬ÓÐint¡¢embstr¡¢rawÈýÖÖ±àÂ롣ͨ¹ýencodingÊôÐÔ£¬Redis¿ÉÒÔ¸ù¾Ý²»Í¬µÄʹÓó¡¾°À´Îª¶ÔÏóÉèÖò»Í¬µÄ±àÂ룬´ó´óÌá¸ßÁËRedisµÄÁé»îÐÔºÍЧÂÊ¡£ÒÔÁбí¶ÔÏóΪÀý£¬ÓÐѹËõÁбíºÍË«¶ËÁ´±íÁ½ÖÖ±àÂ뷽ʽ;Èç¹ûÁбíÖеÄÔªËØ½ÏÉÙ£¬RedisÇãÏòÓÚʹÓÃѹËõÁÐ±í½øÐд洢£¬ÒòΪѹËõÁбíÕ¼ÓÃÄÚ´æ¸üÉÙ£¬¶øÇÒ±ÈË«¶ËÁ´±í¿ÉÒÔ¸ü¿ìÔØÈë;µ±Áбí¶ÔÏóÔªËØ½Ï¶àʱ£¬Ñ¹ËõÁбí¾Í»áת»¯Îª¸üÊʺϴ洢´óÁ¿ÔªËصÄË«¶ËÁ´±í¡£

ͨ¹ýobject encodingÃüÁ¿ÉÒԲ鿴¶ÔÏó²ÉÓõıàÂ뷽ʽ£¬ÈçÏÂͼËùʾ£º

5ÖÖ¶ÔÏóÀàÐͶÔÓ¦µÄ±àÂ뷽ʽÒÔ¼°Ê¹ÓÃÌõ¼þ£¬½«ÔÚºóÃæ½éÉÜ¡£

(3)lru

lru¼Ç¼µÄÊǶÔÏó×îºóÒ»´Î±»ÃüÁî³ÌÐò·ÃÎʵÄʱ¼ä£¬Õ¼¾ÝµÄ±ÈÌØÊý²»Í¬µÄ°æ±¾ÓÐËù²»Í¬(Èç4.0°æ±¾Õ¼24±ÈÌØ£¬2.6°æ±¾Õ¼22±ÈÌØ)¡£

ͨ¹ý¶Ô±Èlruʱ¼äÓ뵱ǰʱ¼ä£¬¿ÉÒÔ¼ÆËãij¸ö¶ÔÏóµÄ¿Õתʱ¼ä;object idletimeÃüÁî¿ÉÒÔÏÔʾ¸Ã¿Õתʱ¼ä(µ¥Î»ÊÇÃë)¡£object idletimeÃüÁîµÄÒ»¸öÌØÊâÖ®´¦ÔÚÓÚËü²»¸Ä±ä¶ÔÏóµÄlruÖµ¡£

lruÖµ³ýÁËͨ¹ýobject idletimeÃüÁî´òÓ¡Ö®Í⣬»¹ÓëRedisµÄÄÚ´æ»ØÊÕÓйØÏµ£ºÈç¹ûRedis´ò¿ªÁËmaxmemoryÑ¡ÏÇÒÄÚ´æ»ØÊÕË㷨ѡÔñµÄÊÇvolatile-lru»òallkeys¡ªlru£¬ÄÇôµ±RedisÄÚ´æÕ¼Óó¬¹ýmaxmemoryÖ¸¶¨µÄֵʱ£¬Redis»áÓÅÏÈÑ¡Ôñ¿Õתʱ¼ä×µÄ¶ÔÏó½øÐÐÊÍ·Å¡£

(4)refcount

refcountÓë¹²Ïí¶ÔÏó

refcount¼Ç¼µÄÊǸöÔÏó±»ÒýÓõĴÎÊý£¬ÀàÐÍΪÕûÐÍ¡£refcountµÄ×÷Óã¬Ö÷ÒªÔÚÓÚ¶ÔÏóµÄÒýÓüÆÊýºÍÄÚ´æ»ØÊÕ¡£

µ±´´½¨Ð¶ÔÏóʱ£¬refcount³õʼ»¯Îª1;

µ±ÓÐгÌÐòʹÓøöÔÏóʱ£¬refcount¼Ó1;

µ±¶ÔÏó²»ÔÙ±»Ò»¸öгÌÐòʹÓÃʱ£¬refcount¼õ1;

µ±refcount±äΪ0ʱ£¬¶ÔÏóÕ¼ÓõÄÄÚ´æ»á±»ÊÍ·Å¡£

RedisÖб»¶à´ÎʹÓõĶÔÏó(refcount>1)£¬³ÆÎª¹²Ïí¶ÔÏó¡£RedisΪÁ˽ÚÊ¡Äڴ棬µ±ÓÐһЩ¶ÔÏóÖØ¸´³öÏÖʱ£¬ÐµijÌÐò²»»á´´½¨ÐµĶÔÏ󣬶øÊÇÈÔȻʹÓÃÔ­À´µÄ¶ÔÏó¡£Õâ¸ö±»Öظ´Ê¹ÓõĶÔÏ󣬾ÍÊǹ²Ïí¶ÔÏó¡£Ä¿Ç°¹²Ïí¶ÔÏó½öÖ§³ÖÕûÊýÖµµÄ×Ö·û´®¶ÔÏó¡£

¹²Ïí¶ÔÏóµÄ¾ßÌåʵÏÖ

RedisµÄ¹²Ïí¶ÔÏóĿǰֻ֧³ÖÕûÊýÖµµÄ×Ö·û´®¶ÔÏó¡£Ö®ËùÒÔÈç´Ë£¬Êµ¼ÊÉÏÊǶÔÄÚ´æºÍCPU(ʱ¼ä)µÄƽºâ£º¹²Ïí¶ÔÏóËäÈ»»á½µµÍÄÚ´æÏûºÄ£¬µ«ÊÇÅжÏÁ½¸ö¶ÔÏóÊÇ·ñÏàµÈÈ´ÐèÒªÏûºÄ¶îÍâµÄʱ¼ä¡£

¶ÔÓÚÕûÊýÖµ£¬ÅжϲÙ×÷¸´ÔÓ¶ÈΪO(1);

¶ÔÓÚÆÕͨ×Ö·û´®£¬Åжϸ´ÔÓ¶ÈΪO(n);

¶ø¶ÔÓÚ¹þÏ£¡¢ÁÐ±í¡¢¼¯ºÏºÍÓÐÐò¼¯ºÏ£¬Åжϵĸ´ÔÓ¶ÈΪO(n^2)¡£

ËäÈ»¹²Ïí¶ÔÏóÖ»ÄÜÊÇÕûÊýÖµµÄ×Ö·û´®¶ÔÏ󣬵«ÊÇ5ÖÖÀàÐͶ¼¿ÉÄÜʹÓù²Ïí¶ÔÏó(Èç¹þÏ£¡¢ÁбíµÈµÄÔªËØ¿ÉÒÔʹÓÃ)¡£

¾ÍĿǰµÄʵÏÖÀ´Ëµ£¬Redis·þÎñÆ÷ÔÚ³õʼ»¯Ê±£¬»á´´½¨10000¸ö×Ö·û´®¶ÔÏó£¬Öµ·Ö±ðÊÇ0~9999µÄÕûÊýÖµ;µ±RedisÐèҪʹÓÃֵΪ0~9999µÄ×Ö·û´®¶ÔÏóʱ£¬¿ÉÒÔÖ±½ÓʹÓÃÕâЩ¹²Ïí¶ÔÏó¡£10000Õâ¸öÊý×Ö¿ÉÒÔͨ¹ýµ÷Õû²ÎÊýREDIS_SHARED_INTEGERS(4.0ÖÐÊÇOBJ_SHARED_INTEGERS)µÄÖµ½øÐиı䡣

¹²Ïí¶ÔÏóµÄÒýÓôÎÊý¿ÉÒÔͨ¹ýobject refcountÃüÁî²é¿´£¬ÈçÏÂͼËùʾ¡£ÃüÁîÖ´ÐеĽá¹ûÒ³×ôÖ¤ÁËÖ»ÓÐ0~9999Ö®¼äµÄÕûÊý»á×÷Ϊ¹²Ïí¶ÔÏó¡£

(5)ptr

ptrÖ¸ÕëÖ¸Ïò¾ßÌåµÄÊý¾Ý£¬ÈçÇ°ÃæµÄÀý×ÓÖУ¬set hello world£¬ptrÖ¸Ïò°üº¬×Ö·û´®worldµÄSDS¡£

(6)×ܽá

×ÛÉÏËùÊö£¬redisObjectµÄ½á¹¹Óë¶ÔÏóÀàÐÍ¡¢±àÂë¡¢ÄÚ´æ»ØÊÕ¡¢¹²Ïí¶ÔÏó¶¼ÓйØÏµ;Ò»¸öredisObject¶ÔÏóµÄ´óСΪ16×Ö½Ú£º

4bit+4bit+24bit+4Byte+8Byte=16Byte¡£

4¡¢SDS

RedisûÓÐÖ±½ÓʹÓÃC×Ö·û´®(¼´ÒÔ¿Õ×Ö·û¡¯\0¡¯½áβµÄ×Ö·ûÊý×é)×÷ΪĬÈϵÄ×Ö·û´®±íʾ£¬¶øÊÇʹÓÃÁËSDS¡£SDSÊǼòµ¥¶¯Ì¬×Ö·û´®(Simple Dynamic String)µÄËõд¡£

(1)SDS½á¹¹

sdsµÄ½á¹¹ÈçÏ£º

struct sdshdr {
int len;
int free;
char buf[];
};

ÆäÖУ¬buf±íʾ×Ö½ÚÊý×飬ÓÃÀ´´æ´¢×Ö·û´®;len±íʾbufÒÑʹÓõij¤¶È£¬free±íʾbufδʹÓõij¤¶È¡£ÏÂÃæÊÇÁ½¸öÀý×Ó¡£

ͼƬÀ´Ô´£º¡¶RedisÉè¼ÆÓëʵÏÖ¡·

ͨ¹ýSDSµÄ½á¹¹¿ÉÒÔ¿´³ö£¬bufÊý×éµÄ³¤¶È=free+len+1(ÆäÖÐ1±íʾ×Ö·û´®½áβµÄ¿Õ×Ö·û);ËùÒÔ£¬Ò»¸öSDS½á¹¹Õ¼¾ÝµÄ¿Õ¼äΪ£ºfreeËùÕ¼³¤¶È+lenËùÕ¼³¤¶È+ bufÊý×éµÄ³¤¶È=4+4+free+len+1=free+len+9¡£

(2)SDSÓëC×Ö·û´®µÄ±È½Ï

SDSÔÚC×Ö·û´®µÄ»ù´¡ÉϼÓÈëÁËfreeºÍlen×ֶΣ¬´øÀ´Á˺ܶàºÃ´¦£º

»ñÈ¡×Ö·û´®³¤¶È£ºSDSÊÇO(1)£¬C×Ö·û´®ÊÇO(n)

»º³åÇøÒç³ö£ºÊ¹ÓÃC×Ö·û´®µÄAPIʱ£¬Èç¹û×Ö·û´®³¤¶ÈÔö¼Ó(Èçstrcat²Ù×÷)¶øÍü¼ÇÖØÐ·ÖÅäÄڴ棬ºÜÈÝÒ×Ôì³É»º³åÇøµÄÒç³ö;¶øSDSÓÉÓڼǼÁ˳¤¶È£¬ÏàÓ¦µÄAPIÔÚ¿ÉÄÜÔì³É»º³åÇøÒç³öʱ»á×Ô¶¯ÖØÐ·ÖÅäÄڴ棬¶Å¾øÁË»º³åÇøÒç³ö¡£

ÐÞ¸Ä×Ö·û´®Ê±ÄÚ´æµÄÖØ·ÖÅ䣺¶ÔÓÚC×Ö·û´®£¬Èç¹ûÒªÐÞ¸Ä×Ö·û´®£¬±ØÐëÒªÖØÐ·ÖÅäÄÚ´æ(ÏÈÊÍ·ÅÔÙÉêÇë)£¬ÒòΪÈç¹ûûÓÐÖØÐ·ÖÅ䣬×Ö·û´®³¤¶ÈÔö´óʱ»áÔì³ÉÄڴ滺³åÇøÒç³ö£¬×Ö·û´®³¤¶È¼õСʱ»áÔì³ÉÄÚ´æÐ¹Â¶¡£¶ø¶ÔÓÚSDS£¬ÓÉÓÚ¿ÉÒԼǼlenºÍfree£¬Òò´Ë½â³ýÁË×Ö·û´®³¤¶ÈºÍ¿Õ¼äÊý×鳤¶ÈÖ®¼äµÄ¹ØÁª£¬¿ÉÒÔÔÚ´Ë»ù´¡ÉϽøÐÐÓÅ»¯£º¿Õ¼äÔ¤·ÖÅä²ßÂÔ(¼´·ÖÅäÄÚ´æÊ±±Èʵ¼ÊÐèÒªµÄ¶à)ʹµÃ×Ö·û´®³¤¶ÈÔö´óÊ±ÖØÐ·ÖÅäÄÚ´æµÄ¸ÅÂÊ´ó´ó¼õС;¶èÐÔ¿Õ¼äÊͷŲßÂÔʹµÃ×Ö·û´®³¤¶È¼õÐ¡Ê±ÖØÐ·ÖÅäÄÚ´æµÄ¸ÅÂÊ´ó´ó¼õС¡£

´æÈ¡¶þ½øÖÆÊý¾Ý£ºSDS¿ÉÒÔ£¬C×Ö·û´®²»¿ÉÒÔ¡£ÒòΪC×Ö·û´®ÒÔ¿Õ×Ö·û×÷Ϊ×Ö·û´®½áÊøµÄ±êʶ£¬¶ø¶ÔÓÚһЩ¶þ½øÖÆÎļþ(ÈçͼƬµÈ)£¬ÄÚÈÝ¿ÉÄܰüÀ¨¿Õ×Ö·û´®£¬Òò´ËC×Ö·û´®ÎÞ·¨ÕýÈ·´æÈ¡;¶øSDSÒÔ×Ö·û´®³¤¶ÈlenÀ´×÷Ϊ×Ö·û´®½áÊø±êʶ£¬Òò´ËûÓÐÕâ¸öÎÊÌâ¡£

´ËÍ⣬ÓÉÓÚSDSÖеÄbufÈÔȻʹÓÃÁËC×Ö·û´®(¼´ÒÔ¡¯\0¡¯½áβ)£¬Òò´ËSDS¿ÉÒÔʹÓÃC×Ö·û´®¿âÖеIJ¿·Öº¯Êý;µ«ÊÇÐèҪעÒâµÄÊÇ£¬Ö»Óе±SDSÓÃÀ´´æ´¢Îı¾Êý¾Ýʱ²Å¿ÉÒÔÕâÑùʹÓã¬ÔÚ´æ´¢¶þ½øÖÆÊý¾ÝʱÔò²»ÐÐ(¡¯\0¡¯²»Ò»¶¨Êǽáβ)¡£

(3)SDSÓëC×Ö·û´®µÄÓ¦ÓÃ

RedisÔÚ´æ´¢¶ÔÏóʱ£¬Ò»ÂÉʹÓÃSDS´úÌæC×Ö·û´®¡£ÀýÈçset hello worldÃüÁhelloºÍworld¶¼ÊÇÒÔSDSµÄÐÎʽ´æ´¢µÄ¡£¶øsadd myset member1 member2 member3ÃüÁ²»ÂÛÊǼü(¡±myset¡±)£¬»¹ÊǼ¯ºÏÖеÄÔªËØ(¡±member1¡±¡¢ ¡±member2¡±ºÍ¡±member3¡±)£¬¶¼ÊÇÒÔSDSµÄÐÎʽ´æ´¢¡£³ýÁË´æ´¢¶ÔÏó£¬SDS»¹ÓÃÓÚ´æ´¢¸÷ÖÖ»º³åÇø¡£

Ö»ÓÐÔÚ×Ö·û´®²»»á¸Ä±äµÄÇé¿öÏ£¬Èç´òÓ¡ÈÕ־ʱ£¬²Å»áʹÓÃC×Ö·û´®¡£

ËÄ¡¢RedisµÄ¶ÔÏóÀàÐÍÓëÄÚ²¿±àÂë

Ç°ÃæÒѾ­Ëµ¹ý£¬RedisÖ§³Ö5ÖÖ¶ÔÏóÀàÐÍ£¬¶øÃ¿Öֽṹ¶¼ÓÐÖÁÉÙÁ½ÖÖ±àÂë;ÕâÑù×öµÄºÃ´¦ÔÚÓÚ£ºÒ»·½Ãæ½Ó¿ÚÓëʵÏÖ·ÖÀ룬µ±ÐèÒªÔö¼Ó»ò¸Ä±äÄÚ²¿±àÂëʱ£¬Óû§Ê¹Óò»ÊÜÓ°Ï죬ÁíÒ»·½Ãæ¿ÉÒÔ¸ù¾Ý²»Í¬µÄÓ¦Óó¡¾°Çл»ÄÚ²¿±àÂ룬Ìá¸ßЧÂÊ¡£

Redis¸÷ÖÖ¶ÔÏóÀàÐÍÖ§³ÖµÄÄÚ²¿±àÂëÈçÏÂͼËùʾ(ͼÖа汾ÊÇRedis3.0£¬RedisºóÃæ°æ±¾ÖÐÓÖÔö¼ÓÁËÄÚ²¿±àÂ룬ÂÔ¹ý²»Ìá;±¾ÕÂËù½éÉܵÄÄÚ²¿±àÂë¶¼ÊÇ»ùÓÚ3.0µÄ)£º

ͼƬÀ´Ô´£º¡¶RedisÉè¼ÆÓëʵÏÖ¡·

¹ØÓÚRedisÄÚ²¿±àÂëµÄת»»£¬¶¼·ûºÏÒÔϹæÂÉ£º±àÂëת»»ÔÚRedisдÈëÊý¾ÝʱÍê³É£¬ÇÒת»»¹ý³Ì²»¿ÉÄæ£¬Ö»ÄÜ´ÓСÄÚ´æ±àÂëÏò´óÄÚ´æ±àÂëת»»¡£

1¡¢×Ö·û´®

(1)¸Å¿ö

×Ö·û´®ÊÇ×î»ù´¡µÄÀàÐÍ£¬ÒòΪËùÓеļü¶¼ÊÇ×Ö·û´®ÀàÐÍ£¬ÇÒ×Ö·û´®Ö®ÍâµÄÆäËû¼¸ÖÖ¸´ÔÓÀàÐ͵ÄÔªËØÒ²ÊÇ×Ö·û´®¡£

×Ö·û´®³¤¶È²»Äܳ¬¹ý512MB¡£

(2)ÄÚ²¿±àÂë

×Ö·û´®ÀàÐ͵ÄÄÚ²¿±àÂëÓÐ3ÖÖ£¬ËüÃǵÄÓ¦Óó¡¾°ÈçÏ£º

int£º8¸ö×ֽڵij¤ÕûÐÍ¡£×Ö·û´®ÖµÊÇÕûÐÍʱ£¬Õâ¸öֵʹÓÃlongÕûÐͱíʾ¡£

embstr£º<=39×Ö½ÚµÄ×Ö·û´®¡£embstrÓëraw¶¼Ê¹ÓÃredisObjectºÍsds±£´æÊý¾Ý£¬Çø±ðÔÚÓÚ£¬embstrµÄʹÓÃÖ»·ÖÅäÒ»´ÎÄÚ´æ¿Õ¼ä(Òò´ËredisObjectºÍsdsÊÇÁ¬ÐøµÄ)£¬¶ørawÐèÒª·ÖÅäÁ½´ÎÄÚ´æ¿Õ¼ä(·Ö±ðΪredisObjectºÍsds·ÖÅä¿Õ¼ä)¡£Òò´ËÓërawÏà±È£¬embstrµÄºÃ´¦ÔÚÓÚ´´½¨Ê±ÉÙ·ÖÅäÒ»´Î¿Õ¼ä£¬É¾³ýʱÉÙÊÍ·ÅÒ»´Î¿Õ¼ä£¬ÒÔ¼°¶ÔÏóµÄËùÓÐÊý¾ÝÁ¬ÔÚÒ»Æð£¬Ñ°ÕÒ·½±ã¡£¶øembstrµÄ»µ´¦Ò²ºÜÃ÷ÏÔ£¬Èç¹û×Ö·û´®µÄ³¤¶ÈÔö¼ÓÐèÒªÖØÐ·ÖÅäÄÚ´æÊ±£¬Õû¸öredisObjectºÍsds¶¼ÐèÒªÖØÐ·ÖÅä¿Õ¼ä£¬Òò´ËredisÖеÄembstrʵÏÖΪֻ¶Á¡£

raw£º´óÓÚ39¸ö×Ö½ÚµÄ×Ö·û´®

ʾÀýÈçÏÂͼËùʾ£º

embstrºÍraw½øÐÐÇø·ÖµÄ³¤¶È£¬ÊÇ39;ÊÇÒòΪredisObjectµÄ³¤¶ÈÊÇ16×Ö½Ú£¬sdsµÄ³¤¶ÈÊÇ9+×Ö·û´®³¤¶È;Òò´Ëµ±×Ö·û´®³¤¶ÈÊÇ39ʱ£¬embstrµÄ³¤¶ÈÕýºÃÊÇ16+9+39=64£¬jemallocÕýºÃ¿ÉÒÔ·ÖÅä64×Ö½ÚµÄÄÚ´æµ¥Ôª¡£

(3)±àÂëת»»

µ±intÊý¾Ý²»ÔÙÊÇÕûÊý£¬»ò´óС³¬¹ýÁËlongµÄ·¶Î§Ê±£¬×Ô¶¯×ª»¯Îªraw¡£

¶ø¶ÔÓÚembstr£¬ÓÉÓÚÆäʵÏÖÊÇÖ»¶ÁµÄ£¬Òò´ËÔÚ¶Ôembstr¶ÔÏó½øÐÐÐÞ¸Äʱ£¬¶¼»áÏÈת»¯ÎªrawÔÙ½øÐÐÐ޸ģ¬Òò´Ë£¬Ö»ÒªÊÇÐÞ¸Äembstr¶ÔÏó£¬Ð޸ĺóµÄ¶ÔÏóÒ»¶¨ÊÇrawµÄ£¬ÎÞÂÛÊÇ·ñ´ïµ½ÁË39¸ö×Ö½Ú¡£Ê¾ÀýÈçÏÂͼËùʾ£º

2¡¢Áбí

(1)¸Å¿ö

Áбí(list)ÓÃÀ´´æ´¢¶à¸öÓÐÐòµÄ×Ö·û´®£¬Ã¿¸ö×Ö·û´®³ÆÎªÔªËØ;Ò»¸öÁбí¿ÉÒÔ´æ´¢2^32-1¸öÔªËØ¡£RedisÖеÄÁбíÖ§³ÖÁ½¶Ë²åÈëºÍµ¯³ö£¬²¢¿ÉÒÔ»ñµÃÖ¸¶¨Î»ÖÃ(»ò·¶Î§)µÄÔªËØ£¬¿ÉÒԳ䵱Êý×é¡¢¶ÓÁС¢Õ»µÈ¡£

(2)ÄÚ²¿±àÂë

ÁбíµÄÄÚ²¿±àÂë¿ÉÒÔÊÇѹËõÁбí(ziplist)»òË«¶ËÁ´±í(linkedlist)¡£

Ë«¶ËÁ´±í£ºÓÉÒ»¸ölist½á¹¹ºÍ¶à¸ölistNode½á¹¹×é³É;µäÐͽṹÈçÏÂͼËùʾ£º

ͼƬÀ´Ô´£º¡¶RedisÉè¼ÆÓëʵÏÖ¡·

ͨ¹ýͼÖпÉÒÔ¿´³ö£¬Ë«¶ËÁ´±íͬʱ±£´æÁ˱íÍ·Ö¸ÕëºÍ±íβָÕ룬²¢ÇÒÿ¸ö½Úµã¶¼ÓÐÖ¸ÏòǰºÍÖ¸ÏòºóµÄÖ¸Õë;Á´±íÖб£´æÁËÁбíµÄ³¤¶È;dup¡¢freeºÍmatchΪ½ÚµãÖµÉèÖÃÀàÐÍÌØ¶¨º¯Êý£¬ËùÒÔÁ´±í¿ÉÒÔÓÃÓÚ±£´æ¸÷ÖÖ²»Í¬ÀàÐ͵ÄÖµ¡£¶øÁ´±íÖÐÿ¸ö½ÚµãÖ¸ÏòµÄÊÇtypeΪ×Ö·û´®µÄredisObject¡£

ѹËõÁÐ±í£ºÑ¹ËõÁбíÊÇRedisΪÁ˽ÚÔ¼ÄÚ´æ¶ø¿ª·¢µÄ£¬ÊÇÓÉһϵÁÐÌØÊâ±àÂëµÄÁ¬ÐøÄÚ´æ¿é(¶ø²»ÊÇÏñË«¶ËÁ´±íÒ»Ñùÿ¸ö½ÚµãÊÇÖ¸Õë)×é³ÉµÄ˳ÐòÐÍÊý¾Ý½á¹¹;¾ßÌå½á¹¹Ïà¶Ô±È½Ï¸´ÔÓ£¬ÂÔ¡£ÓëË«¶ËÁ´±íÏà±È£¬Ñ¹ËõÁбí¿ÉÒÔ½ÚÊ¡ÄÚ´æ¿Õ¼ä£¬µ«ÊǽøÐÐÐ޸ĻòÔöɾ²Ù×÷ʱ£¬¸´ÔӶȽϸß;Òò´Ëµ±½ÚµãÊýÁ¿½ÏÉÙʱ£¬¿ÉÒÔʹÓÃѹËõÁбí;µ«ÊǽڵãÊýÁ¿¶àʱ£¬»¹ÊÇʹÓÃË«¶ËÁ´±í»®Ëã¡£

ѹËõÁÐ±í²»½öÓÃÓÚʵÏÖÁÐ±í£¬Ò²ÓÃÓÚʵÏÖ¹þÏ£¡¢ÓÐÐòÁбí;ʹÓ÷dz£¹ã·º¡£

(3)±àÂëת»»

Ö»ÓÐͬʱÂú×ãÏÂÃæÁ½¸öÌõ¼þʱ£¬²Å»áʹÓÃѹËõÁÐ±í£º

ÁбíÖÐÔªËØÊýÁ¿Ð¡ÓÚ512¸ö;

ÁбíÖÐËùÓÐ×Ö·û´®¶ÔÏó¶¼²»×ã64×Ö½Ú¡£

Èç¹ûÓÐÒ»¸öÌõ¼þ²»Âú×㣬ÔòʹÓÃË«¶ËÁбí;ÇÒ±àÂëÖ»¿ÉÄÜÓÉѹËõÁбíת»¯ÎªË«¶ËÁ´±í£¬·´·½ÏòÔò²»¿ÉÄÜ¡£

ÏÂͼչʾÁËÁбí±àÂëת»»µÄÌØµã£º

ÆäÖУ¬µ¥¸ö×Ö·û´®²»Äܳ¬¹ý64×Ö½Ú£¬ÊÇΪÁ˱ãÓÚͳһ·ÖÅäÿ¸ö½ÚµãµÄ³¤¶È;ÕâÀïµÄ64×Ö½ÚÊÇÖ¸×Ö·û´®µÄ³¤¶È£¬²»°üÀ¨SDS½á¹¹£¬ÒòΪѹËõÁбíʹÓÃÁ¬Ðø¡¢¶¨³¤ÄÚ´æ¿é´æ´¢×Ö·û´®£¬²»ÐèÒªSDS½á¹¹Ö¸Ã÷³¤¶È¡£ºóÃæÌᵽѹËõÁÐ±í£¬Ò²»áÇ¿µ÷³¤¶È²»³¬¹ý64×Ö½Ú£¬Ô­ÀíÓëÕâÀïÀàËÆ¡£

3¡¢¹þÏ£

(1)¸Å¿ö

¹þÏ£(×÷ΪһÖÖÊý¾Ý½á¹¹)£¬²»½öÊÇredis¶ÔÍâÌṩµÄ5ÖÖ¶ÔÏóÀàÐ͵ÄÒ»ÖÖ(Óë×Ö·û´®¡¢ÁÐ±í¡¢¼¯ºÏ¡¢ÓÐÐò½áºÏ²¢ÁÐ)£¬Ò²ÊÇRedis×÷ΪKey-ValueÊý¾Ý¿âËùʹÓõÄÊý¾Ý½á¹¹¡£ÎªÁË˵Ã÷µÄ·½±ã£¬ÔÚ±¾ÎĺóÃæµ±Ê¹Óá°ÄÚ²ãµÄ¹þÏ£¡±Ê±£¬´ú±íµÄÊÇredis¶ÔÍâÌṩµÄ5ÖÖ¶ÔÏóÀàÐ͵ÄÒ»ÖÖ;ʹÓá°Íâ²ãµÄ¹þÏ£¡±´úÖ¸Redis×÷ΪKey-ValueÊý¾Ý¿âËùʹÓõÄÊý¾Ý½á¹¹¡£

(2)ÄÚ²¿±àÂë

ÄÚ²ãµÄ¹þϣʹÓõÄÄÚ²¿±àÂë¿ÉÒÔÊÇѹËõÁбí(ziplist)ºÍ¹þÏ£±í(hashtable)Á½ÖÖ;RedisµÄÍâ²ãµÄ¹þÏ£ÔòֻʹÓÃÁËhashtable¡£

ѹËõÁбíÇ°ÃæÒѽéÉÜ¡£Óë¹þÏ£±íÏà±È£¬Ñ¹ËõÁбíÓÃÓÚÔªËØ¸öÊýÉÙ¡¢ÔªËس¤¶ÈСµÄ³¡¾°;ÆäÓÅÊÆÔÚÓÚ¼¯Öд洢£¬½ÚÊ¡¿Õ¼ä;ͬʱ£¬ËäÈ»¶ÔÓÚÔªËØµÄ²Ù×÷¸´ÔÓ¶ÈÒ²ÓÉO(n)±äΪÁËO(1)£¬µ«ÓÉÓÚ¹þÏ£ÖÐÔªËØÊýÁ¿½ÏÉÙ£¬Òò´Ë²Ù×÷µÄʱ¼ä²¢Ã»ÓÐÃ÷ÏÔÁÓÊÆ¡£

hashtable£ºÒ»¸öhashtableÓÉ1¸ödict½á¹¹¡¢2¸ödictht½á¹¹¡¢1¸ödictEntryÖ¸ÕëÊý×é(³ÆÎªbucket)ºÍ¶à¸ödictEntry½á¹¹×é³É¡£

Õý³£Çé¿öÏÂ(¼´hashtableûÓнøÐÐrehashʱ)¸÷²¿·Ö¹ØÏµÈçÏÂͼËùʾ£º

ͼƬ¸Ä±à×Ô£º¡¶RedisÉè¼ÆÓëʵÏÖ¡·

ÏÂÃæ´Óµ×²ãÏòÉÏÒÀ´Î½éÉܸ÷¸ö²¿·Ö£º

dictEntry

dictEntry½á¹¹ÓÃÓÚ±£´æ¼üÖµ¶Ô£¬½á¹¹¶¨ÒåÈçÏ£º

typedef struct dictEntry{
void *key;
union{
void *val;
uint64_tu64;
int64_ts64;
}v;
struct dictEntry *next;
}dictEntry;

ÆäÖУ¬¸÷¸öÊôÐԵŦÄÜÈçÏ£º

key£º¼üÖµ¶ÔÖеļü;

val£º¼üÖµ¶ÔÖеÄÖµ£¬Ê¹ÓÃunion(¼´¹²ÓÃÌå)ʵÏÖ£¬´æ´¢µÄÄÚÈݼȿÉÄÜÊÇÒ»¸öÖ¸ÏòÖµµÄÖ¸Õ룬Ҳ¿ÉÄÜÊÇ64λÕûÐÍ£¬»òÎÞ·ûºÅ64λÕûÐÍ;

next£ºÖ¸ÏòÏÂÒ»¸ödictEntry£¬ÓÃÓÚ½â¾ö¹þÏ£³åÍ»ÎÊÌâ

ÔÚ64λϵͳÖУ¬Ò»¸ödictEntry¶ÔÏóÕ¼24×Ö½Ú(key/val/next¸÷Õ¼8×Ö½Ú)¡£

bucket

bucketÊÇÒ»¸öÊý×飬Êý×éµÄÿ¸öÔªËØ¶¼ÊÇÖ¸ÏòdictEntry½á¹¹µÄÖ¸Õë¡£redisÖÐbucketÊý×éµÄ´óС¼ÆËã¹æÔòÈçÏ£º´óÓÚdictEntryµÄ¡¢×îСµÄ2^n;ÀýÈ磬Èç¹ûÓÐ1000¸ödictEntry£¬ÄÇôbucket´óСΪ1024;Èç¹ûÓÐ1500¸ödictEntry£¬Ôòbucket´óСΪ2048¡£

dictht

dictht½á¹¹ÈçÏ£º

typedef struct dictht{
dictEntry **table;
unsigned long size;
unsigned long sizemask;
unsigned long used;
}dictht;

ÆäÖУ¬¸÷¸öÊôÐԵŦÄÜ˵Ã÷ÈçÏ£º

tableÊôÐÔÊÇÒ»¸öÖ¸Õ룬ָÏòbucket;

sizeÊôÐԼǼÁ˹þÏ£±íµÄ´óС£¬¼´bucketµÄ´óС;

used¼Ç¼ÁËÒÑʹÓõÄdictEntryµÄÊýÁ¿;

sizemaskÊôÐÔµÄÖµ×ÜÊÇΪsize-1£¬Õâ¸öÊôÐԺ͹þÏ£ÖµÒ»Æð¾ö¶¨Ò»¸ö¼üÔÚtableÖд洢µÄλÖá£

dict

Ò»°ãÀ´Ëµ£¬Í¨¹ýʹÓÃdicthtºÍdictEntry½á¹¹£¬±ã¿ÉÒÔʵÏÖÆÕͨ¹þÏ£±íµÄ¹¦ÄÜ;µ«ÊÇRedisµÄʵÏÖÖУ¬ÔÚdictht½á¹¹µÄÉϲ㣬»¹ÓÐÒ»¸ödict½á¹¹¡£ÏÂÃæËµÃ÷dict½á¹¹µÄ¶¨Òå¼°×÷Óá£

dict½á¹¹ÈçÏ£º

typedef struct dict{
dictType *type;
void *privdata;
dictht ht[2];
int trehashidx;
} dict;

ÆäÖУ¬typeÊôÐÔºÍprivdataÊôÐÔÊÇΪÁËÊÊÓ¦²»Í¬ÀàÐ͵ļüÖµ¶Ô£¬ÓÃÓÚ´´½¨¶à̬×ֵ䡣

htÊôÐÔºÍtrehashidxÊôÐÔÔòÓÃÓÚrehash£¬¼´µ±¹þÏ£±íÐèÒªÀ©Õ¹»òÊÕËõʱʹÓá£htÊÇÒ»¸ö°üº¬Á½¸öÏîµÄÊý×飬ÿÏî¶¼Ö¸ÏòÒ»¸ödictht½á¹¹£¬ÕâÒ²ÊÇRedisµÄ¹þÏ£»áÓÐ1¸ödict¡¢2¸ödictht½á¹¹µÄÔ­Òò¡£Í¨³£Çé¿öÏ£¬ËùÓеÄÊý¾Ý¶¼ÊÇ´æÔÚ·ÅdictµÄht[0]ÖУ¬ht[1]Ö»ÔÚrehashµÄʱºòʹÓá£dict½øÐÐrehash²Ù×÷µÄʱºò£¬½«ht[0]ÖеÄËùÓÐÊý¾Ýrehashµ½ht[1]ÖС£È»ºó½«ht[1]¸³Öµ¸øht[0]£¬²¢Çå¿Õht[1]¡£

Òò´Ë£¬RedisÖеĹþÏ£Ö®ËùÒÔÔÚdicthtºÍdictEntry½á¹¹Ö®Í⻹ÓÐÒ»¸ödict½á¹¹£¬Ò»·½ÃæÊÇΪÁËÊÊÓ¦²»Í¬ÀàÐ͵ļüÖµ¶Ô£¬ÁíÒ»·½ÃæÊÇΪÁËrehash¡£

(3)±àÂëת»»

ÈçǰËùÊö£¬RedisÖÐÄÚ²ãµÄ¹þÏ£¼È¿ÉÄÜʹÓùþÏ£±í£¬Ò²¿ÉÄÜʹÓÃѹËõÁÐ±í¡£

Ö»ÓÐͬʱÂú×ãÏÂÃæÁ½¸öÌõ¼þʱ£¬²Å»áʹÓÃѹËõÁÐ±í£º

¹þÏ£ÖÐÔªËØÊýÁ¿Ð¡ÓÚ512¸ö;

¹þÏ£ÖÐËùÓмüÖµ¶ÔµÄ¼üºÍÖµ×Ö·û´®³¤¶È¶¼Ð¡ÓÚ64×Ö½Ú¡£

Èç¹ûÓÐÒ»¸öÌõ¼þ²»Âú×㣬ÔòʹÓùþÏ£±í;ÇÒ±àÂëÖ»¿ÉÄÜÓÉѹËõÁбíת»¯Îª¹þÏ£±í£¬·´·½ÏòÔò²»¿ÉÄÜ¡£

ÏÂͼչʾÁËRedisÄÚ²ãµÄ¹þÏ£±àÂëת»»µÄÌØµã£º

4¡¢¼¯ºÏ

(1)¸Å¿ö

¼¯ºÏ(set)ÓëÁбíÀàËÆ£¬¶¼ÊÇÓÃÀ´±£´æ¶à¸ö×Ö·û´®£¬µ«¼¯ºÏÓëÁбíÓÐÁ½µã²»Í¬£º¼¯ºÏÖеÄÔªËØÊÇÎÞÐòµÄ£¬Òò´Ë²»ÄÜͨ¹ýË÷ÒýÀ´²Ù×÷ÔªËØ;¼¯ºÏÖеÄÔªËØ²»ÄÜÓÐÖØ¸´¡£

Ò»¸ö¼¯ºÏÖÐ×î¶à¿ÉÒÔ´æ´¢2^32-1¸öÔªËØ;³ýÁËÖ§³Ö³£¹æµÄÔöɾ¸Ä²é£¬Redis»¹Ö§³Ö¶à¸ö¼¯ºÏÈ¡½»¼¯¡¢²¢¼¯¡¢²î¼¯¡£

(2)ÄÚ²¿±àÂë

¼¯ºÏµÄÄÚ²¿±àÂë¿ÉÒÔÊÇÕûÊý¼¯ºÏ(intset)»ò¹þÏ£±í(hashtable)¡£

¹þÏ£±íÇ°ÃæÒѾ­½²¹ý£¬ÕâÀïÂÔ¹ý²»Ìá;ÐèҪעÒâµÄÊÇ£¬¼¯ºÏÔÚʹÓùþÏ£±íʱ£¬ÖµÈ«²¿±»ÖÃΪnull¡£

ÕûÊý¼¯ºÏµÄ½á¹¹¶¨ÒåÈçÏ£º

typedef struct intset{
uint32_t encoding;
uint32_t length;
int8_t contents[];
} intset;

ÆäÖУ¬encoding´ú±ícontentsÖд洢ÄÚÈݵÄÀàÐÍ£¬ËäÈ»contents(´æ´¢¼¯ºÏÖеÄÔªËØ)ÊÇint8_tÀàÐÍ£¬µ«Êµ¼ÊÉÏÆä´æ´¢µÄÖµÊÇint16_t¡¢int32_t»òint64_t£¬¾ßÌåµÄÀàÐͱãÊÇÓÉencoding¾ö¶¨µÄ;length±íÊ¾ÔªËØ¸öÊý¡£

ÕûÊý¼¯ºÏÊÊÓÃÓÚ¼¯ºÏËùÓÐÔªËØ¶¼ÊÇÕûÊýÇÒ¼¯ºÏÔªËØÊýÁ¿½ÏСµÄʱºò£¬Óë¹þÏ£±íÏà±È£¬ÕûÊý¼¯ºÏµÄÓÅÊÆÔÚÓÚ¼¯Öд洢£¬½ÚÊ¡¿Õ¼ä;ͬʱ£¬ËäÈ»¶ÔÓÚÔªËØµÄ²Ù×÷¸´ÔÓ¶ÈÒ²ÓÉO(n)±äΪÁËO(1)£¬µ«ÓÉÓÚ¼¯ºÏÊýÁ¿½ÏÉÙ£¬Òò´Ë²Ù×÷µÄʱ¼ä²¢Ã»ÓÐÃ÷ÏÔÁÓÊÆ¡£

(3)±àÂëת»»

Ö»ÓÐͬʱÂú×ãÏÂÃæÁ½¸öÌõ¼þʱ£¬¼¯ºÏ²Å»áʹÓÃÕûÊý¼¯ºÏ£º

¼¯ºÏÖÐÔªËØÊýÁ¿Ð¡ÓÚ512¸ö;

¼¯ºÏÖÐËùÓÐÔªËØ¶¼ÊÇÕûÊýÖµ¡£

Èç¹ûÓÐÒ»¸öÌõ¼þ²»Âú×㣬ÔòʹÓùþÏ£±í;ÇÒ±àÂëÖ»¿ÉÄÜÓÉÕûÊý¼¯ºÏת»¯Îª¹þÏ£±í£¬·´·½ÏòÔò²»¿ÉÄÜ¡£

ÏÂͼչʾÁ˼¯ºÏ±àÂëת»»µÄÌØµã£º

5¡¢ÓÐÐò¼¯ºÏ

(1)¸Å¿ö

ÓÐÐò¼¯ºÏÓ뼯ºÏÒ»Ñù£¬ÔªËض¼²»ÄÜÖØ¸´;µ«Ó뼯ºÏ²»Í¬µÄÊÇ£¬ÓÐÐò¼¯ºÏÖеÄÔªËØÊÇÓÐ˳ÐòµÄ¡£ÓëÁбíʹÓÃË÷Òýϱê×÷ΪÅÅÐòÒÀ¾Ý²»Í¬£¬ÓÐÐò¼¯ºÏΪÿ¸öÔªËØÉèÖÃÒ»¸ö·ÖÊý(score)×÷ΪÅÅÐòÒÀ¾Ý¡£

(2)ÄÚ²¿±àÂë

ÓÐÐò¼¯ºÏµÄÄÚ²¿±àÂë¿ÉÒÔÊÇѹËõÁбí(ziplist)»òÌøÔ¾±í(skiplist)¡£ziplistÔÚÁбíºÍ¹þÏ£Öж¼ÓÐʹÓã¬Ç°ÃæÒѾ­½²¹ý£¬ÕâÀïÂÔ¹ý²»Ìá¡£

ÌøÔ¾±íÊÇÒ»ÖÖÓÐÐòÊý¾Ý½á¹¹£¬Í¨¹ýÔÚÿ¸ö½ÚµãÖÐά³Ö¶à¸öÖ¸ÏòÆäËû½ÚµãµÄÖ¸Õ룬´Ó¶ø´ïµ½¿ìËÙ·ÃÎʽڵãµÄÄ¿µÄ¡£³ýÁËÌøÔ¾±í£¬ÊµÏÖÓÐÐòÊý¾Ý½á¹¹µÄÁíÒ»ÖÖµäÐÍʵÏÖÊÇÆ½ºâÊ÷;´ó¶àÊýÇé¿öÏ£¬ÌøÔ¾±íµÄЧÂÊ¿ÉÒÔºÍÆ½ºâÊ÷æÇÃÀ£¬ÇÒÌøÔ¾±íʵÏÖ±ÈÆ½ºâÊ÷¼òµ¥ºÜ¶à£¬Òò´ËredisÖÐÑ¡ÓÃÌøÔ¾±í´úÌæÆ½ºâÊ÷¡£

ÌøÔ¾±íÖ§³Öƽ¾ùO(logN)¡¢×O(N)µÄ¸´ÔÓµã½øÐнڵã²éÕÒ£¬²¢Ö§³Ö˳Ðò²Ù×÷¡£RedisµÄÌøÔ¾±íʵÏÖÓÉzskiplistºÍzskiplistNodeÁ½¸ö½á¹¹×é³É£ºÇ°ÕßÓÃÓÚ±£´æÌøÔ¾±íÐÅÏ¢(ÈçÍ·½áµã¡¢Î²½Úµã¡¢³¤¶ÈµÈ)£¬ºóÕßÓÃÓÚ±íÊ¾ÌøÔ¾±í½Úµã¡£¾ßÌå½á¹¹Ïà¶Ô±È½Ï¸´ÔÓ£¬ÂÔ¡£

(3)±àÂëת»»

Ö»ÓÐͬʱÂú×ãÏÂÃæÁ½¸öÌõ¼þʱ£¬²Å»áʹÓÃѹËõÁÐ±í£º

ÓÐÐò¼¯ºÏÖÐÔªËØÊýÁ¿Ð¡ÓÚ128¸ö;

ÓÐÐò¼¯ºÏÖÐËùÓгÉÔ±³¤¶È¶¼²»×ã64×Ö½Ú¡£

Èç¹ûÓÐÒ»¸öÌõ¼þ²»Âú×㣬ÔòʹÓÃÌøÔ¾±í;ÇÒ±àÂëÖ»¿ÉÄÜÓÉѹËõÁбíת»¯ÎªÌøÔ¾±í£¬·´·½ÏòÔò²»¿ÉÄÜ¡£

ÏÂͼչʾÁËÓÐÐò¼¯ºÏ±àÂëת»»µÄÌØµã£º

Îå¡¢Ó¦ÓþÙÀý

Á˽âRedisµÄÄÚ´æÄ£ÐÍÖ®ºó£¬ÏÂÃæÍ¨¹ý¼¸¸öÀý×Ó˵Ã÷ÆäÓ¦Óá£

1¡¢¹ÀËãRedisÄÚ´æÊ¹ÓÃÁ¿

Òª¹ÀËãredisÖеÄÊý¾ÝÕ¼¾ÝµÄÄÚ´æ´óС£¬ÐèÒª¶ÔredisµÄÄÚ´æÄ£ÐÍÓбȽÏÈ«ÃæµÄÁ˽⣬°üÀ¨Ç°Ãæ½éÉܵÄhashtable¡¢sds¡¢redisobject¡¢¸÷ÖÖ¶ÔÏóÀàÐ͵ıàÂ뷽ʽµÈ¡£

ÏÂÃæÒÔ×î¼òµ¥µÄ×Ö·û´®ÀàÐÍÀ´½øÐÐ˵Ã÷¡£

¼ÙÉèÓÐ90000¸ö¼üÖµ¶Ô£¬Ã¿¸ökeyµÄ³¤¶ÈÊÇ7¸ö×Ö½Ú£¬Ã¿¸övalueµÄ³¤¶ÈÒ²ÊÇ7¸ö×Ö½Ú(ÇÒkeyºÍvalue¶¼²»ÊÇÕûÊý);ÏÂÃæÀ´¹ÀËãÕâ90000¸ö¼üÖµ¶ÔËùÕ¼ÓõĿռ䡣ÔÚ¹ÀËãÕ¼¾Ý¿Õ¼ä֮ǰ£¬Ê×ÏÈ¿ÉÒÔÅж¨×Ö·û´®ÀàÐÍʹÓõıàÂ뷽ʽ£ºembstr¡£

90000¸ö¼üÖµ¶ÔÕ¼¾ÝµÄÄÚ´æ¿Õ¼äÖ÷Òª¿ÉÒÔ·ÖΪÁ½²¿·Ö£ºÒ»²¿·ÖÊÇ90000¸ödictEntryÕ¼¾ÝµÄ¿Õ¼ä;Ò»²¿·ÖÊǼüÖµ¶ÔËùÐèÒªµÄbucket¿Õ¼ä¡£

ÿ¸ödictEntryÕ¼¾ÝµÄ¿Õ¼ä°üÀ¨£º

1) Ò»¸ödictEntry£¬24×Ö½Ú£¬jemalloc»á·ÖÅä32×Ö½ÚµÄÄÚ´æ¿é

2) Ò»¸ökey£¬7×Ö½Ú£¬ËùÒÔSDS(key)ÐèÒª7+9=16¸ö×Ö½Ú£¬jemalloc»á·ÖÅä16×Ö½ÚµÄÄÚ´æ¿é

3) Ò»¸öredisObject£¬16×Ö½Ú£¬jemalloc»á·ÖÅä16×Ö½ÚµÄÄÚ´æ¿é

4) Ò»¸övalue£¬7×Ö½Ú£¬ËùÒÔSDS(value)ÐèÒª7+9=16¸ö×Ö½Ú£¬jemalloc»á·ÖÅä16×Ö½ÚµÄÄÚ´æ¿é

5) ×ÛÉÏ£¬Ò»¸ödictEntryÐèÒª32+16+16+16=80¸ö×Ö½Ú¡£

bucket¿Õ¼ä£ºbucketÊý×éµÄ´óСΪ´óÓÚ90000µÄ×îСµÄ2^n£¬ÊÇ131072;ÿ¸öbucketÔªËØÎª8×Ö½Ú(ÒòΪ64λϵͳÖÐÖ¸Õë´óСΪ8×Ö½Ú)¡£

Òò´Ë£¬¿ÉÒÔ¹ÀËã³öÕâ90000¸ö¼üÖµ¶ÔÕ¼¾ÝµÄÄÚ´æ´óСΪ£º90000*80 + 131072*8 = 8248576¡£

ÏÂÃæÐ´¸ö³ÌÐòÔÚredisÖÐÑé֤һϣº

public class RedisTest {

public static Jedis jedis = new Jedis("localhost", 6379);

public static void main(String[] args) throws Exception{
Long m1 = Long.valueOf(getMemory());
insertData();
Long m2 = Long.valueOf(getMemory());
System.out.println(m2 - m1);
}

public static void insertData(){
for(int i = 10000; i < 100000; i++){
jedis.set("aa" + i, "aa" + i); //keyºÍvalue³¤¶È¶¼ÊÇ7×Ö½Ú£¬ÇÒ²»ÊÇÕûÊý
}
}

public static String getMemory(){
String memoryAllLine = jedis.info("memory");
String usedMemoryLine = memoryAllLine.split("\r\n")[1];
String memory = usedMemoryLine.substring(usedMemoryLine.indexOf(':') + 1);
return memory;
}
}

 

ÔËÐнá¹û£º8247552

ÀíÂÛÖµÓë½á¹ûÖµÎó²îÔÚÍò·ÖÖ®1.2£¬¶ÔÓÚ¼ÆËãÐèÒª¶àÉÙÄÚ´æÀ´Ëµ£¬Õâ¸ö¾«¶ÈÒѾ­×ã¹»ÁË¡£Ö®ËùÒÔ»á´æÔÚÎó²î£¬ÊÇÒòΪÔÚÎÒÃDzåÈë90000ÌõÊý¾Ý֮ǰredisÒÑ·ÖÅäÁËÒ»¶¨µÄbucket¿Õ¼ä£¬¶øÕâЩbucket¿Õ¼äÉÐδʹÓá£

×÷Ϊ¶Ô±È½«keyºÍvalueµÄ³¤¶ÈÓÉ7×Ö½ÚÔö¼Óµ½8×Ö½Ú£¬Ôò¶ÔÓ¦µÄSDS±äΪ17¸ö×Ö½Ú£¬jemalloc»á·ÖÅä32¸ö×Ö½Ú£¬Òò´Ëÿ¸ödictEntryÕ¼ÓõÄ×Ö½ÚÊýÒ²ÓÉ80×Ö½Ú±äΪ112×Ö½Ú¡£´Ëʱ¹ÀËãÕâ90000¸ö¼üÖµ¶ÔÕ¼¾ÝÄÚ´æ´óСΪ£º90000*112 + 131072*8 = 11128576¡£

ÔÚredisÖÐÑéÖ¤´úÂëÈçÏÂ(Ö»Ð޸IJåÈëÊý¾ÝµÄ´úÂë)£º

public static void insertData(){
for(int i = 10000; i < 100000; i++){
jedis.set("aaa" + i, "aaa" + i); //keyºÍvalue³¤¶È¶¼ÊÇ8×Ö½Ú£¬ÇÒ²»ÊÇÕûÊý
}
}

ÔËÐнá¹û£º11128576;¹ÀËã׼ȷ¡£

¶ÔÓÚ×Ö·û´®ÀàÐÍÖ®ÍâµÄÆäËûÀàÐÍ£¬¶ÔÄÚ´æÕ¼ÓõĹÀËã·½·¨ÊÇÀàËÆµÄ£¬ÐèÒª½áºÏ¾ßÌåÀàÐ͵ıàÂ뷽ʽÀ´È·¶¨¡£

2¡¢ÓÅ»¯ÄÚ´æÕ¼ÓÃ

Á˽âredisµÄÄÚ´æÄ£ÐÍ£¬¶ÔÓÅ»¯redisÄÚ´æÕ¼ÓÃÓкܴó°ïÖú¡£ÏÂÃæ½éÉܼ¸ÖÖÓÅ»¯³¡¾°¡£

(1)ÀûÓÃjemallocÌØÐÔ½øÐÐÓÅ»¯

ÉÏһС½ÚËù½²ÊöµÄ90000¸ö¼üÖµ±ãÊÇÒ»¸öÀý×Ó¡£ÓÉÓÚjemalloc·ÖÅäÄÚ´æÊ±ÊýÖµÊDz»Á¬ÐøµÄ£¬Òò´Ëkey/value×Ö·û´®±ä»¯Ò»¸ö×Ö½Ú£¬¿ÉÄÜ»áÒýÆðÕ¼ÓÃÄÚ´æºÜ´óµÄ±ä¶¯;ÔÚÉè¼ÆÊ±¿ÉÒÔÀûÓÃÕâÒ»µã¡£

ÀýÈ磬Èç¹ûkeyµÄ³¤¶ÈÈç¹ûÊÇ8¸ö×Ö½Ú£¬ÔòSDSΪ17×Ö½Ú£¬jemalloc·ÖÅä32×Ö½Ú;´Ëʱ½«key³¤¶ÈËõ¼õΪ7¸ö×Ö½Ú£¬ÔòSDSΪ16×Ö½Ú£¬jemalloc·ÖÅä16×Ö½Ú;Ôòÿ¸ökeyËùÕ¼ÓõĿռ䶼¿ÉÒÔËõСһ°ë¡£

(2)ʹÓÃÕûÐÍ/³¤ÕûÐÍ

Èç¹ûÊÇÕûÐÍ/³¤ÕûÐÍ£¬Redis»áʹÓÃintÀàÐÍ(8×Ö½Ú)´æ´¢À´´úÌæ×Ö·û´®£¬¿ÉÒÔ½ÚÊ¡¸ü¶à¿Õ¼ä¡£Òò´ËÔÚ¿ÉÒÔʹÓó¤ÕûÐÍ/ÕûÐÍ´úÌæ×Ö·û´®µÄ³¡¾°Ï£¬¾¡Á¿Ê¹Óó¤ÕûÐÍ/ÕûÐÍ¡£

(3)¹²Ïí¶ÔÏó

ÀûÓù²Ïí¶ÔÏ󣬿ÉÒÔ¼õÉÙ¶ÔÏóµÄ´´½¨(ͬʱ¼õÉÙÁËredisObjectµÄ´´½¨)£¬½ÚÊ¡ÄÚ´æ¿Õ¼ä¡£Ä¿Ç°redisÖеĹ²Ïí¶ÔÏóÖ»°üÀ¨10000¸öÕûÊý(0-9999);¿ÉÒÔͨ¹ýµ÷ÕûREDIS_SHARED_INTEGERS²ÎÊýÌá¸ß¹²Ïí¶ÔÏóµÄ¸öÊý;ÀýÈ罫REDIS_SHARED_INTEGERSµ÷Õûµ½20000£¬Ôò0-19999Ö®¼äµÄ¶ÔÏ󶼿ÉÒÔ¹²Ïí¡£

¿¼ÂÇÕâÑùÒ»ÖÖ³¡¾°£ºÂÛÌ³ÍøÕ¾ÔÚredisÖд洢ÁËÿ¸öÌû×ÓµÄä¯ÀÀÊý£¬¶øÕâЩä¯ÀÀÊý¾ø´ó¶àÊý·Ö²¼ÔÚ0-20000Ö®¼ä£¬Õâʱºòͨ¹ýÊʵ±Ôö´óREDIS_SHARED_INTEGERS²ÎÊý£¬±ã¿ÉÒÔÀûÓù²Ïí¶ÔÏó½ÚÊ¡ÄÚ´æ¿Õ¼ä¡£

(4)±ÜÃâ¹ý¶ÈÉè¼Æ

È»¶øÐèҪעÒâµÄÊÇ£¬²»ÂÛÊÇÄÄÖÖÓÅ»¯³¡¾°£¬¶¼Òª¿¼ÂÇÄÚ´æ¿Õ¼äÓëÉè¼Æ¸´ÔӶȵÄȨºâ;¶øÉè¼Æ¸´ÔÓ¶È»áÓ°Ïìµ½´úÂëµÄ¸´ÔÓ¶È¡¢¿Éά»¤ÐÔ¡£

Èç¹ûÊý¾ÝÁ¿½ÏС£¬ÄÇôΪÁ˽ÚÊ¡ÄÚ´æ¶øÊ¹µÃ´úÂëµÄ¿ª·¢¡¢Î¬»¤±äµÃ¸ü¼ÓÀ§ÄѲ¢²»»®Ëã;»¹ÊÇÒÔÇ°Ãæ½²µ½µÄ90000¸ö¼üÖµ¶ÔΪÀý£¬Êµ¼ÊÉϽÚÊ¡µÄÄÚ´æ¿Õ¼äÖ»Óм¸MB¡£µ«ÊÇÈç¹ûÊý¾ÝÁ¿Óм¸Ç§ÍòÉõÖÁÉÏÒÚ£¬¿¼ÂÇÄÚ´æµÄÓÅ»¯¾Í±È½Ï±ØÒªÁË¡£

3¡¢¹Ø×¢ÄÚ´æË鯬ÂÊ

ÄÚ´æË鯬ÂÊÊÇÒ»¸öÖØÒªµÄ²ÎÊý£¬¶Ôredis ÄÚ´æµÄÓÅ»¯ÓÐÖØÒªÒâÒå¡£

Èç¹ûÄÚ´æË鯬Âʹý¸ß(jemallocÔÚ1.03×óÓұȽÏÕý³£)£¬ËµÃ÷ÄÚ´æË鯬¶à£¬ÄÚ´æÀË·ÑÑÏÖØ;Õâʱ±ã¿ÉÒÔ¿¼ÂÇÖØÆôredis·þÎñ£¬ÔÚÄÚ´æÖжÔÊý¾Ý½øÐÐÖØÅÅ£¬¼õÉÙÄÚ´æË鯬¡£

Èç¹ûÄÚ´æË鯬ÂÊСÓÚ1£¬ËµÃ÷redisÄÚ´æ²»×㣬²¿·ÖÊý¾ÝʹÓÃÁËÐéÄâÄÚ´æ(¼´swap);ÓÉÓÚÐéÄâÄÚ´æµÄ´æÈ¡ËٶȱÈÎïÀíÄÚ´æ²îºÜ¶à(2-3¸öÊýÁ¿¼¶)£¬´ËʱredisµÄ·ÃÎÊËÙ¶È¿ÉÄÜ»á±äµÃºÜÂý¡£Òò´Ë±ØÐëÉè·¨Ôö´óÎïÀíÄÚ´æ(¿ÉÒÔÔö¼Ó·þÎñÆ÷½ÚµãÊýÁ¿£¬»òÌá¸ßµ¥»úÄÚ´æ)£¬»ò¼õÉÙredisÖеÄÊý¾Ý¡£

Òª¼õÉÙredisÖеÄÊý¾Ý£¬³ýÁËÑ¡ÓúÏÊʵÄÊý¾ÝÀàÐÍ¡¢ÀûÓù²Ïí¶ÔÏóµÈ£¬»¹ÓÐÒ»µãÊÇÒªÉèÖúÏÀíµÄÊý¾Ý»ØÊÕ²ßÂÔ(maxmemory-policy)£¬µ±ÄÚ´æ´ïµ½Ò»¶¨Á¿ºó£¬¸ù¾Ý²»Í¬µÄÓÅÏȼ¶¶ÔÄÚ´æ½øÐлØÊÕ¡£

   
2304 ´Îä¯ÀÀ       44
Ïà¹ØÎÄÕÂ

»ùÓÚEAµÄÊý¾Ý¿â½¨Ä£
Êý¾ÝÁ÷½¨Ä££¨EAÖ¸ÄÏ£©
¡°Êý¾Ýºþ¡±£º¸ÅÄî¡¢ÌØÕ÷¡¢¼Ü¹¹Óë°¸Àý
ÔÚÏßÉ̳ÇÊý¾Ý¿âϵͳÉè¼Æ ˼·+Ч¹û
 
Ïà¹ØÎĵµ

GreenplumÊý¾Ý¿â»ù´¡Åàѵ
MySQL5.1ÐÔÄÜÓÅ»¯·½°¸
ijµçÉÌÊý¾ÝÖÐ̨¼Ü¹¹Êµ¼ù
MySQL¸ßÀ©Õ¹¼Ü¹¹Éè¼Æ
Ïà¹Ø¿Î³Ì

Êý¾ÝÖÎÀí¡¢Êý¾Ý¼Ü¹¹¼°Êý¾Ý±ê×¼
MongoDBʵս¿Î³Ì
²¢·¢¡¢´óÈÝÁ¿¡¢¸ßÐÔÄÜÊý¾Ý¿âÉè¼ÆÓëÓÅ»¯
PostgreSQLÊý¾Ý¿âʵսÅàѵ