±à¼ÍƼö: |
±¾ÎÄÖ÷Òª½éÉÜÁËÊÂÎñÊÇʲô?ÊÂÎñµÄÌØÐÔ¡¢ÎªÊ²Ã´Ê¹ÓÃÊÂÎñÒÔ¼°Ê¹ÓÃÊÂÎñµÄÕû¸öÁ÷³Ì¡£
±¾ÎÄÀ´×Ô²©¿ÍÔ°£¬ÓÉ»ðÁú¹ûÈí¼þAnna±à¼¡¢ÍƼö¡£
|
|
ÊÂÎñ
ÊÂÎñÖ¸µÄ³ÌÐòÖÐһϵÁÐÑÏÃܵÄÂß¼²Ù×÷£¬ÆäÖаüº¬µÄ²Ù×÷±ØÐëÒªÍê³É£¬·ñÔòÔÚÿ¸ö²Ù×÷Öеĸü¸Ä¶¼»á±»³·Ïú¡£
¾Ù¸ö¼òµ¥µÄÀý×Ó£ºÒ»ÈºÑ¼×Ó¹ýºÓ£¬ÒªÃ´¶¼¹ýÈ¥£¬ÒªÃ´¶¼²»¹ýÈ¥¡£
ÊÂÎñµÄÌØÐÔ
Ô×ÓÐÔ£¨Atomicity£©£º²Ù×÷ÕâЩָÁîʱ£¬ÒªÃ´È«²¿Ö´Ðгɹ¦£¬ÒªÃ´È«²¿²»Ö´ÐС£Ö»ÒªÆäÖÐÒ»¸öÖ¸ÁîÖ´ÐÐʧ°Ü£¬ËùÓеÄÖ¸Áî¶¼Ö´ÐÐʧ°Ü£¬Êý¾Ý½øÐлعö£¬»Øµ½Ö´ÐÐÖ¸ÁîǰµÄÊý¾Ý״̬¡£
Ò»ÖÂÐÔ£¨Consistency£©£ºÊÂÎñµÄÖ´ÐÐʹÊý¾Ý´ÓÒ»¸ö״̬ת»»ÎªÁíÒ»¸ö״̬£¬µ«ÊǶÔÓÚÕû¸öÊý¾ÝµÄÍêÕûÐÔ±£³ÖÎȶ¨¡££¨¿ÉÀí½âΪ£º¼´AÕË»§Ö»Òª¼õÈ¥ÁË100£¬BÕË»§Ôò±Ø¶¨¼ÓÉÏÁË100£©
¸ôÀëÐÔ£¨Isolation£©£º¸ôÀëÐÔÊǵ±¶à¸öÓû§²¢·¢·ÃÎÊÊý¾Ý¿âʱ£¬±ÈÈç²Ù×÷ͬһÕűíʱ£¬Êý¾Ý¿âΪÿһ¸öÓû§¿ªÆôµÄÊÂÎñ£¬²»Äܱ»ÆäËûÊÂÎñµÄ²Ù×÷Ëù¸ÉÈÅ£¬¶à¸ö²¢·¢ÊÂÎñÖ®¼äÒªÏ໥¸ôÀë¡£
³Ö¾ÃÐÔ£¨Durability£©£ºµ±ÊÂÎñÕýÈ·Íê³Éºó£¬Ëü¶ÔÓÚÊý¾ÝµÄ¸Ä±äÊÇÓÀ¾ÃÐԵġ£
ΪʲôʹÓÃÊÂÎñ
ÔÚ´«Í³µÄ¹ØÏµÐÍÊý¾Ý¿âÖУ¬³£³£Ê¹ÓÃÊÂÎñµÄACID ÐÔÖÊÀ´±£Ö¤Êý¾ÝµÄÒ»ÖÂÐÔ¡¢ÍêÕûÐÔ¡£
RedisÊÂÎñ
RedisÊÂÎñ£º°Ñ¶à¸öredisÃüÁî·Åµ½¶ÓÁУ¬È»ºóÒ»´ÎÐÔµÄ˳ÐòÖ´ÐС£²¢ÇÒÔÚÖ´Ðйý³ÌÖв»»á±»Öжϣ¬Ö´ÐÐÍêËùÓжÓÁÐÃüÁîºó²ÅÖ´ÐÐÆäËû¿Í»§¶ËÆäËûÃüÁî¡£
ÏÂÃæ¾Ù¸ö¼òµ¥µÄÀý×Ó£¬MULTI ¿ªÆôÒ»¸öÊÂÎñ£¬ È»ºó½«¶à¸öÃüÁîÈë¶Óµ½ÊÂÎñÖУ¬ ×îºóÓÉ EXEC ÃüÁî´¥·¢ÊÂÎñ£¬
Ò»²¢Ö´ÐÐÊÂÎñÖеÄËùÓÐÃüÁî

