Ê×Ò³
ѧϰ
»î¶¯
רÇø
¹¤¾ß
TVP
·¢²¼
¾«Ñ¡ÄÚÈÝ/¼¼ÊõÉçȺ/ÓŻݲúÆ·,¾¡ÔÚС³ÌÐò
Á¢¼´Ç°Íù

Ó²ºË¸É»õ£¡7600×Ö´øÄãѧ»á Redis ÐÔÄÜÓÅ»¯µã

ÔÚһЩÍøÂç·þÎñµÄϵͳÖУ¬Redis µÄÐÔÄÜ£¬¿ÉÄÜÊÇ±È MySQL µÈÓ²ÅÌÊý¾Ý¿âµÄÐÔÄܸüÖØÒªµÄ¿ÎÌâ¡£±ÈÈç΢²©£¬°ÑÈȵã΢²©[1]£¬×îеÄÓû§¹Øϵ£¬¶¼´æ´¢ÔÚ Redis ÖУ¬´óÁ¿µÄ²éѯ»÷ÖÐ Redis£¬¶ø²»×ß MySQL¡£

ÄÇô£¬Õë¶Ô Redis ·þÎñ£¬ÎÒÃÇÄÜ×öÄÄЩÐÔÄÜÓÅ»¯ÄØ£¿»òÕß˵£¬Ó¦¸Ã±ÜÃâÄÄЩÐÔÄÜÀË·ÑÄØ£¿

Redis ÐÔÄܵĻù±¾Ãæ

ÔÚÌÖÂÛÓÅ»¯Ö®Ç°£¬ÎÒÃÇÐèÒªÖªµÀ£¬Redis ·þÎñ±¾Éí¾ÍÓÐһЩÌØÐÔ£¬±ÈÈçµ¥Ïß³ÌÔËÐС£³ý·ÇÐÞ¸Ä Redis µÄÔ´´úÂ룬²»È»ÕâЩÌØÐÔ£¬¾ÍÊÇÎÒÃÇ˼¿¼ÐÔÄÜÓÅ»¯µÄ»ù±¾Ãæ¡£

ÄÇô£¬ÓÐÄÄЩ Redis »ù±¾ÌØÐÔÐèÒªÎÒÃÇ¿¼ÂÇÄØ£¿Redis µÄÏîÄ¿½éÉÜÖиÅÀ¨ÁËËüÌØÐÔ£º

Redis is an in-memory database that persists on disk. The data model is key-value, but many different kind of values are supported.

Ê×ÏÈ£¬Redis ʹÓòÙ×÷ϵͳÌṩµÄÐéÄâÄÚ´æÀ´´æ´¢Êý¾Ý¡£¶øÇÒ£¬Õâ¸ö²Ù×÷ϵͳһ°ã¾ÍÊÇÖ¸ Unix¡£Windows ÉÏÒ²ÄÜÔËÐÐ Redis£¬µ«ÊÇÐèÒªÌØÊâ´¦Àí¡£Èç¹ûÄãµÄ²Ù×÷ϵͳʹÓý»»»¿Õ¼ä£¬ÄÇô Redis µÄÊý¾Ý¿ÉÄܻᱻʵ¼Ê±£´æÔÚÓ²ÅÌÉÏ¡£

Æä´Î£¬Redis Ö§³Ö³Ö¾Ã»¯£¬¿ÉÒÔ°ÑÊý¾Ý±£´æÔÚÓ²ÅÌÉÏ¡£ºÜ¶àʱºò£¬ÎÒÃÇҲȷʵÓбØÒª½øÐг־û¯À´ÊµÏÖ±¸·Ý£¬Êý¾Ý»Ö¸´µÈÐèÇó¡£µ«³Ö¾Ã»¯²»»áƾ¿Õ·¢Éú£¬ËüÒ²»áÕ¼ÓÃÒ»²¿·Ö×ÊÔ´¡£

µÚÈý£¬Redis ÊÇÓà key-value µÄ·½Ê½À´¶ÁдµÄ£¬¶ø value ÖÐÓÖ¿ÉÒÔÊǺܶ಻ͬÖÖÀàµÄÊý¾Ý£»¸ü½øÒ»²½£¬Ò»¸öÊý¾ÝÀàÐ͵ĵײ㻹Óб»´æ´¢Îª²»Í¬µÄ½á¹¹¡£²»Í¬µÄ´æ´¢½á¹¹¾ö¶¨ÁËÊý¾ÝÔöɾ¸Ä²éµÄ¸´ÔÓ¶ÈÒÔ¼°ÐÔÄÜ¿ªÏú¡£

×îºó£¬ÔÚÉÏÃæµÄ½éÉÜÖÐûÓÐÌáµ½µÄÊÇ£¬Redis ´ó¶àÊýʱºòÊǵ¥Ïß³ÌÔËÐÐ[2]µÄ£¨single-threaded)£¬¼´Í¬Ò»Ê±¼äÖ»Õ¼ÓÃÒ»¸ö CPU£¬Ö»ÄÜÓÐÒ»¸öÖ¸ÁîÔÚÔËÐУ¬²¢ÐжÁдÊDz»´æÔڵġ£ºÜ¶à²Ù×÷´øÀ´µÄÑÓ³ÙÎÊÌ⣬¶¼¿ÉÒÔÔÚÕâÀïÕÒµ½´ð°¸¡£

