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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
²»Ö§³ÖÔ­×ÓÐ﵀ Redis ÊÂÎñÒ²½ÐÊÂÎñÂð
 
×÷Õߣºº£ÐÇ
  1763  次浏览      28
2020-11-5
 
±à¼­ÍƼö:
±¾ÎÄÖ÷Òª½éÉÜÁË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 ²Ù×÷¡£

 

   
1763 ´Îä¯ÀÀ       28
Ïà¹ØÎÄÕÂ

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

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

Êý¾ÝÖÎÀí¡¢Êý¾Ý¼Ü¹¹¼°Êý¾Ý±ê×¼
MongoDBʵս¿Î³Ì
²¢·¢¡¢´óÈÝÁ¿¡¢¸ßÐÔÄÜÊý¾Ý¿âÉè¼ÆÓëÓÅ»¯
PostgreSQLÊý¾Ý¿âʵսÅàѵ
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]
 
×îÐÂÎÄÕÂ
InfluxDB¸ÅÄîºÍ»ù±¾²Ù×÷
InfluxDB TSM´æ´¢ÒýÇæÖ®Êý¾ÝдÈë
Éî¶ÈÂþ̸Êý¾Ýϵͳ¼Ü¹¹¡ª¡ªLambda architecture
Lambda¼Ü¹¹Êµ¼ù
InfluxDB TSM´æ´¢ÒýÇæÖ®Êý¾Ý¶ÁÈ¡
×îпγÌ
OracleÊý¾Ý¿âÐÔÄÜÓÅ»¯¡¢¼Ü¹¹Éè¼ÆºÍÔËÐÐά»¤
²¢·¢¡¢´óÈÝÁ¿¡¢¸ßÐÔÄÜÊý¾Ý¿âÉè¼ÆÓëÓÅ»¯
NoSQLÊý¾Ý¿â£¨Ô­Àí¡¢Ó¦Óá¢×î¼Ñʵ¼ù£©
ÆóÒµ¼¶Hadoop´óÊý¾Ý´¦Àí×î¼Ñʵ¼ù
OracleÊý¾Ý¿âÐÔÄÜÓÅ»¯×î¼Ñʵ¼ù
³É¹¦°¸Àý
ij½ðÈÚ¹«Ë¾ Mysql¼¯ÈºÓëÐÔÄÜÓÅ»¯
±±¾© ²¢·¢¡¢´óÈÝÁ¿¡¢¸ßÐÔÄÜÊý¾Ý¿âÉè¼ÆÓëÓÅ»¯
ÖªÃûijÐÅϢͨÐŹ«Ë¾ NoSQL»º´æÊý¾Ý¿â¼¼Êõ
±±¾© oracleÊý¾Ý¿âSQLÓÅ»¯
ÖйúÒÆ¶¯ IaaSÔÆÆ½Ì¨-Ö÷Á÷Êý¾Ý¿â¼°´æ´¢¼¼Êõ