±à¼ÍƼö: |
±¾ÎÄÖ÷Òª½éÉÜÁËRedisÖÐʵÏÖÊÂÎñµÄ¼¸¸öÃüÁRedisÊÂÎñ´Ó¿ªÊ¼µ½½áÊøÍ¨³£»áͨ¹ýÈý¸ö½×¶Î²¢ÑÝʾÁËÒ»¸öÍêÕûµÄÊÂÎñ¹ý³Ì£¬Ï£Íû¶ÔÄúµÄѧϰÓÐËù°ïÖú¡£
±¾ÎÄÀ´×ÔInfoQ£¬ÓÉ»ðÁú¹ûÈí¼þAlice±à¼¡¢ÍƼö¡£ |
|
¼ÙÉèÏÖÔÚÓÐÕâÑùÒ»¸öÒµÎñ£¬Óû§»ñÈ¡µÄijЩÊý¾ÝÀ´×ÔµÚÈý·½½Ó¿ÚÐÅÏ¢£¬Îª±ÜÃâÆµ·±ÇëÇóµÚÈý·½½Ó¿Ú£¬ÎÒÃÇÍùÍù»á¼ÓÒ»²ã»º´æ£¬»º´æ¿Ï¶¨ÒªÓÐʱЧÐÔ£¬¼ÙÉèÎÒÃÇÒª´æ´¢µÄ½á¹¹ÊÇ
hash£¨Ã»ÓÐStringµÄ'SET anotherkey "will expire in
a minute" EX 60'ÕâÖÖÔ×Ó²Ù×÷£©£¬ÎÒÃǼÈÒªÅúÁ¿È¥·ÅÈ뻺´æ£¬ÓÖÒª±£Ö¤Ã¿¸ö key
¶¼¼ÓÉϹýÆÚʱ¼ä£¨ÒÔ·À key ÓÀ²»¹ýÆÚ£©£¬ÕâʱºòÊÂÎñ²Ù×÷ÊǸö±È½ÏºÃµÄÑ¡Ôñ
ΪÁËÈ·±£Á¬Ðø¶à¸ö²Ù×÷µÄÔ×ÓÐÔ£¬ÎÒÃdz£ÓõÄÊý¾Ý¿â¶¼»áÓÐÊÂÎñµÄÖ§³Ö£¬Redis
Ò²²»ÀýÍâ¡£µ«ËüÓֺ͹ØÏµÐÍÊý¾Ý¿â²»Ì«Ò»Ñù¡£
ÿ¸öÊÂÎñµÄ²Ù×÷¶¼ÓÐ begin¡¢commit ºÍ rollback£¬begin ָʾÊÂÎñµÄ¿ªÊ¼£¬commit
ָʾÊÂÎñµÄÌá½»£¬rollback ָʾÊÂÎñµÄ»Ø¹ö¡£Ëü´óÖµÄÐÎʽÈçÏÂ
begin();
try {
command1();
command2();
....
commit();
} catch(Exception e) {
rollback();
} |
Redis ÔÚÐÎʽÉÏ¿´ÆðÀ´Ò²²î²»¶à£¬·ÖΪÈý¸ö½×¶Î
1.¿ªÆôÊÂÎñ£¨multi£©
2.ÃüÁîÈë¶Ó£¨ÒµÎñ²Ù×÷£©
3.Ö´ÐÐÊÂÎñ£¨exec£©»òÈ¡ÏûÊÂÎñ£¨discard£©
> multi
OK
> incr star
QUEUED
> incr star
QUEUED
> exec
(integer) 1
(integer) 2 |
ÉÏÃæµÄÖ¸ÁîÑÝʾÁËÒ»¸öÍêÕûµÄÊÂÎñ¹ý³Ì£¬ËùÓеÄÖ¸ÁîÔÚ exec ֮ǰ²»Ö´ÐУ¬¶øÊÇ»º´æÔÚ·þÎñÆ÷µÄÒ»¸öÊÂÎñ¶ÓÁÐÖУ¬·þÎñÆ÷Ò»µ©ÊÕµ½
exec Ö¸Á²Å¿ªÖ´ÐÐÕû¸öÊÂÎñ¶ÓÁУ¬Ö´ÐÐÍê±ÏºóÒ»´ÎÐÔ·µ»ØËùÓÐÖ¸ÁîµÄÔËÐнá¹û¡£
Redis ÊÂÎñ¿ÉÒÔÒ»´ÎÖ´Ðжà¸öÃüÁ±¾ÖÊÊÇÒ»×éÃüÁîµÄ¼¯ºÏ¡£Ò»¸öÊÂÎñÖеÄËùÓÐÃüÁî¶¼»áÐòÁл¯£¬°´Ë³ÐòµØ´®Ðл¯Ö´Ðжø²»»á±»ÆäËüÃüÁî²åÈ룬²»Ðí¼ÓÈû¡£
¿ÉÒÔ±£Ö¤Ò»¸ö¶ÓÁÐÖУ¬Ò»´ÎÐÔ¡¢Ë³ÐòÐÔ¡¢ÅÅËûÐÔµÄÖ´ÐÐһϵÁÐÃüÁRedis ÊÂÎñµÄÖ÷Òª×÷ÓÃÆäʵ¾ÍÊÇ´®Áª¶à¸öÃüÁî·ÀÖ¹±ðµÄÃüÁî²å¶Ó£©
¹Ù·½ÎĵµÊÇÕâô˵µÄ
ÊÂÎñ¿ÉÒÔÒ»´ÎÖ´Ðжà¸öÃüÁ ²¢ÇÒ´øÓÐÒÔÏÂÁ½¸öÖØÒªµÄ±£Ö¤£º
ÊÂÎñÊÇÒ»¸öµ¥¶ÀµÄ¸ôÀë²Ù×÷£ºÊÂÎñÖеÄËùÓÐÃüÁî¶¼»áÐòÁл¯¡¢°´Ë³ÐòµØÖ´ÐС£ÊÂÎñÔÚÖ´ÐеĹý³ÌÖУ¬²»»á±»ÆäËû¿Í»§¶Ë·¢ËÍÀ´µÄÃüÁîÇëÇóËù´ò¶Ï¡£
ÊÂÎñÊÇÒ»¸öÔ×Ó²Ù×÷£ºÊÂÎñÖеÄÃüÁîҪôȫ²¿±»Ö´ÐУ¬ÒªÃ´È«²¿¶¼²»Ö´ÐÐ
Õâ¸öÔ×Ó²Ù×÷£¬ºÍ¹ØÏµÐÍ DB µÄÔ×ÓÐÔ²»Ì«Ò»Ñù£¬Ëü²»ÄÜÍêÈ«±£Ö¤Ô×ÓÐÔ£¬ºó±ß»á½éÉÜ¡£
Redis ÊÂÎñµÄ¼¸¸öÃüÁî