¹ØÓÚ×îºóÕâ¸öÌØÐÔ£¬ÎªÊ²Ã´ Redis Êǵ¥Ï̵߳ģ¬È´ÄÜÓкܺõÄÐÔÄÜ(¸ù¾Ý Amdahl¡¯s Law£¬ÓÅ»¯ºÄʱռ±È´óµÄ¹ý³Ì£¬²Å¸üÓÐÒâÒå)£¬Á½¾ä»°¸ÅÀ¨ÊÇ£ºRedis ÀûÓÃÁ˶à· I/O ¸´ÓûúÖÆ[3]£¬´¦Àí¿Í»§¶ËÇëÇóʱ£¬²»»á×èÈûÖ÷Ị̈߳»Redis µ¥´¿Ö´ÐУ¨´ó¶àÊýÖ¸Áһ¸öÖ¸Áî²»µ½ 1 ΢Ãë[4]£¬Èç´Ë£¬µ¥ºË CPU Ò»Ãë¾ÍÄÜ´¦Àí 1 °ÙÍò¸öÖ¸Á´ó¸Å¶ÔӦ׿¸Ê®Íò¸öÇëÇó°É£©£¬Óò»×ÅʵÏÖ¶àỊ̈߳¨ÍøÂç²ÅÊÇÆ¿¾±[5]£©¡£

ÓÅ»¯ÍøÂçÑÓʱ

Redis µÄ¹Ù·½²©¿ÍÔÚ¼¸¸öµØ·½¶¼Ëµ£¬ÐÔÄÜÆ¿¾±¸ü¿ÉÄÜÊÇÍøÂç[6]£¬ÄÇôÎÒÃÇÈçºÎÓÅ»¯ÍøÂçÉϵÄÑÓʱÄØ£¿

Ê×ÏÈ£¬Èç¹ûÄãÃÇʹÓõ¥»ú²¿Êð£¨Ó¦Ó÷þÎñºÍ Redis ÔÚͬһ̨»úÆ÷ÉÏ£©µÄ»°£¬Ê¹Óà Unix ½ø³Ì¼äͨѶÀ´ÇëÇó Redis ·þÎñ£¬ËÙ¶È±È localhost ¾ÖÓòÍø£¨Ñ§Ãû loopback£©¸ü¿ì¡£¹Ù·½Îĵµ[7]ÊÇÕâô˵µÄ£¬ÏëÒ»Ï룬ÀíÂÛÉÏÒ²Ó¦¸ÃÊÇÕâÑùµÄ¡£

µ«ºÜ¶à¹«Ë¾µÄÒµÎñ¹æÄ£²»Êǵ¥»ú²¿ÊðÄÜÖ§³ÅµÄ£¬ËùÒÔ»¹ÊǵÃÓà TCP¡£

Redis ¿Í»§¶ËºÍ·þÎñÆ÷µÄͨѶһ°ãʹÓà TCP ³¤Á´½Ó¡£Èç¹û¿Í»§¶Ë·¢ËÍÇëÇóºóÐèÒªµÈ´ý Redis ·µ»Ø½á¹ûÔÙ·¢ËÍÏÂÒ»¸öÖ¸Á¿Í»§¶ËºÍ Redis µÄ¶à¸öÇëÇó¾Í¹¹³ÉÏÂÃæµÄ¹Øϵ£º

£¨±¸×¢£ºÈç¹û²»ÊÇÄãÒª·¢Ë굀 key Ìر𳤣¬Ò»¸ö TCP °üÍêÈ«ÄÜ·ÅÏ Redis Ö¸ÁËùÒÔÖ»»­ÁËÒ»¸ö push °ü£©

ÕâÑùÕâÁ½´ÎÇëÇóÖУ¬¿Í»§¶Ë¶¼ÐèÒª¾­ÀúÒ»¶ÎÍøÂç´«Êäʱ¼ä¡£

µ«Èç¹ûÓпÉÄÜ£¬ÍêÈ«¿ÉÒÔʹÓà multi-key ÀàµÄÖ¸ÁîÀ´ºÏ²¢ÇëÇ󣬱ÈÈçÁ½¸ö?GET key¿ÉÒÔÓÃMGET key1 key2ºÏ²¢¡£ÕâÑùÔÚʵ¼ÊͨѶÖУ¬ÇëÇóÊýÒ²¼õÉÙÁË£¬ÑÓʱ×ÔÈ»µÃµ½ºÃת¡£

Èç¹û²»ÄÜÓà multi-key Ö¸ÁîÀ´ºÏ²¢£¬±ÈÈçÒ»¸ö?SET£¬Ò»¸öGETÎÞ·¨ºÏ²¢¡£Ôõô°ì£¿