Ò»¸öÊÂÎñ´Ó¿ªÊ¼µ½Ö´ÐоÀúÈý¸ö½×¶Î
¿ªÊ¼ÊÂÎñ
ÃüÁîÈë¶Ó
Ö´ÐÐÊÂÎñ
¿ªÊ¼ÊÂÎñ
MULTI ÃüÁîµÄÖ´ÐбêÖ¾×ÅÊÂÎñµÄ¿ªÊ¼£¬Õâ¸öÃüÁî×öµÄ¾ÍÊÇ£¬ ½«¿Í»§¶ËµÄ REDIS_MULTI Ñ¡Ïî´ò¿ª£¬
Èÿͻ§¶Ë´Ó·ÇÊÂÎñ״̬Çл»µ½ÊÂÎñ״̬¡£

ÃüÁîÈë¶Ó
µ±¿Í»§¶Ë´¦ÓÚ·ÇÊÂÎñ״̬Ï£¬ËùÓз¢Ë͸ø·þÎñ¶ËµÄÃüÁî»áÁ¢¼´±»Ö´ÐС£
µ«¿Í»§¶ËÇл»µ½ÊÂÎñ״̬ºó£¬·þÎñ¶Ë½ÓÊܵ½¿Í»§¶ËµÄÃüÁî²»»áÁ¢¼´Ö´ÐУ¬¶øÊǰÑÕâЩÃüÁî·Åµ½ÊÂÎñ¶ÓÁÐÀï,È»ºó·µ»Ø
QUEUED £¬ ±íʾÃüÁîÒÑÈë¶Ó¡£

¿ÉÒÔÓÉÒ»ÏÂÁ÷³Ìͼ±íʾ:

ÊÂÎñ¶ÓÁÐÊÇÒ»¸öÊý×飬 ÿ¸öÊý×éÏîÊǶ¼°üº¬Èý¸öÊôÐÔ£º
ÒªÖ´ÐеÄÃüÁcmd£©
ÃüÁîµÄ²ÎÊý£¨argv£©
²ÎÊýµÄ¸öÊý£¨argc£©

ÒÔÉÏͼÃüÁîΪÀý×Ó£¬ÄÇô³ÌÐò½«Îª¿Í»§¶Ë´´½¨ÒÔÏÂÊÂÎñ¶ÓÁУº
Êý×éË÷Òý |
cmd |
argv |
argc |
0 |
SET |
["name","xiaoming"] |
2 |
1 |
SET |
["age","25"] |
2 |
2 |
INCR |
["age"] |
1 |
Ö´ÐÐÊÂÎñ
¿Í»§¶Ë½øÈëµ½ÊÂÎñ״̬ºó£¬¿Í»§¶Ë·¢Ë͵ÄÃüÁî²»»áÖ±½Ó±»Ö´ÐУ¬¶øÊÇ»á·Åµ½ÊÂÎñ¶ÓÁÐÀï¡£
µ«²¢²»ÊÇËùÓÐÃüÁî¶¼»á·Åµ½ÊÂÎñ¶ÓÁУ¬Èç EXEC ¡¢ DISCARD ¡¢ MULTI ºÍ WATCH
ÕâËĸöÃüÁÎÞÊÓÊÂÎñ״̬£¬Ö±½Ó±»·þÎñÆ÷Ö´ÐС£

Èç¹û¿Í»§¶ËÕý´¦ÓÚÊÂÎñ״̬£¬ ÄÇôµ± EXEC ÃüÁîÖ´ÐÐʱ£¬ ·þÎñÆ÷¸ù¾Ý¿Í»§¶ËËù±£´æµÄÊÂÎñ¶ÓÁУ¬
ÒÔÏȽøÏȳö£¨FIFO£©µÄ·½Ê½Ö´ÐÐÊÂÎñ¶ÓÁÐÖеÄÃüÁ ×îÏÈÈë¶ÓµÄÃüÁî×îÏÈÖ´ÐУ¬ ¶ø×îºóÈë¶ÓµÄÃüÁî×îºóÖ´ÐС£
Ö´ÐÐÊÂÎñÖеÄÃüÁîËùµÃµÄ½á¹û»áÒÔ FIFO µÄ˳Ðò±£´æµ½Ò»¸ö»Ø¸´¶ÓÁÐÖС£