MULTI ÃüÁîÓÃÓÚ¿ªÆôÒ»¸öÊÂÎñ£¬Ëü×ÜÊÇ·µ»Ø OK ¡£
MULTI Ö´ÐÐÖ®ºó£¬ ¿Í»§¶Ë¿ÉÒÔ¼ÌÐøÏò·þÎñÆ÷·¢ËÍÈÎÒâ¶àÌõÃüÁ ÕâЩÃüÁî²»»áÁ¢¼´±»Ö´ÐУ¬ ¶øÊDZ»·Åµ½Ò»¸ö¶ÓÁÐÖУ¬
µ± EXEC ÃüÁî±»µ÷ÓÃʱ£¬ ËùÓжÓÁÐÖеÄÃüÁî²Å»á±»Ö´ÐС£
ÁíÒ»·½Ã棬 ͨ¹ýµ÷Óà DISCARD £¬ ¿Í»§¶Ë¿ÉÒÔÇå¿ÕÊÂÎñ¶ÓÁУ¬ ²¢·ÅÆúÖ´ÐÐÊÂÎñ¡£
·Ï»°²»¶à˵£¬Ö±½Ó²Ù×÷ÆðÀ´¿´½á¹û¸üºÃÀí½â~
Ò»·«·ç˳
Õý³£Ö´ÐУ¨¿ÉÒÔÅú´¦Àí£¬Í¦Ë¬£¬Ã¿Ìõ²Ù×÷³É¹¦µÄ»°¶¼»á¸÷È¡ËùÐ裬»¥²»Ó°Ï죩