Redis ÖÐÓÐÖÁÉÙÕâÑùÁ½¸ö·½·¨Äܺϲ¢¶à¸öÖ¸Áîµ½Ò»¸ö request ÖУ¬Ò»¸öÊÇ?MULTI/EXEC£¬Ò»¸öÊÇ script¡£Ç°Õß±¾À´Êǹ¹½¨ Redis ÊÂÎñµÄ·½·¨£¬µ«È·Êµ¿ÉÒԺϲ¢¶à¸öÖ¸ÁîΪһ¸ö request£¬Ëüµ½Í¨Ñ¶¹ý³ÌÈçÏ¡£ÖÁÓÚ script£¬×îºÃÀûÓûº´æ½Å±¾µÄ sha1 hash key À´µ÷Æð½Å±¾£¬ÕâÑùͨѶÁ¿¸üС¡£

ÕâÑùȷʵ¸üÄܼõÉÙÍøÂç´«Êäʱ¼ä£¬²»ÊÇô£¿µ«Èç´ËÒÔÀ´£¬¾Í±ØÐëÒªÇóÕâ¸ö transaction / script ÖÐÉæ¼°µÄ key ÔÚͬһ¸ö node ÉÏ£¬ËùÒÔÒª×ÃÇ鿼ÂÇ¡£

Èç¹ûÉÏÃæµÄ·½·¨ÎÒÃǶ¼¿¼ÂǹýÁË£¬»¹ÊÇûÓа취ºÏ²¢¶à¸öÇëÇó£¬ÎÒÃÇ»¹¿ÉÒÔ¿¼ÂǺϲ¢¶à¸ö responses¡£±ÈÈç°Ñ 2 ¸ö»Ø¸´ÐÅÏ¢ºÏ²¢£º

ÕâÑù£¬ÀíÂÛÉÏ¿ÉÒÔÊ¡È¥ 1 ´Î»Ø¸´ËùÓõÄÍøÂç´«Êäʱ¼ä¡£Õâ¾ÍÊÇ pipeline ×öµÄÊÂÇé¡£¾Ù¸ö ruby ¿Í»§¶ËʹÓà pipeline µÄÀý×Ó£º

´úÂëÓïÑÔ£ºjavascript
¸´ÖÆ
require?'redis'?@redis?=?Redis.new?@redis.pipelined?do?@redis.get?'key1'?@redis.set?'key2'?'some?value'?end?#?=>?[1,?2]?

¾Ý˵£¬ÓÐЩÓïÑԵĿͻ§¶Ë£¬ÉõÖÁĬÈϾÍʹÓà pipeline À´ÓÅ»¯ÑÓʱÎÊÌ⣬±ÈÈç node_redis¡£

ÁíÍ⣬²»ÊÇÈÎÒâ¶à¸ö»Ø¸´ÐÅÏ¢¶¼¿ÉÒԷŽøÒ»¸ö TCP °üÖУ¬Èç¹ûÇëÇóÊýÌ«¶à£¬»Ø¸´µÄÊý¾ÝºÜ³¤£¨±ÈÈç get Ò»¸ö³¤×Ö·û´®£©£¬TCP »¹ÊÇ»á·Ö°ü´«Ê䣬µ«Ê¹Óà pipeline£¬ÒÀÈ»¿ÉÒÔ¼õÉÙ´«Êä´ÎÊý¡£

pipeline ºÍÉÏÃæµÄÆäËû·½·¨¶¼²»Ò»ÑùµÄÊÇ£¬Ëü²»¾ßÓÐÔ­×ÓÐÔ¡£ËùÒÔÔÚ cluster ״̬ϵļ¯ÈºÉÏ£¬ÊµÏÖ pipeline ±ÈÄÇЩԭ×ÓÐԵķ½·¨¸üÓпÉÄÜ¡£

С½áһϣº

  1. ʹÓà unix ½ø³Ì¼äͨÐÅ£¬Èç¹ûµ¥»ú²¿Êð
  2. ʹÓà multi-key Ö¸ÁîºÏ²¢¶à¸öÖ¸Á¼õÉÙÇëÇóÊý£¬Èç¹ûÓпÉÄܵĻ°
  3. ʹÓà transaction¡¢script ºÏ²¢ requests ÒÔ¼° responses
  4. ʹÓà pipeline ºÏ²¢ response

¾¯ÌèÖ´ÐÐʱ¼ä³¤µÄ²Ù×÷

ÔÚ´óÊý¾ÝÁ¿µÄÇé¿öÏ£¬ÓÐЩ²Ù×÷µÄÖ´ÐÐʱ¼ä»áÏà¶Ô³¤£¬±ÈÈç?KEYS *£¬LRANGE mylist 0 -1£¬ÒÔ¼°ÆäËûËã·¨¸´ÔÓ¶ÈΪ O(n) µÄÖ¸Áî¡£ÒòΪ Redis Ö»ÓÃÒ»¸öÏß³ÌÀ´×öÊý¾Ý²éѯ£¬Èç¹ûÕâЩָÁîºÄʱºÜ³¤£¬¾Í»á×èÈû Redis£¬Ôì³É´óÁ¿ÑÓʱ¡£