ÈçÉÏͼ£¬³ÌÐò½«Îª¶ÓÁÐÖеÄÃüÁî´´½¨ÈçÏ»ظ´¶ÓÁУº
Êý×éË÷Òý |
»Ø¸´ÀàÐÍ |
»Ø¸´ÄÚÈÝ |
0 |
status code reply |
OK |
1 |
status code reply |
OK |
2 |
integer reply |
26 |
µ±ÊÂÎñ¶ÓÁÐÀïµÄËùÓÐÃüÁî±»Ö´ÐÐÍêÖ®ºó£¬ EXEC ÃüÁî»á½«»Ø¸´¶ÓÁÐ×÷Ϊ×Ô¼ºµÄÖ´Ðнá¹û·µ»Ø¸ø¿Í»§¶Ë£¬
¿Í»§¶Ë´ÓÊÂÎñ״̬·µ»Øµ½·ÇÊÂÎñ״̬£¬ ÖÁ´Ë£¬ ÊÂÎñÖ´ÐÐÍê±Ï¡£
ÊÂÎñ¹ý³Ìα´úÂ룺
def execute_transaction():
# ´´½¨¿Õ°×µÄ»Ø¸´¶ÓÁÐ
reply_queue = []
# È¡³öÊÂÎñ¶ÓÁÐÀïµÄËùÓÐÃüÁî¡¢²ÎÊýºÍ²ÎÊýÊýÁ¿
for cmd, argv, argc in client.transaction_queue:
# Ö´ÐÐÃüÁ²¢È¡µÃÃüÁîµÄ·µ»ØÖµ
reply = execute_redis_command(cmd, argv, argc)
# ½«·µ»ØÖµ×·¼Óµ½»Ø¸´¶ÓÁÐĩβ
reply_queue.append(reply)
# Çå³ý¿Í»§¶ËµÄÊÂÎñ״̬
clear_transaction_state(client)
# Çå¿ÕÊÂÎñ¶ÓÁÐ
clear_transaction_queue(client)
# ½«ÊÂÎñµÄÖ´Ðнá¹û·µ»Ø¸ø¿Í»§¶Ë
send_reply_to_client(client, reply_queue) |
DISCARD¡¢MULTI¡¢WATCHÃüÁî
DISCRAD ÃüÁîÓÃÓÚÈ¡ÏûÒ»¸öÊÂÎñ£¬ ËüÇå¿Õ¿Í»§¶ËµÄÕû¸öÊÂÎñ¶ÓÁУ¬ È»ºó½«¿Í»§¶Ë´ÓÊÂÎñ״̬µ÷Õû»Ø·ÇÊÂÎñ״̬£¬
×îºó·µ»Ø×Ö·û´® OK ¸ø¿Í»§¶Ë£¬ ˵Ã÷ÊÂÎñÒѱ»È¡Ïû¡£
MULTIÃüÁÆôÒ»¸öÊÂÎñ£¬Redis µÄÊÂÎñÊDz»¿ÉǶÌ׵ģ¬ µ±¿Í»§¶ËÒѾ´¦ÓÚÊÂÎñ״̬£¬ ¶ø¿Í»§¶ËÓÖÔÙÏò·þÎñÆ÷·¢ËÍ
MULTI ʱ£¬ ·þÎñÆ÷Ö»ÊǼòµ¥µØÏò¿Í»§¶Ë·¢ËÍÒ»¸ö´íÎó£¬ È»ºó¼ÌÐøµÈ´ýÆäËûÃüÁîµÄÈë¶Ó¡£ MULTI
ÃüÁîµÄ·¢ËͲ»»áÔì³ÉÕû¸öÊÂÎñʧ°Ü£¬ Ò²²»»áÐÞ¸ÄÊÂÎñ¶ÓÁÐÖÐÒÑÓеÄÊý¾Ý¡£
WATCHÃüÁîÖ»ÄÜÔÚ¿Í»§¶Ë½øÈëÊÂÎñ״̬֮ǰִÐУ¬ ÔÚÊÂÎñ״̬Ï·¢ËÍ WATCH ÃüÁî»áÒý·¢Ò»¸ö´íÎó£¬
µ«Ëü²»»áÔì³ÉÕû¸öÊÂÎñʧ°Ü£¬ Ò²²»»áÐÞ¸ÄÊÂÎñ¶ÓÁÐÖÐÒÑÓеÄÊý¾Ý£¨ºÍÇ°Ãæ´¦Àí MULTI µÄÇé¿öÒ»Ñù£©
´ø WATCH µÄÊÂÎñ
WATCH ÃüÁîÓÃÓÚÔÚÊÂÎñ¿ªÊ¼Ö®Ç°¼àÊÓÈÎÒâÊýÁ¿µÄ¼ü£º µ±µ÷Óà EXEC ÃüÁîÖ´ÐÐÊÂÎñʱ£¬ Èç¹ûÈÎÒâÒ»¸ö±»¼àÊӵļüÒѾ±»ÆäËû¿Í»§¶ËÐÞ¸ÄÁË£¬
ÄÇôÕû¸öÊÂÎñ²»ÔÙÖ´ÐУ¬ Ö±½Ó·µ»ØÊ§°Ü¡£
ÈçÏÂͼÀý×Ó£º
¿Í»§¶ËA