·ÅÆúÊÂÎñ£¨discard ²Ù×÷±íʾ·ÅÆúÊÂÎñ£¬Ö®Ç°µÄ²Ù×÷¶¼²»ËãÊý£©

˼¿¼¸öÎÊÌ⣺¼ÙÉèÎÒÃÇÓиöÓйýÆÚʱ¼äµÄ key£¬ÔÚÊÂÎñ²Ù×÷ÖÐ key ʧЧÁË£¬ÄÇÖ´ÐÐ exec µÄʱºò»á³É¹¦Âð£¿
ÊÂÎñÖеĴíÎó
ÉÏ±ß¹æ¹æ¾Ø¾ØµÄ²Ù×÷£¬¿´×Å»¹Í¦ºÃ£¬¿ÉÊÇÊÂÎñÊÇΪ½â¾öÊý¾Ý°²È«²Ù×÷Ìá³öµÄ£¬ÎÒÃÇÓà Redis ÊÂÎñµÄʱºò£¬¿ÉÄÜ»áÓöÉÏÒÔÏÂÁ½ÖÖ´íÎó£º
ÊÂÎñÔÚÖ´ÐÐ EXEC ֮ǰ£¬Èë¶ÓµÄÃüÁî¿ÉÄÜ»á³ö´í¡£±ÈÈç˵£¬ÃüÁî¿ÉÄÜ»á²úÉúÓï·¨´íÎ󣨲ÎÊýÊýÁ¿´íÎ󣬲ÎÊýÃû´íÎóµÈµÈ£©£¬»òÕ߯äËû¸üÑÏÖØµÄ´íÎ󣬱ÈÈçÄÚ´æ²»×㣨Èç¹û·þÎñÆ÷ʹÓÃ
maxmemory ÉèÖÃÁË×î´óÄÚ´æÏÞÖÆµÄ»°£©¡£
ÃüÁî¿ÉÄÜÔÚ EXEC µ÷ÓÃÖ®ºóʧ°Ü¡£¾Ù¸öÀý×Ó£¬ÊÂÎñÖеÄÃüÁî¿ÉÄÜ´¦ÀíÁË´íÎóÀàÐ͵ļü£¬±ÈÈ罫ÁбíÃüÁîÓÃÔÚÁË×Ö·û´®¼üÉÏÃæ£¬ÖîÈç´ËÀà¡£
Redis Õë¶ÔÈçÉÏÁ½ÖÖ´íÎó²ÉÓÃÁ˲»Í¬µÄ´¦Àí²ßÂÔ£¬¶ÔÓÚ·¢ÉúÔÚ EXEC Ö´ÐÐ֮ǰµÄ´íÎ󣬷þÎñÆ÷»á¶ÔÃüÁîÈë¶Óʧ°ÜµÄÇé¿ö½øÐмǼ£¬²¢ÔÚ¿Í»§¶Ëµ÷ÓÃ
EXEC ÃüÁîʱ£¬¾Ü¾øÖ´Ðв¢×Ô¶¯·ÅÆúÕâ¸öÊÂÎñ£¨Redis 2.6.5 ֮ǰµÄ×ö·¨ÊǼì²éÃüÁîÈë¶ÓËùµÃµÄ·µ»ØÖµ£ºÈç¹ûÃüÁîÈë¶Óʱ·µ»Ø
QUEUED £¬ÄÇôÈë¶Ó³É¹¦£»·ñÔò£¬¾ÍÊÇÈë¶Óʧ°Ü£©
¶ÔÓÚÄÇЩÔÚ EXEC ÃüÁîÖ´ÐÐÖ®ºóËù²úÉúµÄ´íÎó£¬ ²¢Ã»ÓжÔËüÃǽøÐÐÌØ±ð´¦Àí£º ¼´Ê¹ÊÂÎñÖÐÓÐij¸ö/ijЩÃüÁîÔÚÖ´ÐÐʱ²úÉúÁË´íÎó£¬
ÊÂÎñÖÐµÄÆäËûÃüÁîÈÔÈ»»á¼ÌÐøÖ´ÐС£
È«ÌåÁ¬×ø£¨Ä³Ò»Ìõ²Ù×÷¼Ç¼±¨´íµÄ»°£¬exec ºóËùÓвÙ×÷¶¼²»»á³É¹¦£©