¾¡¹Ü¹Ù·½ÎĵµÖÐ˵?KEYS *µÄ²éѯͦ¿ìµÄ£¬£¨ÔÚÆÕͨ±Ê¼Ç±¾ÉÏ£©É¨Ãè 1 °ÙÍò¸ö key£¬Ö»Ðè 40 ºÁÃë(²Î¼û£ºhttps://redis.io/commands/keys)£¬µ«¼¸Ê® ms ¶ÔÓÚÒ»¸öÐÔÄÜÒªÇóºÜ¸ßµÄϵͳÀ´Ëµ£¬ÒѾ­²»¶ÌÁË£¬¸üºÎ¿öÈç¹ûÓм¸ÒÚ¸ö key£¨Ò»Ì¨»úÆ÷ÍêÈ«¿ÉÄܴ漸ÒÚ¸ö key£¬±ÈÈçÒ»¸ö key 100×Ö½Ú£¬1 ÒÚ¸ö key Ö»ÓÐ 10GB£©£¬Ê±¼ä¸ü³¤¡£

ËùÒÔ£¬¾¡Á¿²»ÒªÔÚÉú²ú»·¾³µÄ´úÂëʹÓÃÕâЩִÐкÜÂýµÄÖ¸ÁÕâÒ»µã Redis µÄ×÷ÕßÔÚ²©¿Í[8]ÖÐÒ²Ìáµ½ÁË¡£ÁíÍ⣬ÔËάͬѧ²éѯ Redis µÄʱºòÒ²¾¡Á¿²»ÒªÓá£ÉõÖÁ£¬Redis Essential Õâ±¾Ê齨ÒéÀûÓÃrename-command KEYS ''À´½ûֹʹÓÃÕâ¸öºÄʱµÄÖ¸Áî¡£

³ýÁËÕâЩºÄʱµÄÖ¸ÁRedis ÖÐ transaction£¬script£¬ÒòΪ¿ÉÒԺϲ¢¶à¸ö commands Ϊһ¸ö¾ßÓÐÔ­×ÓÐÔµÄÖ´Ðйý³Ì£¬ËùÒÔÒ²¿ÉÄÜÕ¼Óà Redis ºÜ³¤Ê±¼ä£¬ÐèҪעÒâ¡£

Èç¹ûÄãÏëÕÒ³öÉú²ú»·¾³Ê¹Óõġ¸ÂýÖ¸Á£¬ÄÇô¿ÉÒÔÀûÓÃ?SLOWLOG GET countÀ´²é¿´×î½üµÄ count ¸öÖ´ÐÐʱ¼äºÜ³¤µÄÖ¸Áî¡£ÖÁÓڶ೤Ë㳤£¬¿ÉÒÔͨ¹ýÔÚ redis.conf ÖÐÉèÖà slowlog-log-slower-than À´¶¨Òå¡£

³ý´ËÖ®Í⣬ÔںܶàµØ·½¶¼Ã»ÓÐÌáµ½µÄÒ»¸ö¿ÉÄܵÄÂýÖ¸ÁîÊÇ?DEL£¬µ« redis.conf ÎļþµÄ×¢ÊÍ[9]Öе¹ÊÇ˵ÁË¡£³¤»°¶Ì˵¾ÍÊÇ DEL Ò»¸ö´óµÄ object ʱºò£¬»ØÊÕÏàÓ¦µÄÄÚ´æ¿ÉÄÜ»áÐèÒªºÜ³¤Ê±¼ä£¨ÉõÖÁ¼¸Ã룩£¬ËùÒÔ£¬½¨ÒéÓà DEL µÄÒì²½°æ±¾£ºUNLINK¡£ºóÕß»áÆô¶¯Ò»¸öÐ嵀 thread À´É¾³ýÄ¿±ê key£¬¶ø²»×èÈûÔ­À´µÄÏ̡߳£

¸ü½øÒ»²½£¬µ±Ò»¸ö key ¹ýÆÚÖ®ºó£¬Redis Ò»°ãÒ²ÐèҪͬ²½µÄ°ÑËüɾ³ý¡£ÆäÖÐÒ»ÖÖɾ³ý keys µÄ·½Ê½ÊÇ£¬Ã¿Ãë 10 ´ÎµÄ¼ì²éÒ»´ÎÓÐÉèÖùýÆÚʱ¼äµÄ keys£¬ÕâЩ keys ´æ´¢ÔÚÒ»¸öÈ«¾ÖµÄ struct ÖУ¬¿ÉÒÔÓÃ?server.db->expires·ÃÎÊ¡£¼ì²éµÄ·½Ê½ÊÇ£º

  1. ´ÓÖÐËæ»úÈ¡³ö 20 ¸ö keys
  2. °Ñ¹ýÆÚµÄɾµô¡£
  3. Èç¹û¸Õ¸Õ 20 ¸ö keys ÖУ¬ÓÐ 25% ÒÔÉÏ£¨Ò²¾ÍÊÇ 5 ¸öÒÔÉÏ£©¶¼ÊǹýÆڵģ¬Redis ÈÏΪ£¬¹ýÆÚµÄ keys »¹Í¦¶àµÄ£¬¼ÌÐøÖظ´²½Öè 1£¬Ö±µ½Âú×ãÍ˳öÌõ¼þ£ºÄ³´ÎÈ¡³öµÄ keys ÖÐûÓÐÄÇô¶à¹ýÈ¥µÄ keys¡£

ÕâÀï¶ÔÓÚÐÔÄܵÄÓ°ÏìÊÇ£¬Èç¹ûÕæµÄÓкܶàµÄ keys ÔÚͬһʱ¼ä¹ýÆÚ£¬ÄÇô Redis ÕæµÄ»áһֱѭ»·Ö´ÐÐɾ³ý£¬Õ¼ÓÃÖ÷Ï̡߳£

¶Ô´Ë£¬Redis ×÷ÕߵĽ¨Òé[10]ÊǾ¯ÌèEXPIREATÕâ¸öÖ¸ÁÒòΪËü¸üÈÝÒײúÉú keys ͬʱ¹ýÆÚµÄÏÖÏó¡£ÎÒ»¹¼ûµ½¹ýһЩ½¨ÒéÊǸø keys µÄ¹ýÆÚʱ¼äÉèÖÃÒ»¸öËæ»ú²¨¶¯Á¿¡£×îºó£¬redis.conf ÖÐÒ²¸ø³öÁËÒ»¸ö·½·¨£¬°Ñ keys µÄ¹ýÆÚɾ³ý²Ù×÷±äΪÒì²½µÄ£¬¼´£¬ÔÚ redis.conf ÖÐÉèÖÃlazyfree-lazy-expire yes¡£

ÓÅ»¯Êý¾Ý½á¹¹¡¢Ê¹ÓÃÕýÈ·µÄËã·¨

Ò»ÖÖÊý¾ÝÀàÐÍ£¨±ÈÈç string£¬list£©½øÐÐÔöɾ¸Ä²éµÄЧÂÊÊÇÓÉÆäµ×²ãµÄ´æ´¢½á¹¹¾ö¶¨µÄ¡£

ÎÒÃÇÔÚʹÓÃÒ»ÖÖÊý¾ÝÀàÐÍʱ£¬¿ÉÒÔÊʵ±¹Ø×¢Ò»ÏÂËüµ×²ãµÄ´æ´¢½á¹¹¼°ÆäËã·¨£¬±ÜÃâʹÓø´ÔÓ¶ÈÌ«¸ßµÄ·½·¨¡£¾ÙÁ½¸öÀý×Ó£º

  1. ZADDµÄʱ¼ä¸´ÔÓ¶ÈÊÇ O(log(N))£¬Õâ±ÈÆäËûÊý¾ÝÀàÐÍÔö¼ÓÒ»¸öÐÂÔªËصIJÙ×÷¸ü¸´ÔÓ£¬ËùÒÔҪСÐÄʹÓá£
  2. Èô Hash ÀàÐ͵ÄÖµµÄ fields ÊýÁ¿ÓÐÏÞ£¬ËüºÜÓпÉÄܲÉÓà ziplist ÕâÖֽṹ×ö´æ´¢£¬¶ø ziplist µÄ²éѯЧÂÊ¿ÉÄÜûÓÐͬµÈ×Ö¶ÎÊýÁ¿µÄ hashtable ЧÂʸߣ¬ÔÚ±ØҪʱ£¬¿ÉÒÔµ÷Õû Redis µÄ´æ´¢½á¹¹¡£

³ýÁËʱ¼äÐÔÄÜÉϵĿ¼ÂÇ£¬ÓÐʱºòÎÒÃÇ»¹ÐèÒª½ÚÊ¡´æ´¢¿Õ¼ä¡£±ÈÈçÉÏÃæÌáµ½µÄ ziplist ½á¹¹£¬¾Í±È hashtable ½á¹¹½ÚÊ¡´æ´¢¿Õ¼ä£¨Redis Essentials µÄ×÷Õß·Ö±ðÔÚ hashtable ºÍ ziplist ½á¹¹µÄ Hash ÖвåÈë 500 ¸ö fields£¬Ã¿¸ö field ºÍ value ¶¼ÊÇÒ»¸ö 15 λ×óÓÒµÄ×Ö·û´®£¬½á¹ûÊÇ hashtable ½á¹¹Ê¹ÓõĿռäÊÇ ziplist µÄ 4 ±¶¡££©¡£µ«½ÚÊ¡¿Õ¼äµÄÊý¾Ý½á¹¹£¬ÆäËã·¨µÄ¸´ÔӶȿÉÄܸܺߡ£ËùÒÔ£¬ÕâÀï¾ÍÐèÒªÔÚ¾ßÌåÎÊÌâÃæÇ°×ö³öȨºâ¡£»¶Ó­¹Ø×¢¹«ÖںţºÖìСØ˵IJ©¿Í£¬»Ø¸´£º1024£¬¿ÉÒÔÁìÈ¡redisרÊô×ÊÁÏ¡£

ÈçºÎ×ö³ö¸üºÃµÄȨºâ£¿ÎÒ¾õµÃµÃÉîÍÚ Redis µÄ´æ´¢½á¹¹²ÅÄÜÈÃ×Ô¼º°²ÐÄ¡£Õâ·½ÃæµÄÄÚÈÝÎÒÃÇÏ´ÎÔÙ˵¡£

ÒÔÉÏÕâÈýµã¶¼ÊDZà³Ì²ãÃæµÄ¿¼ÂÇ£¬Ð´³ÌÐòʱӦ¸Ã×¢Òâ°¡¡£ÏÂÃæÕ⼸µã£¬Ò²»áÓ°Ïì Redis µÄÐÔÄÜ£¬µ«½â¾öÆðÀ´£¬¾Í²»Ö»ÊÇ¿¿´úÂë²ãÃæµÄµ÷ÕûÁË£¬»¹ÐèÒª¼Ü¹¹ºÍÔËάÉϵĿ¼ÂÇ¡£

¿¼ÂDzÙ×÷ϵͳºÍÓ²¼þÊÇ·ñÓ°ÏìÐÔÄÜ

Redis ÔËÐеÄÍⲿ»·¾³£¬Ò²¾ÍÊDzÙ×÷ϵͳºÍÓ²¼þÏÔȻҲ»áÓ°Ïì Redis µÄÐÔÄÜ¡£ÔÚ¹Ù·½ÎĵµÖУ¬¾Í¸ø³öÁËһЩÀý×Ó£º

  1. CPU£ºIntel ¶àÖÖ CPU ¶¼±È AMD ð©ÁúϵÁкÃ
  2. ÐéÄ⻯£ºÊµÌå»ú±ÈÐéÄâ»úºÃ£¬Ö÷ÒªÊÇÒòΪ²¿·ÖÐéÄâ»úÉÏ£¬Ó²Å̲»ÊDZ¾µØÓ²ÅÌ£¬¼à¿ØÈí¼þµ¼Ö fork Ö¸ÁîµÄËÙ¶ÈÂý£¨³Ö¾Ã»¯Ê±»áÓõ½ fork£©£¬ÓÈÆäÊÇÓà Xen À´×öÐéÄ⻯ʱ¡£
  3. ÄÚ´æ¹ÜÀí£ºÔÚ linux ²Ù×÷ϵͳÖУ¬ÎªÁËÈà translation lookaside buffer£¬¼´ TLB£¬Äܹ»¹ÜÀí¸ü¶àÄÚ´æ¿Õ¼ä£¨TLB Ö»ÄÜ»º´æÓÐÏÞ¸ö page£©£¬²Ù×÷ϵͳ°ÑһЩ memory page ±äµÃ¸ü´ó£¬±ÈÈç 2MB »òÕß 1GB£¬¶ø²»ÊÇͨ³£µÄ 4096 ×Ö½Ú£¬ÕâЩ´óµÄÄÚ´æÒ³½Ð×ö huge pages¡£Í¬Ê±£¬ÎªÁË·½±ã³ÌÐòԱʹÓÃÕâЩ´óµÄÄÚ´æ page£¬²Ù×÷ϵͳÖÐʵÏÖÁËÒ»¸ö transparent huge pages£¨THP£©»úÖÆ£¬Ê¹µÃ´óÄÚ´æÒ³¶ÔËûÃÇÀ´ËµÊÇ͸Ã÷µÄ£¬¿ÉÒÔÏñʹÓÃÕý³£µÄÄÚ´æ page Ò»ÑùʹÓÃËûÃÇ¡£µ«ÕâÖÖ»úÖƲ¢²»ÊÇÊý¾Ý¿âËùÐèÒªµÄ£¬¿ÉÄÜÊÇÒòΪ THP »á°ÑÄÚ´æ¿Õ¼ä±äµÃ½ô´Õ¶øÁ¬Ðø°É£¬¾ÍÏñmongodb µÄÎĵµ[11]ÖÐÃ÷ȷ˵µÄ£¬Êý¾Ý¿âÐèÒªµÄÊÇÏ¡ÊèµÄÄÚ´æ¿Õ¼ä£¬ËùÒÔÇë½ûµô THP ¹¦ÄÜ¡£Redis Ò²²»ÀýÍ⣬µ« Redis ¹Ù·½²©¿ÍÉϸø³öµÄÀíÓÉÊÇ£ºÊ¹ÓôóÄÚ´æ page »áʹ bgsave ʱ£¬fork µÄËٶȱäÂý£»Èç¹û fork Ö®ºó£¬ÕâЩÄÚ´æ page ÔÚÔ­½ø³ÌÖб»ÐÞ¸ÄÁË£¬ËûÃǾÍÐèÒª±»¸´ÖÆ£¨¼´ copy on write£©£¬ÕâÑùµÄ¸´ÖÆ»áÏûºÄ´óÁ¿µÄÄڴ棨±Ï¾¹£¬È˼ÒÊÇ huge pages£¬¸´ÖÆÒ»·ÝÏûºÄ³É±¾ºÜ´ó£©¡£ËùÒÔ£¬Çë½ûÖ¹µô²Ù×÷ϵͳÖÐµÄ transparent huge pages ¹¦ÄÜ¡£
  4. ½»»»¿Õ¼ä£ºµ±Ò»Ð©ÄÚ´æ page ±»´æ´¢ÔÚ½»»»¿Õ¼äÎļþÉÏ£¬¶ø Redis ÓÖÒªÇëÇóÄÇЩÊý¾Ý£¬ÄÇô²Ù×÷ϵͳ»á×èÈû Redis ½ø³Ì£¬È»ºó°ÑÏëÒªµÄ page£¬´Ó½»»»¿Õ¼äÖÐÄóöÀ´£¬·Å½øÄÚ´æ¡£ÕâÆäÖÐÉæ¼°Õû¸ö½ø³ÌµÄ×èÈû£¬ËùÒÔ¿ÉÄÜ»áÔì³ÉÑÓʱÎÊÌ⣬һ¸ö½â¾ö·½·¨ÊǽûֹʹÓý»»»¿Õ¼ä£¨Redis Essentials ÖÐÈçÊǽ¨Ò飬Èç¹ûÄÚ´æ¿Õ¼ä²»×㣬ÇëÓñðµÄ·½·¨´¦Àí£©¡£

¿¼Âdz־û¯´øÀ´µÄ¿ªÏú

Redis µÄÒ»ÏîÖØÒª¹¦ÄܾÍÊdz־û¯£¬Ò²¾ÍÊÇ°ÑÊý¾Ý¸´ÖƵ½Ó²ÅÌÉÏ¡£»ùÓڳ־û¯£¬²ÅÓÐÁË Redis µÄÊý¾Ý»Ö¸´µÈ¹¦ÄÜ¡£

µ«Î¬»¤Õâ¸ö³Ö¾Ã»¯µÄ¹¦ÄÜ£¬Ò²ÊÇÓÐÐÔÄÜ¿ªÏúµÄ¡£

Ê×ÏÈ˵£¬RDB È«Á¿³Ö¾Ã»¯¡£

ÕâÖֳ־û¯·½Ê½°Ñ Redis ÖеÄÈ«Á¿Êý¾Ý´ò°ü³É rdb Îļþ·ÅÔÚÓ²ÅÌÉÏ¡£µ«ÊÇÖ´ÐÐ RDB ³Ö¾Ã»¯¹ý³ÌµÄÊÇÔ­½ø³Ì fork ³öÀ´Ò»¸ö×Ó½ø³Ì£¬¶ø fork Õâ¸öϵͳµ÷ÓÃÊÇÐèҪʱ¼äµÄ£¬¸ù¾ÝRedis Lab 6 ÄêÇ°×öµÄʵÑé[12]£¬ÔÚһ̨ÐÂÐ굀 AWS EC2 m1.small^13 ÉÏ£¬fork Ò»¸öÄÚ´æÕ¼Óà 1GB µÄ Redis ½ø³Ì£¬ÐèÒª 700+ ºÁÃ룬¶øÕâ¶Îʱ¼ä£¬redis ÊÇÎÞ·¨´¦ÀíÇëÇóµÄ¡£

ËäÈ»ÏÖÔڵĻúÆ÷Ó¦¸Ã¶¼»á±ÈÄǸöʱºòºÃ£¬µ«ÊÇ fork µÄ¿ªÏúÒ²Ó¦¸Ã¿¼ÂÇ°É¡£Îª´Ë£¬ÒªÊ¹ÓúÏÀíµÄ RDB ³Ö¾Ã»¯µÄʱ¼ä¼ä¸ô£¬²»ÒªÌ«Æµ·±¡£

½ÓÏÂÀ´£¬ÎÒÃÇ¿´ÁíÍâÒ»Öֳ־û¯·½Ê½£ºAOF ÔöÁ¿³Ö¾Ã»¯¡£

ÕâÖֳ־û¯·½Ê½»á°ÑÄã·¢µ½ redis server µÄÖ¸ÁîÒÔÎı¾µÄÐÎʽ±£´æÏÂÀ´£¨¸ñʽ×ñÑ­ redis protocol£©£¬Õâ¸ö¹ý³ÌÖУ¬»áµ÷ÓÃÁ½¸öϵͳµ÷Óã¬Ò»¸öÊÇ?write(2)£¬Í¬²½Íê³É£¬Ò»¸öÊÇfsync(2)£¬Òì²½Íê³É¡£

ÕâÁ½²¿¶¼¿ÉÄÜÊÇÑÓʱÎÊÌâµÄÔ­Òò£º

  1. write ¿ÉÄÜ»áÒòΪÊä³öµÄ buffer ÂúÁË£¬»òÕß kernal ÕýÔÚ°Ñ buffer ÖеÄÊý¾Ýͬ²½µ½Ó²ÅÌ£¬¾Í±»×èÈûÁË¡£
  2. fsync µÄ×÷ÓÃÊÇÈ·±£ write дÈëµ½ aof ÎļþµÄÊý¾ÝÂäµ½ÁËÓ²ÅÌÉÏ£¬ÔÚÒ»¸ö 7200 ת/·ÖµÄÓ²ÅÌÉÏ¿ÉÄÜÒªÑÓʱ 20 ºÁÃë×óÓÒ£¬ÏûºÄ»¹ÊÇͦ´óµÄ¡£¸üÖØÒªµÄÊÇ£¬ÔÚ fsync ½øÐеÄʱºò£¬write ¿ÉÄܻᱻ×èÈû¡£

ÆäÖУ¬write µÄ×èÈûòËÆÖ»ÄܽÓÊÜ£¬ÒòΪûÓиüºÃµÄ·½·¨°ÑÊý¾Ýдµ½Ò»¸öÎļþÖÐÁË¡£µ«¶ÔÓÚ fsync£¬Redis ÔÊÐíÈýÖÖÅäÖã¬Ñ¡ÓÃÄÄÖÖÈ¡¾öÓÚÄã¶Ô±¸·Ý¼°Ê±ÐÔºÍÐÔÄܵÄƽºâ£º

  1. always£ºµ±°Ñ appendfsync ÉèÖÃΪ always£¬fsync »áºÍ¿Í»§¶ËµÄÖ¸Áîͬ²½Ö´ÐУ¬Òò´Ë×î¿ÉÄÜÔì³ÉÑÓʱÎÊÌ⣬µ«±¸·Ý¼°Ê±ÐÔ×îºÃ¡£
  2. everysec£ºÃ¿ÃëÖÓÒì²½Ö´ÐÐÒ»´Î fsync£¬´Ëʱ redis µÄÐÔÄܱíÏÖ»á¸üºÃ£¬µ«ÊÇ fsync ÒÀÈ»¿ÉÄÜ×èÈû write£¬ËãÊÇÒ»¸öÕÛÖÐÑ¡Ôñ¡£
  3. no£ºredis ²»»áÖ÷¶¯³ö·¢ fsync £¨²¢²»ÊÇÓÀÔ¶²» fsync£¬ÄÇÊDz»Ì«¿ÉÄܵģ©£¬¶øÓÉ kernel ¾ö¶¨ºÎʱ fsync

ʹÓ÷ֲ¼Ê½¼Ü¹¹ ¡ª¡ª ¶Áд·ÖÀë¡¢Êý¾Ý·ÖƬ

ÒÔÉÏ£¬ÎÒÃǶ¼ÊÇ»ùÓÚµ¥Ì¨£¬»òÕßµ¥¸ö Redis ·þÎñ½øÐÐÓÅ»¯¡£ÏÂÃ棬ÎÒÃÇ¿¼Âǵ±ÍøÕ¾µÄ¹æÄ£±ä´óʱ£¬ÀûÓ÷ֲ¼Ê½¼Ü¹¹À´±£ÕÏ Redis ÐÔÄܵÄÎÊÌâ¡£

Ê×ÏÈ˵£¬ÄÄЩÇé¿öϲ»µÃ²»£¨»òÕß×îºÃ£©Ê¹Ó÷ֲ¼Ê½¼Ü¹¹£º

  1. Êý¾ÝÁ¿ºÜ´ó£¬µ¥Ì¨·þÎñÆ÷ÄÚ´æ²»¿ÉÄÜ×°µÃÏ£¬±ÈÈç 1 ¸ö T ÕâÖÖÁ¿¼¶
  2. ÐèÒª·þÎñ¸ß¿ÉÓÃ
  3. µ¥Ì¨µÄÇëÇóѹÁ¦¹ý´ó

½â¾öÕâЩÎÊÌâ¿ÉÒÔ²ÉÓÃÊý¾Ý·ÖƬ»òÕßÖ÷´Ó·ÖÀ룬»òÕßÁ½Õ߶¼Ó㨼´£¬ÔÚ·ÖƬÓÃµÄ cluster ½ÚµãÉÏ£¬Ò²ÉèÖÃÖ÷´Ó½á¹¹£©¡£

ÕâÑùµÄ¼Ü¹¹£¬¿ÉÒÔΪÐÔÄÜÌáÉý¼ÓÈëеÄÇÐÈëµã£º

  1. °ÑÂýËÙµÄÖ¸Áî·¢µ½Ä³Ð©´Ó¿âÖÐÖ´ÐÐ
  2. °Ñ³Ö¾Ã»¯¹¦ÄÜ·ÅÔÚÒ»¸öºÜÉÙʹÓõĴӿâÉÏ
  3. °ÑijЩ´ó list ·ÖƬ

ÆäÖÐÇ°Á½Ìõ¶¼ÊǸù¾Ý Redis µ¥Ï̵߳ÄÌØÐÔ£¬ÓÃÆäËû½ø³Ì£¨ÉõÖÁ»úÆ÷£©×öÐÔÄܲ¹³äµÄ·½·¨¡£

µ±È»£¬Ê¹Ó÷ֲ¼Ê½¼Ü¹¹£¬Ò²¿ÉÄܶÔÐÔÄÜÓÐÓ°Ï죬±ÈÈçÇëÇóÐèÒª±»×ª·¢£¬Êý¾ÝÐèÒª±»²»¶Ï¸´ÖÆ·Ö·¢¡££¨´ý²é£©

  • ·¢±íÓÚ:
  • Ô­ÎÄÁ´½Ó£ºhttp://news.51cto.com/art/202005/616093.htm
  • ÈçÓÐÇÖȨ£¬ÇëÁªÏµ cloudcommunity@tencent.com ɾ³ý¡£

ɨÂë

Ìí¼ÓÕ¾³¤ ½ø½»Á÷Ⱥ

ÁìȡרÊô 10ÔªÎÞÃż÷ȯ

˽Ïí×îР¼¼Êõ¸É»õ

ɨÂë¼ÓÈ뿪·¢ÕßÉçȺ
Áìȯ
http://www.vxiaotou.com