´Ëʱ¿Í»§¶ËBÐÞ¸ÄÁËname

¿Í»§¶ËAÖ´ÐÐÊÂÎñʧ°Ü

watchÃüÁîʵÏÖ
ÔÚÿ¸ö´ú±íÊý¾Ý¿âµÄ redis.h/redisDb ½á¹¹ÀàÐÍÖУ¬ ¶¼±£´æÁËÒ»¸ö watched_keys
×ֵ䣬 ×ÖµäµÄ¼üÊÇÕâ¸öÊý¾Ý¿â±»¼àÊӵļü£¬ ¶ø×ÖµäµÄÖµÔòÊÇÒ»¸öÁ´±í£¬ Á´±íÖб£´æÁËËùÓмàÊÓÕâ¸ö¼üµÄ¿Í»§¶Ë¡£
ÈçÏÂͼ£º

WATCH ÃüÁîµÄ×÷Ó㬠¾ÍÊǽ«µ±Ç°¿Í»§¶ËºÍÒª¼àÊӵļüÔÚ watched_keys ÖнøÐйØÁª¡£
¾Ù¸öÀý×Ó£¬Èç¹û¿Í»§¶Ëclient5Ö´ÐÐ WATCH key1 key2 ʱ£¬ÉÏͼ½«±ä³ÉÏÂÃæÕâÑù¡£

ͨ¹ý watched_keys ×ֵ䣬 Èç¹û³ÌÐòÏë¼ì²éij¸ö¼üÊÇ·ñ±»¼àÊÓ£¬ ÄÇôËüÖ»Òª¼ì²é×ÖµäÖÐÊÇ·ñ´æÔÚÕâ¸ö¼ü¼´¿É£»
Èç¹û³ÌÐòÒª»ñÈ¡¼àÊÓij¸ö¼üµÄËùÓпͻ§¶Ë£¬ ÄÇôֻҪȡ³ö¼üµÄÖµ£¨Ò»¸öÁ´±í£©£¬ È»ºó¶ÔÁ´±í½øÐбéÀú¼´¿É¡£
WATCH ´¥·¢
ÈκζÔRedis¼üÖµµÄÐ޸IJÙ×÷³É¹¦ºó£¬multi.c/touchWatchedKey º¯Êý¶¼»á±»µ÷Óã¬Ëü¼ì²éÊý¾Ý¿âµÄ
watched_keys ×ֵ䣬 ¿´ÊÇ·ñÓпͻ§¶ËÔÚ¼àÊÓÒѾ±»ÃüÁîÐ޸ĵļü£¬ Èç¹ûÓеϰ£¬ ³ÌÐò½«ËùÓмàÊÓÕâ¸ö/ÕâЩ±»Ð޸ļüµÄ¿Í»§¶ËµÄ
REDIS_DIRTY_CAS Ñ¡Ïî´ò¿ª£º