Ô©Í·Õ®Ö÷£¨Ê¾ÀýÖÐ k1 ±»ÉèÖÃΪ String ÀàÐÍ£¬decr k1 ¿ÉÒÔ·ÅÈë²Ù×÷¶ÓÁÐÖУ¬ÒòΪֻÓÐÔÚÖ´ÐеÄʱºò²Å¿ÉÒÔÅжϳöÓï¾ä´íÎ󣬯äËûÕýÈ·µÄ»á±»Õý³£Ö´ÐУ©

Ϊʲô Redis ²»Ö§³Ö»Ø¹ö
Èç¹ûÄãÓÐʹÓùØÏµÊ½Êý¾Ý¿âµÄ¾Ñ飬ÄÇô ¡°Redis ÔÚÊÂÎñʧ°Üʱ²»½øÐлعö£¬¶øÊǼÌÐøÖ´ÐÐÓàϵÄÃüÁÕâÖÖ×ö·¨¿ÉÄÜ»áÈÃÄã¾õµÃÓÐµãÆæ¹Ö¡£
ÒÔÏÂÊǹٷ½µÄ×Կ䣺
Redis ÃüÁîÖ»»áÒòΪ´íÎóµÄÓï·¨¶øÊ§°Ü£¨²¢ÇÒÕâЩÎÊÌâ²»ÄÜÔÚÈë¶Óʱ·¢ÏÖ£©£¬»òÊÇÃüÁîÓÃÔÚÁË´íÎóÀàÐ͵ļüÉÏÃæ£ºÕâÒ²¾ÍÊÇ˵£¬´ÓʵÓÃÐԵĽǶÈÀ´Ëµ£¬Ê§°ÜµÄÃüÁîÊÇÓɱà³Ì´íÎóÔì³ÉµÄ£¬¶øÕâЩ´íÎóÓ¦¸ÃÔÚ¿ª·¢µÄ¹ý³ÌÖб»·¢ÏÖ£¬¶ø²»Ó¦¸Ã³öÏÖÔÚÉú²ú»·¾³ÖС£
ÒòΪ²»ÐèÒª¶Ô»Ø¹ö½øÐÐÖ§³Ö£¬ËùÒÔ Redis µÄÄÚ²¿¿ÉÒÔ±£³Ö¼òµ¥ÇÒ¿ìËÙ¡£
ÓÐÖÖ¹ÛµãÈÏΪ Redis ´¦ÀíÊÂÎñµÄ×ö·¨»á²úÉú bug £¬ È»¶øÐèҪעÒâµÄÊÇ£¬ ÔÚͨ³£Çé¿öÏ£¬ »Ø¹ö²¢²»Äܽâ¾ö±à³Ì´íÎó´øÀ´µÄÎÊÌâ¡£
¾Ù¸öÀý×Ó£¬ Èç¹ûÄã±¾À´Ïëͨ¹ý INCR ÃüÁ¼üµÄÖµ¼ÓÉÏ 1 £¬ È´²»Ð¡ÐļÓÉÏÁË 2 £¬ ÓÖ»òÕß¶Ô´íÎóÀàÐ͵ļüÖ´ÐÐÁË
INCR £¬ »Ø¹öÊÇûÓа취´¦ÀíÕâЩÇé¿öµÄ¡£
¼øÓÚûÓÐÈκλúÖÆÄܱÜÃâ³ÌÐòÔ±×Ô¼ºÔì³ÉµÄ´íÎó£¬ ²¢ÇÒÕâÀà´íÎóͨ³£²»»áÔÚÉú²ú»·¾³ÖгöÏÖ£¬ ËùÒÔ Redis
Ñ¡ÔñÁ˸ü¼òµ¥¡¢¸ü¿ìËÙµÄÎ޻عö·½Ê½À´´¦ÀíÊÂÎñ¡£

