±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚ±à³ÌÃÔ˼²©¿ÍÔ°,Ö÷Òª½éÉÜ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ÃüÁî¿ÉÒԲ鿴ÄÚ´æÊ¹ÓÃÇé¿ö£º

¿ÉÄÜÊÇĿǰ×îÏêϸµÄ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)£¬µ±ÄÚ´æ´ïµ½Ò»¶¨Á¿ºó£¬¸ù¾Ý²»Í¬µÄÓÅÏȼ¶¶ÔÄÚ´æ½øÐлØÊÕ¡£ |