µ±¿Í»§¶Ë·¢ËÍ EXEC ÃüÁî¡¢´¥·¢ÊÂÎñÖ´ÐÐʱ£¬ ·þÎñÆ÷»á¶Ô¿Í»§¶ËµÄ״̬½øÐмì²é£º
Èç¹û¿Í»§¶ËµÄ REDIS_DIRTY_CAS Ñ¡ÏîÒѾ±»´ò¿ª£¬ÄÇô˵Ã÷±»¿Í»§¶Ë¼àÊӵļüÖÁÉÙÓÐÒ»¸öÒѾ±»ÐÞ¸ÄÁË£¬ÊÂÎñµÄ°²È«ÐÔÒѾ±»ÆÆ»µ¡£·þÎñÆ÷»á·ÅÆúÖ´ÐÐÕâ¸öÊÂÎñ£¬Ö±½ÓÏò¿Í»§¶Ë·µ»Ø¿Õ»Ø¸´£¬±íʾÊÂÎñÖ´ÐÐʧ°Ü¡£
Èç¹û REDIS_DIRTY_CAS Ñ¡ÏîûÓб»´ò¿ª£¬ÄÇô˵Ã÷ËùÓмàÊÓ¼ü¶¼°²È«£¬·þÎñÆ÷ÕýʽִÐÐÊÂÎñ¡£
α´úÂëÈçÏÂ
def check_safety_before_execute_trasaction():
if client.state & REDIS_DIRTY_CAS:
# °²È«ÐÔÒÑÆÆ»µ£¬Çå³ýÊÂÎñ״̬
clear_transaction_state(client)
# Çå¿ÕÊÂÎñ¶ÓÁÐ
clear_transaction_queue(client)
# ·µ»Ø¿Õ»Ø¸´¸ø¿Í»§¶Ë
send_empty_reply(client)
else:
# °²È«ÐÔÍêºÃ£¬Ö´ÐÐÊÂÎñ
execute_transaction() |
×îºó£¬µ±Ò»¸ö¿Í»§¶Ë½áÊøËüµÄÊÂÎñʱ£¬ÎÞÂÛÊÂÎñÊdzɹ¦Ö´ÐУ¬»¹ÊÇʧ°Ü£¬ watched_keys ×ÖµäÖкÍÕâ¸ö¿Í»§¶ËÏà¹ØµÄ×ÊÁ϶¼»á±»Çå³ý¡£
RedisÊÂÎñµÄACIDÐÔÖÊ
RedisÊÂÎñ¾ßÓÐÔ×ÓÐÔ¡¢Ò»ÖÂÐÔ¡¢¸ôÀëÐÔ£¬²¢ÇÒµ±RedisÔËÐÐÔÚijÖÖÌØ¶¨µÄ³Ö¾Ã»¯Ä£Ê½Ï£¬Ò²¾ßÓг־ÃÐÔ¡£
Ô×ÓÐÔ
RedisÊÂÎñ£¬ÊÂÎñ¶ÓÁÐÖеÄÃüÁîҪôȫ²¿Ö´ÐУ¬ÒªÃ´Ò»¸ö¶¼²»Ö´ÐС£ËùÒÔRedisÊÂÎñ¾ßÓÐÔ×ÓÐÔ¡£
RedisÊÂÎñÓ봫ͳµÄ¹ØÏµÐÍÊý¾Ý¿âÊÂÎñ×î´óµÄÇø±ðÔÚÓÚ£ºRedisÊÂÎñ²»Ö§³Ö»Ø¹ö»úÖÆ£¨rollback£©,¼´Ê¹ÊÂÎñ¶ÓÁÐÖеÄÃüÁîÖ´ÐÐÆÚ¼ä³öÏÖÁË´íÎó£¬Õû¸öÊÂÎñ»á¼ÌÐøÏÂÈ¥£¬Ö±µ½ÊÂÎñ¶ÓÁÐÀïÃæµÄÃüÁî¶¼Ö´ÐÐÍê¡£
ÈçÏÂÀý×Ó£º

Ò»ÖÂÐÔ
Redisͨ¹ý´íÎó¼ì²âºÍ¼òµ¥µÄÉè¼Æ±£Ö¤ÊÂÎñÒ»ÖÂÐÔ¡£
Èë¶Ó´íÎó
Èç¹ûÒ»¸öÊÂÎñÔÚÈë¶Ó¹ý³ÌÖУ¬³öÏÖÁËÃüÁî²»´æÔÚ£¬»òÕßÃüÁî¸ñʽ²»ÕýÈ·£¬Redis¾Ü¾øÖ´ÐÐÕâ¸öÊÂÎñ¡£
ÈçÏÂÀý×Ó