´ø Watch µÄÊÂÎñ
WATCH ÃüÁîÓÃÓÚÔÚÊÂÎñ¿ªÊ¼Ö®Ç°¼àÊÓÈÎÒâÊýÁ¿µÄ¼ü£º µ±µ÷Óà EXEC ÃüÁîÖ´ÐÐÊÂÎñʱ£¬ Èç¹ûÈÎÒâÒ»¸ö±»¼àÊӵļüÒѾ±»ÆäËû¿Í»§¶ËÐÞ¸ÄÁË£¬
ÄÇôÕû¸öÊÂÎñ½«±»´ò¶Ï£¬²»ÔÙÖ´ÐУ¬ Ö±½Ó·µ»ØÊ§°Ü¡£
WATCHÃüÁî¿ÉÒÔ±»µ÷Óöà´Î¡£ ¶Ô¼üµÄ¼àÊÓ´Ó WATCH Ö´ÐÐÖ®ºó¿ªÊ¼ÉúЧ£¬ Ö±µ½µ÷Óà EXEC
Ϊֹ¡£
Óû§»¹¿ÉÒÔÔÚµ¥¸ö WATCH ÃüÁîÖмàÊÓÈÎÒâ¶à¸ö¼ü£¬ ¾ÍÏñÕâÑù£º
redis> WATCH
key1 key2 key3
OK |
**µ± EXEC ±»µ÷ÓÃʱ£¬ ²»¹ÜÊÂÎñÊÇ·ñ³É¹¦Ö´ÐУ¬ ¶ÔËùÓмüµÄ¼àÊÓ¶¼»á±»È¡Ïû**¡£ÁíÍ⣬ µ±¿Í»§¶Ë¶Ï¿ªÁ¬½Óʱ£¬
¸Ã¿Í»§¶Ë¶Ô¼üµÄ¼àÊÓÒ²»á±»È¡Ïû¡£
ÎÒÃÇ¿´¸ö¼òµ¥µÄÀý×Ó£¬Óà watch ¼à¿ØÎÒµÄÕ˺ÅÓà¶î£¨Ò»ÖÜ100Á㻨ǮµÄÎÒ£©£¬Õý³£Ïû·Ñ

µ«Õâ¸ö¿¨£¬»¹°ó¶¨ÁËÎÒϱ¸¾µÄÖ§¸¶±¦£¬Èç¹ûÔÚÎÒÏû·ÑµÄʱºò£¬ËýÒ²Ïû·ÑÁË£¬»áÔõôÑùÄØ£¿
·¸À§µÄÎÒȥ¥Ï 711 ÂòÁ˰üÑÌ£¬ÂòÁËÆ¿Ë®£¬ÕâʱºòÎÒϱ¸¾ÔÚ³¬ÊÐÖ±½ÓË¢ÁË 100£¬´ËʱÓà¶î²»×ãµÄÎÒ»¹ÔÚÌô¿ÚÏãÌÇÀ´×Å£¬£¬£¬

ÕâʱºòÎÒÈ¥½áÕË£¬·¢ÏÖË¢¿¨Ê§°Ü£¨ÊÂÎñÖжϣ©£¬ÞÏÞεÄÒ»Åú

Äã¿ÉÄÜû¿´Ã÷°× watch ÓÐɶÓã¬ÎÒÃÇÔÙÀ´¿´Ï£¬Èç¹û»¹ÊÇͬÑùµÄ³¡¾°£¬ÎÒÃÇûÓÐ watch balance
£¬ÊÂÎñ²»»áʧ°Ü£¬´¢Ð³É¸ºÊý£¬ÊDz»²»Ì«·ûºÏÒµÎñÄØ

ʹÓÃÎÞ²ÎÊýµÄ UNWATCH ÃüÁî¿ÉÒÔÊÖ¶¯È¡Ïû¶ÔËùÓмüµÄ¼àÊÓ¡£ ¶ÔÓÚһЩÐèÒª¸Ä¶¯¶à¸ö¼üµÄÊÂÎñ£¬ÓÐʱºò³ÌÐòÐèҪͬʱ¶Ô¶à¸ö¼ü½øÐмÓËø£¬
È»ºó¼ì²éÕâЩ¼üµÄµ±Ç°ÖµÊÇ·ñ·ûºÏ³ÌÐòµÄÒªÇó¡£ µ±Öµ´ï²»µ½ÒªÇóʱ£¬ ¾Í¿ÉÒÔʹÓà UNWATCH ÃüÁîÀ´È¡ÏûĿǰ¶Ô¼üµÄ¼àÊÓ£¬
ÖÐ;·ÅÆúÕâ¸öÊÂÎñ£¬ ²¢µÈ´ýÊÂÎñµÄÏ´γ¢ÊÔ¡£
watchÖ¸ÁÀàËÆÀÖ¹ÛËø£¬ÊÂÎñÌύʱ£¬Èç¹û key µÄÖµÒѱ»±ðµÄ¿Í»§¶Ë¸Ä±ä£¬±ÈÈçij¸ö list
Òѱ»±ðµÄ¿Í»§¶Ëpush/pop ¹ýÁË£¬Õû¸öÊÂÎñ¶ÓÁж¼²»»á±»Ö´ÐС££¨µ±È»Ò²¿ÉÒÔÓà Redis ʵÏÖ·Ö²¼Ê½ËøÀ´±£Ö¤°²È«ÐÔ£¬ÊôÓÚ±¯¹ÛËø£©
ͨ¹ý watch ÃüÁîÔÚÊÂÎñÖ´ÐÐ֮ǰ¼à¿ØÁ˶à¸ö keys£¬ÌÈÈôÔÚ watch Ö®ºóÓÐÈκΠkey
µÄÖµ·¢Éú±ä»¯£¬exec ÃüÁîÖ´ÐеÄÊÂÎñ¶¼½«±»·ÅÆú£¬Í¬Ê±·µ»Ø Null Ó¦´ðÒÔ֪ͨµ÷ÓÃÕßÊÂÎñÖ´ÐÐʧ°Ü¡£
±¯¹ÛËø
±¯¹ÛËø(Pessimistic Lock)£¬¹ËÃû˼Ò壬¾ÍÊǺܱ¯¹Û£¬Ã¿´ÎÈ¥ÄÃÊý¾ÝµÄʱºò¶¼ÈÏΪ±ðÈË»áÐ޸ģ¬ËùÒÔÿ´ÎÔÚÄÃÊý¾ÝµÄʱºò¶¼»áÉÏËø£¬ÕâÑù±ðÈËÏëÄÃÕâ¸öÊý¾Ý¾Í»á
block Ö±µ½ËüÄõ½Ëø¡£´«Í³µÄ¹ØÏµÐÍÊý¾Ý¿âÀï±ß¾ÍÓõ½Á˺ܶàÕâÖÖËø»úÖÆ£¬±ÈÈçÐÐËø£¬±íËøµÈ£¬¶ÁËø£¬Ð´ËøµÈ£¬¶¼ÊÇÔÚ×ö²Ù×÷֮ǰÏÈÉÏËø
ÀÖ¹ÛËø
ÀÖ¹ÛËø(Optimistic Lock)£¬¹ËÃû˼Ò壬¾ÍÊǺÜÀÖ¹Û£¬Ã¿´ÎÈ¥ÄÃÊý¾ÝµÄʱºò¶¼ÈÏΪ±ðÈ˲»»áÐ޸ģ¬ËùÒÔ²»»áÉÏËø£¬µ«ÊÇÔÚ¸üеÄʱºò»áÅжÏÒ»ÏÂÔÚ´ËÆÚ¼ä±ðÈËÓÐûÓÐÈ¥¸üÐÂÕâ¸öÊý¾Ý£¬¿ÉÒÔʹÓð汾ºÅµÈ»úÖÆ¡£ÀÖ¹ÛËøÊÊÓÃÓÚ¶à¶ÁµÄÓ¦ÓÃÀàÐÍ£¬ÕâÑù¿ÉÒÔÌá¸ßÍÌÍÂÁ¿¡£ÀÖ¹ÛËø²ßÂÔ£ºÌá½»°æ±¾±ØÐë´óÓڼǼµ±Ç°°æ±¾²ÅÄÜÖ´ÐиüÐÂ
WATCH ÃüÁîµÄʵÏÖÔÀí
ÔÚ´ú±íÊý¾Ý¿âµÄ server.h/redisDb ½á¹¹ÀàÐÍÖУ¬ ¶¼±£´æÁËÒ»¸ö watched_keys
×ֵ䣬 ×ÖµäµÄ¼üÊÇÕâ¸öÊý¾Ý¿â±»¼àÊӵļü£¬ ¶ø×ÖµäµÄÖµÊÇÒ»¸öÁ´±í£¬ Á´±íÖб£´æÁËËùÓмàÊÓÕâ¸ö¼üµÄ¿Í»§¶Ë£¬ÈçÏÂͼ¡£