ÒòΪ¾ÜµôÈë¶Ó´íÎóµÄÊÂÎñ£¬ËùÒÔÒ»ÖÂÐÔ²»»á±»Èë¶Ó´íÎóµÄÊÂÎñÓ°Ïì¡£
Ö´ÐдíÎó
ÊÂÎñÖ´Ðйý³ÌÖУ¬´íÎóµÄÃüÁî»á±»Ê¶±ð³öÀ´£¬²¢½øÐÐÏàÓ¦µÄ´íÎó´¦Àí£¬ËùÒÔÒ»ÖÂÐÔ²»»áÊܵ½Ó°Ïì¡£
·þÎñÆ÷Í£»ú
Èç¹û·þÎñÆ÷ÔËÐÐÔÚûÓг־û¯µÄÄÚ´æÄ£Ê½Ï£¬ÄÇÃ´ÖØÆôºóÊý¾Ý¿âÊǿհ׵ģ¬Òò´ËÊý¾ÝÊÇÒ»Öµġ£
Èç¹û·þÎñÆ÷ÔËÐÐÔÚRDB»òÕßAOFģʽÏ£¬ÖÐ;ͣ»ú¿ÉÒÔÓÃÁ½ÖÖģʽ»Ö¸´£¬Èç¹ûÕÒ²»µ½»Ö¸´Îļþ£¬Êý¾Ý¿âÊǿհ׵ģ¬Êý¾ÝÊÇÒ»Öµġ£
¸ôÀëÐÔ
Redis²ÉÓõĵ¥Ï̵߳ķ½Ê½ÊµÐÐÊÂÎñ£¬²¢ÇÒÔÚÊÂÎñÖ´Ðйý³ÌÖв»»á¶ÔÊÂÎñÖжϣ¬Òò´ËRedisÊÂÎñÒÔ´®Ðеķ½Ê½ÔËÐеģ¬ËùÒÔRedisÊÂÎñ¾ßÓиôÀëÐÔ¡£
³Ö¾ÃÐÔ
RedisÊÂÎñ£¬ÓöÓÁб£´æÁËһЩÁÐÃüÁûÓÐΪÊÂÎñÌṩ¶îÍâµÄ³Ö¾Ã»¯¹¦ÄÜ£¬ËùÓÐRedisµÄ³Ö¾Ã»¯ÓÉRedisµÄ³Ö¾Ã»¯Ä£Ê½¾ö¶¨¡£
ûÓг־û¯
RedisûÓпªÆô³Ö¾Ã»¯Ä£Ê½£¬ÊÂÎñ²»¾ßÓг־ÃÐÔ£¬Ò»µ©·þÎñÆ÷Í£»ú£¬°üÀ¨ÊÂÎñÔÚÄÚµÄÊý¾Ý¶¼½«¶ªÊ§
RDB
µ±·þÎñÆ÷ÔËÐÐÔÚRDBģʽÏ£¬·þÎñÆ÷Ö»ÔÚÌØ¶¨µÄÌõ¼þÂú×ãʱ£¬²Å»áÖ´ÐÐBGSAVEÃüÁî±£´æÊý¾Ý¿âÊý¾Ý¡£È»¶øÒì²½Ö´ÐеÄBGSAVEÃüÁî²»Äܱ£Ö¤ÊÂÎñÊý¾ÝµÚһʱ¼ä±£´æµ½´ÅÅÌ¡£
Òò´ËRDBģʽϵÄÊÂÎñ²»¾ß±¸³Ö¾ÃÐÔ¡£
AOF
µ±·þÎñÆ÷ÔËÐÐÔÚAOFģʽÏ£¬²¢ÇÒappendfsync Ñ¡ÏîµÄֵΪ always ʱ£¬³ÌÐò×Ü»áÔÚÖ´ÐÐÃüÁîºóµ÷Óõ÷ÓÃ
sync º¯Êý£¬½«Êý¾Ýͬ²½µ½´ÅÅÌÖУ¬Òò´ËÔڴ˳¡¾°ÖÐAOFÊǾßÓг־ÃÐԵġ£
ÆäËûÇé¿öÏ£¬²»Äܱ£Ö¤Ã¿Ö´ÐÐÒ»¸öÃüÁî¾ÍÄܽ«Êý¾Ýͬ²½µ½´ÅÅÌ£¬ËùÒÔÊÂÎñ²»¾ß±¸³Ö¾ÃÐÔ¡£
|