typedef struct
redisDb {
dict *dict; /* The keyspace for this DB */
dict *expires; /* Timeout of keys with a timeout
set */
dict *blocking_keys; /* Keys with clients waiting
for data (BLPOP)*/
dict *ready_keys; /* Blocked keys that received
a PUSH */
dict *watched_keys; /* WATCHED keys for MULTI/EXEC
CAS */
int id; /* Database ID */
long long avg_ttl; /* Average TTL, just for stats
*/
unsigned long expires_cursor; /* Cursor of the
active expire cycle. */
list *defrag_later; /* List of key names to attempt
to defrag one by one, gradually. */
} redisDb;
list *watched_keys; /* Keys WATCHED for MULTI/EXEC
CAS */ |
WATCH ÃüÁîµÄ×÷Ó㬠¾ÍÊǽ«µ±Ç°¿Í»§¶ËºÍÒª¼àÊӵļüÔÚ watched_keys ÖнøÐйØÁª¡£
¾Ù¸öÀý×Ó£¬ Èç¹ûµ±Ç°¿Í»§¶ËΪ client99 £¬ ÄÇôµ±¿Í»§¶ËÖ´ÐÐ WATCH key2 key3
ʱ£¬ Ç°ÃæÕ¹Ê¾µÄ watched_keys ½«±»Ð޸ijÉÕâ¸öÑù×Ó£º

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

void multiCommand(client
*c) {
// ²»ÄÜÔÚÊÂÎñÖÐǶÌ×ÊÂÎñ
if (c->flags & CLIENT_MULTI) {
addReplyError(c,"MULTI calls can not be nested");
return;
}
// ´ò¿ªÊÂÎñ FLAG
c->flags |= CLIENT_MULTI;
addReply(c,shared.ok);
}
/* "Touch" a key, so that if this key
is being WATCHed by some client the
* next EXEC will fail. */
void touchWatchedKey(redisDb *db, robj *key) {
list *clients;
listIter li;
listNode *ln;
// ×ÖµäΪ¿Õ£¬Ã»ÓÐÈκμü±»¼àÊÓ
if (dictSize(db->watched_keys) == 0) return;
// »ñÈ¡ËùÓмàÊÓÕâ¸ö¼üµÄ¿Í»§¶Ë
clients = dictFetchValue(db->watched_keys,
key);
if (!clients) return;
// ±éÀúËùÓпͻ§¶Ë£¬´ò¿ªËûÃÇµÄ CLIENT_DIRTY_CAS ±êʶ
listRewind(clients,&li);
while((ln = listNext(&li))) {
client *c = listNodeValue(ln);
c->flags |= CLIENT_DIRTY_CAS;
}
} |
µ±¿Í»§¶Ë·¢ËÍ EXEC ÃüÁî¡¢´¥·¢ÊÂÎñÖ´ÐÐʱ£¬ ·þÎñÆ÷»á¶Ô¿Í»§¶ËµÄ״̬½øÐмì²é£º
Èç¹û¿Í»§¶ËµÄ CLIENT_DIRTY_CAS Ñ¡ÏîÒѾ±»´ò¿ª£¬ÄÇô˵Ã÷±»¿Í»§¶Ë¼àÊӵļüÖÁÉÙÓÐÒ»¸öÒѾ±»ÐÞ¸ÄÁË£¬ÊÂÎñµÄ°²È«ÐÔÒѾ±»ÆÆ»µ¡£·þÎñÆ÷»á·ÅÆúÖ´ÐÐÕâ¸öÊÂÎñ£¬Ö±½ÓÏò¿Í»§¶Ë·µ»Ø¿Õ»Ø¸´£¬±íʾÊÂÎñÖ´ÐÐʧ°Ü¡£
Èç¹û CLIENT_DIRTY_CAS Ñ¡ÏîûÓб»´ò¿ª£¬ÄÇô˵Ã÷ËùÓмàÊÓ¼ü¶¼°²È«£¬·þÎñÆ÷ÕýʽִÐÐÊÂÎñ¡£
С×ܽ᣺
3 ¸ö½×¶Î
¿ªÆô£ºÒÔ MULTI ¿ªÊ¼Ò»¸öÊÂÎñ
Èë¶Ó£º½«¶à¸öÃüÁîÈë¶Óµ½ÊÂÎñÖУ¬½Óµ½ÕâЩÃüÁî²¢²»»áÁ¢¼´Ö´ÐУ¬¶øÊǷŵ½µÈ´ýÖ´ÐеÄÊÂÎñ¶ÓÁÐÀïÃæ
Ö´ÐУºÓÉ EXEC ÃüÁî´¥·¢ÊÂÎñ
3 ¸öÌØÐÔ
µ¥¶ÀµÄ¸ôÀë²Ù×÷£ºÊÂÎñÖеÄËùÓÐÃüÁî¶¼»áÐòÁл¯¡¢°´Ë³ÐòµØÖ´ÐС£ÊÂÎñÔÚÖ´ÐеĹý³ÌÖУ¬²»»á±»ÆäËû¿Í»§¶Ë·¢ËÍÀ´µÄÃüÁîÇëÇóËù´ò¶Ï¡£
ûÓиôÀë¼¶±ðµÄ¸ÅÄ¶ÓÁÐÖеÄÃüÁîûÓÐÌύ֮ǰ¶¼²»»áʵ¼ÊµÄ±»Ö´ÐУ¬ÒòΪÊÂÎñÌύǰÈκÎÖ¸Áî¶¼²»»á±»Êµ¼ÊÖ´ÐУ¬Ò²¾Í²»´æÔÚ¡±ÊÂÎñÄڵIJéѯҪ¿´µ½ÊÂÎñÀïµÄ¸üУ¬ÔÚÊÂÎñÍâ²éѯ²»ÄÜ¿´µ½¡±Õâ¸öÈÃÈËÍò·ÖÍ·Í´µÄÎÊÌâ
²»±£Ö¤Ô×ÓÐÔ£ºRedis ͬһ¸öÊÂÎñÖÐÈç¹ûÓÐÒ»ÌõÃüÁîÖ´ÐÐʧ°Ü£¬ÆäºóµÄÃüÁîÈÔÈ»»á±»Ö´ÐУ¬Ã»Óлعö
ÔÚ´«Í³µÄ¹ØÏµÊ½Êý¾Ý¿âÖУ¬³£³£Óà ACID ÐÔÖÊÀ´¼ìÑéÊÂÎñ¹¦ÄܵݲȫÐÔ¡£Redis ÊÂÎñ±£Ö¤ÁËÆäÖеÄÒ»ÖÂÐÔ£¨C£©ºÍ¸ôÀëÐÔ£¨I£©£¬µ«²¢²»±£Ö¤Ô×ÓÐÔ£¨A£©ºÍ³Ö¾ÃÐÔ£¨D£©¡£
×îºó
Redis ÊÂÎñÔÚ·¢ËÍÿ¸öÖ¸Áîµ½ÊÂÎñ»º´æ¶ÓÁÐʱ¶¼Òª¾¹ýÒ»´ÎÍøÂç¶Áд£¬µ±Ò»¸öÊÂÎñÄÚ²¿µÄÖ¸Áî½Ï¶àʱ£¬ÐèÒªµÄÍøÂç
IO ʱ¼äÒ²»áÏßÐÔÔö³¤¡£ËùÒÔͨ³£ Redis µÄ¿Í»§¶ËÔÚÖ´ÐÐÊÂÎñʱ¶¼»á½áºÏ pipeline Ò»ÆðʹÓã¬ÕâÑù¿ÉÒÔ½«¶à´Î
IO ²Ù×÷ѹËõΪµ¥´Î IO ²Ù×÷¡£
|