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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
ʵÏÖ¾­µä ¡°ËÄÔòÔËË㡱 Ëã·¨ÓÅ»¯ Redis ¼¯ºÏÔËËã
 
À´Ô´£ºwww.zybuluo.com ·¢²¼ÓÚ£º 2017-6-20
  5414  次浏览      28
 

Ò»ÍòÁùǧ×Ö̸̸ÈçºÎʵÏÖ¾­µä¡°ËÄÔòÔËË㡱Ëã·¨ÓÅ»¯ Redis ¼¯ºÏÔËËã

Ò»ÍòÁùǧ×Ö̸̸ÈçºÎʵÏÖ¾­µä¡°ËÄÔòÔËË㡱Ëã·¨ÓÅ»¯ Redis ¼¯ºÏÔËËã

¶þ¡¢ÎªÊ²Ã´Òª¡°ÓÅ»¯¡± Redis ¼¯ºÏÔËËã

2.1 Redis ¼¯ºÏÔËËã¼ò½é

2.1.1 ÎÞÐò¼¯ºÏ set ÃüÁî

2.1.2 ÓÐÐò¼¯ºÏ sorted set ÃüÁî

2.2.1 ÆÕͨԭÉú¼¯ºÏÃüÁîʵÏÖ

2.2.2 ÆÕͨԭÉú¼¯ºÏÃüÁî+ÊÂÎñʵÏÖ

2.2.3 ¼¯ºÏ¸öÊý²»¶¨¡¢ÐèÇ󳡾°¶à±äµÄ¼¯ºÏÔËËã

2.2.4 ×ܽáÐèÒª¡°ÓÅ»¯¡±µÄÔ­Òò

2.2.4 lua ½Å±¾µÄ¼òµ¥Ê¾Àý

Èý¡¢Redis ¼° Lua »ù´¡ÖªÊ¶

3.1 Redis ¿Í»§¶ËÓë·þÎñ¶Ë½»»¥

3.1.1 ¿Í»§¶ËÓë·þÎñ¶Ë½»»¥

3.1.2 ¿Í»§¶Ë»º³åÇøÒÔ¼°ÈíÓ²ÐÔÏÞÖÆ

3.2 Redis ÖÐ Lua »·¾³

3.2.1 ÎÒ¶Ô Lua ÓïÑÔµÄÀí½â

3.2.2 ¿Í»§¶ËʹÓà Lua ½Å±¾Óë Redis ½»»¥µÄ¼òµ¥Ê¾Àý

3.2.3 Lua ÓïÑÔÈçºÎ "ǶÈë" Redis »·¾³

3.2.4 eval ÃüÁî¸ñʽ¼°ÆäÖ´Ðйý³Ì

ËÄ¡¢¡°ËÄÔòÔËË㡱Ëã·¨»ù´¡ÖªÊ¶

4.1.1 ÖÐ׺±í´ïʽÓëºó׺±í´ïʽ

4.1.3 Õ»¡¢¶ÓÁÐÓë²Ù×÷·ûÓÅÏȼ¶

4.2 ÖÐ׺±í´ïʽתºó׺±í´ïʽµÄ¹ý³Ì

4.2.2 ת»»¹ý³ÌÏêϸʾÀý

4.3 ¼ÆËãºó׺±í´ïʽ¹ý³Ì

Îå¡¢Lua ½Å±¾ÊµÏÖ ¡°ËÄÔòÔËË㡱Ëã·¨¡°ÓÅ»¯¡±¼¯ºÏÔËËã

5.1 ´ÓÀíÂÛµ½ lua ½Å±¾ÊµÕ½¸ÅÊö

Ò»¡¢±¾ÎĸÅÊö

±¾ÎÄÖ÷Òª½éÉÜΪʲôҪʹÓà Lua ½Å±¾ÔÚ Redis »·¾³ÖÐÓÅ»¯¼¯ºÏÔËË㣬ÒÔ¼°ÈçºÎʹÓà Lua ½Å±¾ÔÚ Redis »·¾³ÖÐÓÅ»¯¼¯ºÏÔËËã¡£ÔÚ½éÉÜÕâÁ½²¿·ÖÄÚÈÝÖм䣬»¹»á´©²å׎éÉÜ Redis Êý¾Ý¿â ºÍ Lua ÓïÑÔµÄһЩ»ù´¡ÖªÊ¶£¬ÒÔ¼°¾­µä¡°ËÄÔòÔËË㡱Ëã·¨µÄ»ù´¡ÖªÊ¶¡£

¶þ¡¢ÎªÊ²Ã´Òª¡°ÓÅ»¯¡± Redis ¼¯ºÏÔËËã

2.1 Redis ¼¯ºÏÔËËã¼ò½é

Redis ÖÐÓÐÁ½ÖÖ¼¯ºÏÀàÐÍ£º set £¨ÎÞÐò¼¯ºÏ£© ºÍ sorted set £¨ÓÐÐò¼¯ºÏ£©£¬Õë¶Ô¼¯ºÏµÄµ¥´ÎÔËË㣨½»£¬²¢£¬²î£©ÓÐÔ­ÉúµÄ Redis ÃüÁîÖ§³Ö¡£

2.1.1 ÎÞÐò¼¯ºÏ set ÃüÁî

sadd key member [member ...]

sinter key [key ...]

sinterstore destination key [key ...]

sunion key [key ...]

sunionstore destination key [key ...]

sdiff key [key ...]

sdiffstore destination key [key ...]

sismember key member

smembers key

...

¸ü¶à Redis ÎÞÐò¼¯ºÏÏà¹ØÃüÁîÇë²Î¼û£º£º Redis set

2.1.2 ÓÐÐò¼¯ºÏ sorted set ÃüÁî

zadd key [NX|XX] [CH] [INCR] score member [score member ...]

zinterstore destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]

zunionstore destination numkeys key [key ...] WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]

...

sorted set ûÓÐ zinter ¡¢ zunion £¬Ò²Ã»ÓÐ zdiffstore ¡£ ÆäÖУ¬ zdiffstore µÄÓïÒåÐèҪͨ¹ý×éºÏÆäËûÃüÁîÀ´ÊµÏÖ¡£

¸ü¶àRedis ÓÐÐò¼¯ºÏÏà¹ØÃüÁîÇë²Î¼û£º Redis zset

2.1.3 ¼¯ºÏÔËËãʾÀý

ÎÒÃÇÏȼòµ¥µØ¿´Ò»Ï sadd ¡¢ sunionstore ÃüÁî¡£ setX £¨°üº¬[a,b,c]£© ºÍ setY £¨°üº¬[c,d]£© ÊÇÎÞÐò¼¯ºÏ£¬Í¨¹ýÇó setX ºÍ setY µÄ²¢¼¯£¬²¢°Ñ½á¹û´æÈ뼯ºÏ setZ ¡£¿ÉÒÔµÃÖª£¬ÔÚ¼¯ºÏ setX »òÕßÔÚ setY ÖеÄÔªËØÓÐ[a,b,c,d]¡£

ͼ1£ºÎÞÐò¼¯ºÏ set µÄ Çó²¢¼¯ ʾÀý

È»ºóÔÙ¿´Ò»Ï zadd ¡¢ zinterstore ÃüÁî¡£ zsetX £¨°üº¬[a:1,b:2,c:3]£© ºÍ zsetY £¨°üº¬[c:3,d:6]£© ÊÇÓÐÐò¼¯ºÏ£¬Í¨¹ýÇó zsetX ºÍ zsetY µÄ½»¼¯£¬²¢°Ñ½á¹û´æÈ뼯ºÏ zsetZ ¡£¿ÉÒÔµÃÖª£¬ÔÚ¼¯ºÏ zsetX ²¢ÇÒÔÚ zsetY ÖеÄÔªËØÓÐ[c:6]¡£

ͼ2£ºÓÐÐò¼¯ºÏ sorted set µÄ Çó½»¼¯ ʾÀý

2.2 ΪʲôҪ¡°ÓÅ»¯¡±

¼ÙÉèÓÐÕâÑùµÄÐèÇ󳡾°

ÓбíʾÐÔ±ðΪÄÐÐÔµÄÎÞÐò¼¯ºÏ male £¬ÔªËØÓÐ [ ÕÅÈý£¬ÀîËÄ£¬ÍõÎå ]£¬

ÓбíʾÄêÁäµÄÓÐÐò¼¯ºÏ age £¬ÔªËØÓÐ [ ÕÅÈý:20£¬ÀîËÄ:35£¬ÍõÎå:43£¬ÕÔÁù:50 ]

ÓбíʾסַÔÚÉϺ£µÄÎÞÐò¼¯ºÏ sh £¬ÔªËØÓÐ [ ÀîËÄ£¬ÍõÎå ]¡£

ÏÖÔÚÐèÒªÕÒ³ö¡° ¾ÓסÔÚÉϺ£²¢ÇÒÄêÁä´óÓÚ30ËêµÄÄÐÐÔ ¡±¡£

2.2.1 ÆÕͨԭÉú¼¯ºÏÃüÁîʵÏÖ

ÏÈÕÒ³öÄêÁä´óÓÚ30ËêµÄÄÐÐÔ£¬ÁÙʱ½á¹û´æÎªÓÐÐò¼¯ºÏ tempSet1 £¬ÔªËØÓÐ [ ÀîËÄ:35£¬ÍõÎå:43£¬ÕÔÁù:50 ]£»

½Ó׎« tempSet1 ºÍ male ×÷½»¼¯£¬ÁÙʱ½á¹û´æÎªÓÐÐò¼¯ºÏ tempSet2 £¬ÔªËØÓÐ [ ÀîËÄ:35£¬ÍõÎå:43 ]£»

È»ºó½« tempSet2 ºÍ sh ×÷½»¼¯£¬×îÖÕ½á¹û´æÎªÓÐÐò¼¯ºÏ resultSet £¬ÔªËØÓÐ [ ÀîËÄ:35£¬ÍõÎå:43 ]£»

ËùÒÔ¡° ¾ÓסÔÚÉϺ£²¢ÇÒÄêÁä´óÓÚ30ËêµÄÄÐÐÔ ¡±ÓÐ ÀîËĺÍÍõÎå ¡£

ÈçͼËùʾ£º

ͼ3£ºÔ­ÉúÃüÁîÕÒ³ö¡° ¾ÓסÔÚÉϺ£²¢ÇÒÄêÁä´óÓÚ30ËêµÄÄÐÐÔ ¡±Ê¾Àý

´ÓͼÖÐÎÒÃÇ¿ÉÒÔ¿´³ö£¬ÒªÕÒ³ö¡° ¾ÓסÔÚÉϺ£²¢ÇÒÄêÁä´óÓÚ30ËêµÄÄÐÐÔ ¡±ÐèÒª¶à´Î½øÐм¯ºÏÔËË㣬¹ý³ÌÖÐÓë·þÎñÆ÷Óжà´Î½»»¥£¬²¢ÇÒÎÞ·¨±£Ö¤Ô­×ÓÐÔ¡£

2.2.2 ÆÕͨԭÉú¼¯ºÏÃüÁî+ÊÂÎñʵÏÖ

µ±È»£¬ÎÒÃÇ¿ÉÒÔʹÓà Redis ÊÂÎñÀ´±£Ö¤¼ÆËã tempSet1 £¬ tempSet2 ºÍ resultSet µÄÔ­×ÓÐÔ£¬µ«ÊÇ£¬ÈÔ¾Éû·¨±ÜÃâ¿Í»§¶ËÓë·þÎñ¶ËµÄ¶à´Î½»»¥¡£ÈçͼËùʾ£º

ͼ4£ºÔ­ÉúÃüÁî+ÊÂÎñÕÒ³ö¡° ¾ÓסÔÚÉϺ£²¢ÇÒÄêÁä´óÓÚ30ËêµÄÄÐÐÔ ¡±Ê¾Àý

2.2.3 ¼¯ºÏ¸öÊý²»¶¨¡¢ÐèÇ󳡾°¶à±äµÄ¼¯ºÏÔËËã

ÁíÍ⣬ÎÒÃÇÔÙ¿´Ò»ÏÂÁí¼¸ÖÖÐèÇó£¬ÕÒ³ö¡° ÄêÁä´óÓÚ40ËêÇÒ²»¾ÓסÔÚÉϺ£µÄÄÐÐÔ ¡±£¬ÕÒ³ö¡° ÄêÁäСÓÚ30Ëê¾ÓסÔÚÉϺ£µÄÄÐÐÔ ¡±µÈµÈ¡£ÆäÖУ¬ÎÒÃǻᷢÏÖ£¬Õë¶ÔÿһÖÖÐèÇó£¬ÎÒÃÇÐèҪд¶àÌ× redis Ô­ÉúÃüÁîµÄ×éºÏÂß¼­(»òÕßÔÙ¼ÓÉÏ redis ÊÂÎñ)£»

ÔÙÕߣ¬Èç¹ûÎÒÃÇ»¹ÓбðµÄ¼¯ºÏ£¬±ÈÈç±íʾÐÔ±ðΪŮÐÔµÄÎÞÐò¼¯ºÏ female £¬ÔªËØÓÐ[ ÍõÀö£¬Àîºì£¬ÕÅÓ¢ ]£¬±íʾ֥ÂéÐÅÓ÷ֵÄÓÐÐò¼¯ºÏ credit £¬ÔªËØÓÐ[ ÍõÀö:550£¬Àîºì:650£¬ÕÅÓ¢:730 ]£»£¨×¢£ºÐÅÓ÷֣¬ÄêÁäµÈÓÐÐò¼¯ºÏ±íʾµÄÊÇÓû§µÄÈ«¼¯£¬Êµ¼ÊÉϼ¯ºÏӦΪ age :[ÍõÀö:18£¬Àîºì:19£¬ÕÅÓ¢:19£¬ÕÅÈý:20£¬ÀîËÄ:35£¬ÍõÎå:43£¬ÕÔÁù:50]£¬ credit :[ÍõÀö:550£¬Àîºì:650£¬ÕÅÈý:675£¬ÀîËÄ:693£¬ÕÅÓ¢:730£¬ÕÔÁù:740£¬ÍõÎå:751]£©µÈµÈ¡£

ÏÖÔÚ×ܵļ¯ºÏÐÅÏ¢ÈçÏ£º

male : [ ÕÅÈý£¬ÀîËÄ£¬ÍõÎå ]

female : [ ÍõÀö£¬Àîºì£¬ÕÅÓ¢ ]

sh : [ ÀîËÄ£¬ÍõÎå ]¡£

age : [ ÍõÀö:18£¬Àîºì:19£¬ÕÅÓ¢:19£¬ÕÅÈý:20£¬ÀîËÄ:35£¬ÍõÎå:43£¬ÕÔÁù:50 ]

credit : [ ÍõÀö:550£¬Àîºì:650£¬ÕÅÈý:675£¬ÀîËÄ:693£¬ÕÅÓ¢:730£¬ÕÔÁù:740£¬ÍõÎå:751 ]

ÄÇôÈç¹ûÏÖÔÚÐèÒªÕÒ³ö£¬¡°ÄÜ¿´°×ÁìÈÕ¼ÇÇÒ¾ÓסÔÚÉϺ£µÄÄÐÐÔ¡±£¬ÄÇôÏÈÕÒµ½ÄÐÐÔ£¬ÔÙÕÒµ½¾ÓסÔÚÉϺ£µÄ£¬È»ºóÕÒµ½Ö¥ÂéÐÅÓ÷ִóÓÚ750µÄ£¨×¢£ºÖ»ÓзÖÊý´óÓÚµÈÓÚ750²ÅÄÜ¿´°×ÁìÈռǣ¬Ð£Ô°Èռǵȣ©£¬Óà Redis Ô­ÉúÃüÁî¼ÓÊÂÎñÓë·þÎñ¶Ë¶à´Î½»»¥£¬¼¸¸ö¼¯ºÏ×÷ÔËËãºóÎÒÃÇÒ»ÏÂ×Ó¾ÍÖªµÀÖ»Óиô±ÚÀÏÍõ¡ª¡ª ÍõÎå ÄÜ¿´"°×ÁìÈÕ¼Ç"¡£

´Ó´Ë¿ÉÒÔ¿´³ö£¬µ±ÎÒÃǵļ¯ºÏ¸öÊý²»¶¨£¬ÐèÇ󳡾°¶à±äµÄÇé¿öÏ£¬ÓÃÔ­Éú¼¯ºÏÃüÁî»òÕßÊÂÎñÐèÒª¿Í»§¶Ë¶àÌ×±àд¸´ÔÓµÄÂß¼­¡££¨ÕâЩ¶¼ÊÇÎÒʵ¼Ê¿ª·¢ÖÐÓöµ½µÄÐèÇóÎÊÌâ¡££©

2.2.4 ×ܽáÐèÒª¡°ÓÅ»¯¡±µÄÔ­Òò

ÄÇôÎÒÃÇ´óÖ¿ÉÒԵóö½áÂÛ£¬ÎªÊ²Ã´ÐèÒª¡°ÓÅ»¯¡± Redis ¼¯ºÏÔËËã¡£

Ô­Éú¼¯ºÏÃüÁî ²»Ö§³Ö¶à´Î ½»²¢²î¼¯ºÏ »ìºÏ ÔËË㣻

ʹÓÃÔ­Éú¼¯ºÏÃüÁî¶à´Î¼¯ºÏÔËËã ²»Äܱ£Ö¤Ô­×ÓÐÔ £»

ʹÓÃÔ­Éú¼¯ºÏÃüÁî¶à´ÎÓë·þÎñ¶Ë½»»¥ ·Ç³£ºÄʱ £»

ʹÓà Redis ÊÂÎñͬÑùÎÞ·¨±ÜÃâÓë·þÎñ¶Ë¶à´Î½»»¥ £»

ʹÓÃÔ­Éú¼¯ºÏÃüÁî»òÕßÊÂÎñÐèÒª ¿Í»§¶Ë±àд¸´ÔÓÂß¼­ ¡£

¼ÈȻ֪µÀÁËΪʲôҪ¡°ÓÅ»¯¡±£¬²»ÓÅ»¯Ã»·¨±£Ö¤Ò»´Î½»»¥×÷¶à´Î¼¯ºÏ»ìºÏÔËË㣬²»ÓÅ»¯Ã»·¨±£Ö¤¶à´Î¼¯ºÏÔËËãÔ­×ÓÐÔ£¬²»ÓÅ»¯Ã»·¨¼õÉÙ½»»¥´«ÊäµÄºÄʱ£¬²»ÓÅ»¯ÐèÒª¿Í»§¶Ë±àд¶àÌ׸´ÔÓÂß¼­£¬ÄÇôÎÒÃÇÈçºÎÈ¥×öÓÅ»¯ÄØ£¿Õâʱºò¾Í¸Ã " Lua ½Å±¾ "ÒÔ¼°¾­µä "ËÄÔòÔËËã" Ëã·¨µÇ³¡ÁË¡£ Lua ½Å±¾ Êǽâ¾öÒ»´Î½»»¥£¬ºÄʱÒÔ¼°Ô­×ÓÐÔÎÊÌâµÄ£¬¶ø¾­µä "ËÄÔòÔËËã" Ëã·¨Ôò½â¾ö¼¯ºÏ¸öÊý²»¶¨£¬ÒµÎñ³¡¾°¶à±äµÄÎÊÌâµÄ¡£

2.2.4 lua ½Å±¾µÄ¼òµ¥Ê¾Àý

ÏÂÃæµÄÕ½ڻáÖØµã½éÉÜ " Lua ½Å±¾ "ÒÔ¼°¾­µä "ËÄÔòÔËËã" Ëã·¨¡£ÕâÀïÏÈÀ´¿´Ò»¸ö¼òµ¥µÄÀý×Ó£¬»¹ÊǸղŵÄÐèÇ󳡾°£¬ÕÒ³ö¡° ¾ÓסÔÚÉϺ£²¢ÇÒÄêÁä´óÓÚ30ËêµÄÄÐÐÔ ¡±¡£

ͼ5£ºlua ½Å±¾×éºÏÃüÁîÕÒ³ö¡° ¾ÓסÔÚÉϺ£²¢ÇÒÄêÁä´óÓÚ30ËêµÄÄÐÐÔ ¡±Ê¾Àý

ͼ6£ºÕÒ³ö¡° ¾ÓסÔÚÉϺ£²¢ÇÒÄêÁä´óÓÚ30ËêµÄÄÐÐÔ ¡±µÄ¼òµ¥lua ½Å±¾

ʹÓà lua ½Å±¾×éºÏÁ˶àÌõ redis ÃüÁÔÚ¿Í»§¶Ëµ÷ÓõÄʱºò£¬Ö»ÐèÒªÓë·þÎñ¶Ë½»»¥Ò»´Î£¬°Ñ½Å±¾´«µ½·þÎñ¶Ë£¬ÕâÀïÖ»ÓÐÒ»´Î´«Ê䣬·þÎñ¶Ë½ÓÊܵ½½Å±¾ºó£¬Ô­×ÓÐÔµØÖ´ÐÐ lua ½Å±¾ÀïµÄ¶àÌõ redis ÃüÁî¡£

ÕâÀïÈç¹û°Ñ¼¯ºÏµÄ½»²¢²îÒÔ¼°´óÓÚСÓڵȱȽϷûÓ³Éä³É·ûºÅ &&£¬II£¬^£¬>£¬< µÈ£¬ÄÇôÕÒ³ö¡° ¾ÓסÔÚÉϺ£²¢ÇÒÄêÁä´óÓÚ30ËêµÄÄÐÐÔ ¡±µÄ¼¯ºÏÔËËã±í´ïʽ¾Í¿ÉÒÔ±íʾΪ age:score>30 && male && sh £¬ÕÒ³ö¡° ÄÜ¿´°×ÁìÈÕ¼ÇÇÒ¾ÓסÔÚÉϺ£µÄÄÐÐÔ ¡±µÄ¼¯ºÏÔËËã±í´ïʽ¾Í¿ÉÒÔ±íʾΪ credit:score>=750 && male && sh £»ÆäËûÐèÇ󳡾°Óë´ËÀàËÆ£¬¶¼¿ÉÒÔ³éÏó³ÉÒ»¸öÕâÑùµÄ¼¯ºÏÔËËã±í´ïʽ¡£

ͼ7£ºlua ½Å±¾´¦Àí¼¯ºÏ¸öÊý²»¶¨£¬ÒµÎñÐèÇó¶à±äµÄÇé¿ö

ÄÇô£¬Ö»Òª½Å±¾·â×°ºÃÁËÎÞÐò¼¯ºÏºÍÓÐÐò¼¯ºÏµÄ½»²¢²îµÈÃüÁ½ÓÊÕÉÏÊöÄÇÑùµÄ¼¯ºÏÔËËã±í´ïʽ£¬²¢ÇÒÓÐËã·¨Âß¼­´¦Àí½»²¢²îµÈ¼¯ºÏÔËËãµÄÏȺó˳Ðò£¬ÄÇô¾ÍÄÜÖ§³Ö¶à¸ö¼¯ºÏÔËËãÒÔ¼°Âú×㲻ͬµÄÐèÇ󳡾°ÁË£¬ÕâÀïËã·¨¾ÍÊǾ­µäµÄ¡°ËÄÔòÔËË㡱Ëã·¨£¬Ö»²»¹ýΪÁËÂú×ã¾ßÌåµÄÐèÇó£¬ÎÒÃÇÉÔ΢×öÁËÒ»ÏÂËã·¨µÄ±äÐΣ¬ÉÔºó»áÏêϸ½éÉÜ¡£

Èý¡¢Redis ¼° Lua »ù´¡ÖªÊ¶

ÔÚ½éÉÜÓà lua ½Å±¾ÊµÏÖ¾­µäËÄÔòÔËËãËã·¨¡°ÓÅ»¯¡±¼¯ºÏÔËËã֮ǰ£¬ÎÒÃÇÏÈÀ´Á˽âһϠRedis ÒÔ¼° Lua Ïà¹ØµÄ»ù´¡ÖªÊ¶£¬ÒÔ±ãºóÐøÉîÈë½éÉܾßÌåµÄ½Å±¾ÓëËã·¨¡£

3.1 Redis ¿Í»§¶ËÓë·þÎñ¶Ë½»»¥

3.1.1 ¿Í»§¶ËÓë·þÎñ¶Ë½»»¥

Redis ·þÎñÆ÷ÊÇ Ò»¶Ô¶à ·þÎñÆ÷³ÌÐò£¬Ò»¸ö·þÎñÆ÷¿ÉÒÔÓë¶à¸ö¿Í»§¶Ë½¨Á¢ÍøÂçÁ¬½Ó£¬ÕâÀïµÄ¿Í»§¶ËÖ¸µÄÊÇÆÕͨ¿Í»§¶Ë£»Redis »¹ÓРα¿Í»§¶Ë £¬Ëü´¦ÀíµÄÃüÁîÇëÇóÀ´×Ô·þÎñ¶ËµÄ lua ½Å±¾£¨Ö´ÐÐ Redis ÃüÁ»òÕß AOF Îļþ£¨»¹Ô­Êý¾Ý¿â״̬£©£¬ÎÞÐèͨ¹ýÍøÂçÁ¬½Ó£¬Ö±½ÓÔÚ·þÎñ¶ËÖ´ÐС£ÆäÖУ¬ÕâÁ½¸öα¿Í»§¶ËÓÖÉÔÓв»Í¬£º

Lua α¿Í»§¶Ë

·þÎñÆ÷ÔËÐеÄÕû¸öÉúÃüÖÜÆÚ»áÒ»Ö±´æÔÚ

·þÎñÆ÷¹Ø±Õʱ¹Ø±Õ

AOF α¿Í»§¶Ë

ÔØÈë AOF Îļþ»¹Ô­Êý¾Ý¿âʱ´æÔÚ

ÔØÈëÍê³Éºó¹Ø±Õ

ÁíÍ⣬Redis ·þÎñÆ÷ʹÓà µ¥Ï̵߳¥½ø³Ì ·½Ê½´¦ÀíÃüÁîÇëÇóµÄ£¬Í¬Ê±´¦Àí¶à¸ö¿Í»§¶ËÃüÁîÇëÇóÐèÒªÅŶӵȴý¡£

ͼ8£ºÆÕͨ¿Í»§¶Ë£¬Î±¿Í»§¶ËÓë·þÎñ¶Ë½»»¥

3.1.2 ¿Í»§¶Ë»º³åÇøÒÔ¼°ÈíÓ²ÐÔÏÞÖÆ

ÿ¸ö Redis ¿Í»§¶ËÓë·þÎñ¶ËÁ¬½Óʱ£¬·þÎñ¶Ë»áΪÿ¸ö¿Í»§¶ËµÄÁ¬½Ó´´½¨ÏàÓ¦µÄ redisClient ½á¹¹£¨¿Í»§¶Ë״̬£©£¬Ëü±£´æ×ſͻ§¶ËµÄµ±Ç°×´Ì¬ÐÅÏ¢£¨±È½ÏͨÓõÄÊôÐÔ£©ÒÔ¼°Ö´ÐÐÏà¹Ø¹¦ÄÜÐèÒªÓõ½µÄÊý¾Ý½á¹¹£¨ºÍÌØ¶¨¹¦ÄÜÏà¹ØµÄÊôÐÔ£©¡£

typedef structredisClient{

// ...

intfd; // ÃèÊö·û£º-1-α¿Í»§¶Ë£¬ ´óÓÚ-1µÄÕûÊý-ÆÕͨ¿Í»§¶Ë

robj*name; // Ãû×Ö

intflag; // ±ê־룬±íʾ¿Í»§¶Ë½Çɫ״̬µÈ£º REDIS_SLAVE-´Ó·þÎñÆ÷£¬ REDIS_MULTI-ÕýÖ´ÐÐÊÂÎñ

sds querybuf; // ÊäÈ뻺³å£¬¿Õ¼ä¸ù¾ÝÊäÈ붯̬ÉìËõ£¬×î´óΪ1G£¬³¬³ö¿Í»§¶Ë»á±»¹Ø±Õ

/**
* ÒÔÏÂÁ½¸öΪ¹Ì¶¨´óСÊä³ö»º³åÇøÁ½¸öÊôÐÔ £¬ REDIS_REPLY_CHUNK_BYTES = 16*1024 ¼´ 16 KB
*/
charbuf[REDIS_REPLY_CHUNK_BYTES]; // ¹Ì¶¨´óС»º³åÇø×Ö½ÚÊý×é
intbufpos; // ¹Ì¶¨´óС»º³åÇøÒÑʹÓÃ×Ö½ÚÊý

list*reply; // ¿É±ä´óС»º³åÇø£¬Á´±í¹¹³É£¬ ÀíÂÛÉϿɱä´óС»º³åÇø¿ÉÎÞÏÞ´ó£¬Êµ¼ÊÉϲ»Äܳ¬¹ýÓ²ÐÔÏÞÖÆ

robj**argv; // ÃüÁî²ÎÊý£¬Èç "set age 18"

intargc; // ÃüÁî²ÎÊý¸öÊý£¬ ÈçÉÏÊöÃüÁîÔòΪ 3£¬ set ±¾ÉíÒ²ÊÇÃüÁî²ÎÊý

structredisCommand*cmd; // ÃüÁîµÄʵÏÖº¯Êý

intauthenticated; // Éí·ÝÑéÖ¤£º0-δͨ¹ý£¬1-ͨ¹ý

time_tctime; // ¿Í»§¶Ë´´½¨Ê±¼ä

time_tlastinteration; // ¿Í»§¶ËÓë·þÎñ¶Ë×îºóÒ»´Î»¥¶¯Ê±¼ä

time_tobuf_soft_limit_reached_time; // Êä³ö»º³åÇøµÚÒ»´Îµ½´ïÈíÐÔÏÞÖÆµÄʱ¼ä

// ...

}redisClient

ÕâÀï×ÅÖØ½²½²£¬ÊäÈ뻺³åÇø£¬Êä³ö»º³åÇø£¨°üÀ¨Ó²ÐÔÏÞÖÆÓëÈíÐÔÏÞÖÆ£©¡£

ÊäÈ뻺³åÇø

¿Í»§¶Ë״̬½á¹¹ redis-cli ±£´æµÄÊäÈ뻺³åÇø±£´æ¿Í»§¶Ë·¢Ë͵ÄÃüÁîÇëÇó¡£»º³åÇøµÄ´óС¸ù¾ÝÊäÈëÄÚÈÝ ¶¯Ì¬µØËõСºóÕßÀ©´ó £¬×î´ó ²»Äܳ¬¹ý 1G ¡£

Èç¹û¿Í»§¶Ë·¢Ë͵ÄÃüÁîÇëÇó´óС³¬¹ýÁËÊäÈ뻺³åÇøµÄÏÞÖÆ´óС£¨Ä¬ÈÏΪ1GB£©£¬ÄÇôÕâ¸ö¿Í»§¶Ë½«»á±»·þÎñÆ÷¹Ø±Õ¡£

Êä³ö»º³åÇø

¹Ì¶¨´óС»º³åÇø ¡ª¡ª×Ö½ÚÊý×é

±£´æ³¤¶È½ÏСµÄ»Ø¸´

±ÈÈç'OK'

±ÈÈç¼ò¶ÌµÄ×Ö·û´®Öµ

±ÈÈçÕûÊýÖµ

±ÈÈç´íÎ󻨏´µÈ

¿É±ä´óСµÄ»º³åÇø ¡ª¡ªreplyÁ´±í

±£´æ³¤¶È½Ï´óµÄ»Ø¸´

±ÈÈçÒ»¸ö·Ç³£³¤µÄ×Ö·û´®Öµ

±ÈÈçÒ»¸öÓкܶàÏî×é³ÉµÄÁбí

±ÈÈç°üº¬Á˺ܶàÔªËØµÄ¼¯ºÏµÈµÈ

Èç¹û·¢Ë͸ø¿Í»§¶ËµÄÃüÁî»Ø¸´´óС³¬¹ýÁËÊä³ö»º³åÇøµÄ´óС£¬ÄÇôÕâ¸ö¿Í»§¶Ë½«»á±»·þÎñÆ÷¹Ø±Õ¡£·þÎñ¶ËʹÓÃÁ½ÖÖģʽÀ´ÏÞÖÆ¿Í»§¶ËÊä³ö»º³åÇøµÄ´óС

Ó²ÐÔÏÞÖÆ

Èç¹ûÊä³ö»º³åÇø´óС³¬¹ýÁËÓ²ÐÔÏÞÖÆÉèÖõĴóС£¬ÄÇô·þÎñ¶ËÁ¢¼´¹Ø±Õ¿Í»§¶Ë¡£

ÈíÐÔÏÞÖÆ

Èç¹ûÊä³ö»º³åÇø´óС³¬¹ýÁËÈíÐÔÏÞÖÆÉèÖõĴóС£¬ »¹Ã»³¬¹ýÓ²ÐÔÏÞÖÆ£¬ÄÇô·þÎñ¶Ë½²Ê¹Óÿͻ§¶Ë״̬½á¹¹µÄ obuf_soft_limit_reached_time ÊôÐÔ¼ÇÏ¿ͻ§¶Ëµ½´ïÈíÐÔÏÞÖÆµÄÆðʼʱ¼ä£»

Ö®ºó·þÎñ¶Ë»á¼ÌÐø¼à¿Ø¿Í»§¶Ë£¬Èç¹ûÊä³ö»º³åÇø´óС Ò»Ö±³¬¹ýÈíÐÔÏÞÖÆ £¬²¢ÇÒ ³ÖÐøÊ±¼ä³¬¹ý·þÎñÆ÷É趨µÄʱ³¤ £¬ÄÇô·þÎñ¶Ë½²¹Ø±Õ¿Í»§¶Ë£»

Ïà·´µØ£¬Èç¹ûÊä³ö»º³åÇø´óСÔÚÖ¸¶¨Ê±¼äÄÚ²»ÔÙ³¬³öÈíÐÔÏÞÖÆ£¬ÄÇô¿Í»§¶Ë¾Í²»»á±»¹Ø±Õ£¬²¢ÇÒ obuf_soft_limit_reached_time ÊôÐÔÖµÒ²»á±»ÇåÁã¡£

ʹÓà client-output-buffer-limit Ñ¡Ïî¿ÉΪÆÕͨ¿Í»§¶Ë£¬´Ó·þÎñÆ÷¿Í»§¶Ë£¬Ö´Ðз¢²¼Óë¶©ÔĵĿͻ§¶Ë·Ö±ðÉèÖò»Í¬µÄÈíÐÔÏÞÖÆºÍÓ²ÐÔÏÞÖÆ£¬¸ñʽÈçÏ£º

client-output-buffer-limit < class > < hard limit > < soft limit > < soft seconds >

client-output-buffer-limit normal 0 0 0 ¡ª¡ª 0 Ö¸²»ÏÞÖÆ

client-output-buffer-limit slave 256mb 64mb 60

client-output-buffer-limit pubsub 32mb 8mb 60

µ±È»£¬Í¨¹ý client list ÃüÁî¿É²é¿´ redis ¿Í»§¶Ë½á¹¹µÄ²¿·Öµ±Ç°×´Ì¬£¬ÈçÏ£º

ͼ9£ºÍ¨¹ý client list ÃüÁî²é¿Í»§¶Ëµ±Ç°×´Ì¬

3.2 Redis ÖÐ Lua »·¾³

3.2.1 ÎÒ¶Ô Lua ÓïÑÔµÄÀí½â

Lua ÓïÑÔÊÇÒ»ÃÅǶÈëʽ½Å±¾ÓïÑÔ¡£ÕâÀïÓÐÁ½¸ö¹Ø¼ü×Ö£º ǶÈëʽ ºÍ ½Å±¾ ¡£ ¡°½Å±¾¡± ÔÚÕâÀïÊÇÖ¸ÎÞÐè±àÒ룬°´ÐÐÖ´ÐУ¬ËüµÄÓïÑÔ·ç¸ñ¸ú python ºÍ perl ÓïÑÔ½ÏΪÀàËÆ£» ¡°Ç¶Èëʽ¡± ÔÚÕâÀïÊÇÖ¸Ëüͨ¹ýǶÈëij¸ö»·¾³£¬ÔÙ½áºÏËÞÖ÷ÓïÑÔÄ³Ð©ÌØÐÔ£¨ÀýÈçÔÚ Redis »·¾³Öпɵ÷Óà C º¯Êý£©À´·¢»ÓËü±¾Éí×÷ΪÓïÑÔµÄ×÷Óá£

ÕâÀï¶ÔÓÚ¡°Ç¶Èëʽ¡±µÄÀí½â£¬Èç¹ûÒÔ Lua ÓïÑÔǶÈëµ½ Redis »·¾³À´¾ÙÀýµÄ»°£¬Òâ˼ÊÇ Redis ·þÎñ¶ËÖÐÓÐ Lua »·¾³£¬Í¨¹ýÔÚ Redis ·þÎñ¶ËÖ´ÐÐ lua ½Å±¾£¬Äܹ»ÊµÏÖÓи´ÔÓÂß¼­µÄ¶à¸ö redis ÃüÁîµÄÔ­×ÓÖ´ÐС£

3.2.2 ¿Í»§¶ËʹÓà Lua ½Å±¾Óë Redis ½»»¥µÄ¼òµ¥Ê¾Àý

Redis ´Ó 2.6 °æ±¾ ¿ªÊ¼ÒýÈë¶Ô Lua ½Å±¾µÄÖ§³Ö£¬Í¨¹ýÔÚ·þÎñÆ÷ÖÐǶÈë Lua »·¾³£¬Redis ¿Í»§¶Ë¿ÉÒÔʹÓà Lua ½Å±¾£¬Ö±½ÓÔÚ·þÎñÆ÷ Ô­×ÓµØ Ö´Ðжà¸öÃüÁî¡£

3.2.2.1 lua ½Å±¾Êä³ö Hello World µÄÀý×Ó

ÏÈÀ´¿´¸ö¼òµ¥µÄÀý×Ó£º

ͼ10£ºlua ½Å±¾Êä³ö hello world

´ÓÉÏͼ¿ÉÖª£¬µ±·þÎñ¶Ë¿ªÆôµÄ״̬Ï£¬redis ¿Í»§¶Ëͨ¹ý eval ÃüÁîÖ´ÐÐÁË lua ½Å±¾£¬½Å±¾ÄÚÈÝΪ return 'Hello World' £¬½Å±¾´«Èë²ÎÊýÖÐ KEY µÄ¸öÊýΪ 0 ¸ö£»ÎÒÃÇ¿´µ½¿Í»§¶Ë´òÓ¡Á˽ű¾Àï·µ»ØµÄ×Ö·û´® Hello World ¡£

3.2.2.2 lua ½Å±¾Óë Redis ½»»¥µÄÀý×Ó

ÔÙ¿´Ò»¸ö lua ½Å±¾Óë Redis ½»»¥µÄÀý×Ó£º

ͼ11£ºlua ½Å±¾Óë redis ½»»¥£¬ set hello world ºÍ get hello

´ÓÉÏͼ¿ÉÖª£¬µÚÒ»´Î½»»¥ÖУ¬redis ¿Í»§¶Ëͨ¹ý eval ÃüÁîÖ´ÐÐÁË lua ½Å±¾£¬½Å±¾ÄÚÈÝΪ return redis.pcall('set', KEYS[1], ARGV[1]) £¬½Å±¾´«Èë²ÎÊýÖÐ KEY µÄ¸öÊýΪ 1 £¬Õâ¸öKEYÊÇÖ¸½ÓÔÚ 1 ºóÃæµÄ 'hello' £¬Õâ¸ö 'hello' µÈ KEY ±»½Å±¾ÀïµÄ KEY[] Êý×é½ÓÊÕ£¬ KEY[1] ±íʾµÚÒ»¸ö KEY £¬¼´ 'hello' £¬È»ºó 'hello' ½ô½Ó×ÅÊDzÎÊý 'world' £¬Õâ¸ö 'world' µÈ ARGV ±»½Å±¾ÀïµÄ ARGV[] Êý×é½ÓÊÕ£¬ARGV[1] ±íʾµÚÒ»¸ö ARGV£¬¼´ 'world' £¬½Å±¾Àï redis.pcall() µ÷Óà set ÃüÁÎÒÃÇ¿´µ½¿Í»§¶Ë´òÓ¡Á˽ű¾ÀïÖ´ÐÐ set ÃüÁî·µ»ØµÄ ok £¬Èçֱͬ½ÓÓà redis-cli д set ÃüÁîµÃµ½µÄ·µ»ØÒ»Ñù¡£

µÚ¶þ´Î½»»¥ÖУ¬redis ¿Í»§¶ËͬÑùͨ¹ý eval ÃüÁîÖ´ÐÐÁË lua ½Å±¾£¬½Å±¾ÄÚÈÝΪ return redis.pcall('get', KEYS[1]) £¬½Å±¾´«Èë²ÎÊýÖÐ KEY µÄ¸öÊýΪ 1 £¬Õâ¸ö KEY ÊÇÖ¸½ÓÔÚ 1 ºóÃæµÄ 'hello' £¬ÓëµÚÒ»´ÎÖ´ÐÐ set ÃüÁîµÄ½»»¥Ò»Ñù£¬Õâ¸ö 'hello' ¾ÍÊÇ KEYS[1] £¬ÕâÀïûÓвÎÊý ARGV[]£¬½Å±¾Àï redis.pcall() µ÷Óà get ÃüÁÎÒÃÇ¿´µ½¿Í»§¶Ë´òÓ¡Á˽ű¾ÀïÖ´ÐÐ get ÃüÁî·µ»ØµÄ 'world' £¬Èçֱͬ½ÓÓà redis-cli д get ÃüÁîµÃµ½µÄ·µ»ØÒ»Ñù¡£

´ÓÒÔÉÏÁ½¸öÀý×Ó¿ÉÒÔ¿´µ½£¬redis ¿Í»§¶Ëͨ¹ý eval ÃüÁî°Ñ lua ½Å±¾´«Ë͵½ redis ·þÎñ¶ËÖ´ÐУ¬²¢ÇÒ¿ÉÒÔʹÓà redis.pcall() º¯Êýµ÷Óà redis µÄÃüÁî¡£

ÄÇôÕâ¸ö¹ý³ÌÊÇÔõôÑùµÄÄØ£¿½ÓÏÂÀ´Ò»Ð¡½Ú×ö¸ö´ó¸ÅµÄ²ûÊö¡£

3.2.3 Lua ÓïÑÔÈçºÎ "ǶÈë" Redis »·¾³

ÔÚ½éÉÜ eval ÃüÁî´Ó·¢Ëͽű¾µ½·þÎñ¶Ëµ½·þÎñ¶ËÖ´Ðнű¾Ö®Ç°£¬ÎÒÃÇÏÈ¿´Ò»ÏÂÖ´ÐÐ lua ½Å±¾Ç° Redis µÄһЩ׼±¸¹¤×÷¡£

3.2.3.1 lua »·¾³×¼±¸¹¤×÷¡ª¡ªÎ±¿Í»§¶Ë

Èç֮ǰËùÊö£¬·þÎñ¶ËÊÇͨ¹ý´´ÔìÒ»¸öα¿Í»§¶ËÀ´×¨ÃÅÖ´ÐÐ lua ½Å±¾µÄ¡£·þÎñÆ÷ÄÚǶһ¸ö Lua »·¾³£¬²¢¶ÔÕâ¸ö»·¾³½øÐÐһϵÁÐÐ޸쬴ӶøÈ·±£Õâ¸ö Lua »·¾³¿ÉÒÔÂú×ã Redis ·þÎñÆ÷µÄÐèÒª£¨¾ÍÎÒ¸öÈ˵ÄÀí½â£¬Õâ¸ö»·¾³¿ÉÒÔÀà±È JavaÓïÑÔÖÐµÄ JVM£©¡£

ͼ12£ºlua α¿Í»§¶Ë

Redis ·þÎñÆ÷´´½¨ºÍÐÞ¸Ä Lua »·¾³µÄÕû¸ö¹ý³Ì°üÀ¨ÒÔϲ½Ö裺

ͼ13£º´´½¨ºÍÐÞ¸Ä Lua »·¾³¹ý³Ì

´ÓÉÏͼµÃÖª£¬Redis ´´½¨ºÍÐÞ¸Ä Lua »·¾³¾­¹ýÁ˰˸ö²½Ö裬¿ÉÒÔ·ÖΪ ´´½¨ -> ÐÞ¸Ä -> Ìí¼Ó Èý´ó¹ý³Ì£»Ö÷ÒªµÄ¹ý³Ì¿ÉÒÔ¸ÅÊöΪ£º´´½¨»ù±¾µÄ lua »·¾³£¬ Ϊ»·¾³ÔØÈ뺯Êý¿â£¬»ùÓÚ Redis »·¾³¶Ô lua ½Å±¾Ô­Óеĺ¯Êý×öµ÷Õû²¢ÇÒ½ûÖ¹²¿·Ö lua ½Å±¾µÄ¹¦ÄÜÒÔ±£»¤ Redis ÖÐ lua µÄÈ«¾Ö»·¾³£¬È»ºó°Ñ¾­¹ýÕâ¸öÐ޸ĺóµÄ lua »·¾³Ìí¼Óµ½·þÎñÆ÷״̬½á¹¹ÖС£

ºÃÁË£¬ÄÇô¶à¸ö¿Í»§¶Ë¶¼µ÷ÓÃÁË lua ½Å±¾£¬ÄÇÐèÒª¶àÉÙ¸ö»·¾³ÄØ£¿

¸Õ²ÅÎÒÃÇÒѾ­Á˽â¹ýÁË Redis ʹÓô®Ðл¯£¨µ¥Ị̈߳©·½Ê½Ö´ÐÐ Redis ÃüÁîµÄ£¬ËùÒÔ´ð°¸ÊÇ£¬ÔÚÌØ¶¨Ê±¼äÄÚ£¬ ×î¶àÖ»ÓÐÒ»¸ö½Å±¾ÄÜ·ÅÔÚ lua »·¾³ÖÐ £¬ÄÇôÕû¸ö Redis ·þÎñÆ÷ Ö»ÐèÒª´´½¨Ò»¸ö Lua »·¾³ ¼´¿É¡£

ÄÇôÎÒÃÇÀ´¿´Ò»Ï£¬½Å±¾µ÷Ó÷½¡¢lua »·¾³¡¢Î±¿Í»§¶ËÓë·þÎñ¶Ë£¨ÆäʵÊÇÖ¸ÃüÁîÖ´ÐÐÆ÷£©Ö®¼äµÄ½»»¥¹ØÏµ¡£

ͼ14£º½Å±¾µ÷Ó÷½¡¢lua »·¾³¡¢Î±¿Í»§¶ËÓë·þÎñ¶Ë£¨ÆäʵÊÇÖ¸ÃüÁîÖ´ÐÐÆ÷£©½»»¥¹ØÏµ

·þÎñ¶Ë×¼±¸ºÃ Lua »·¾³ºó£¬Jedis »òÕß redis-cli µÈµ÷Ó÷½Í¨¹ý eval ÃüÁî°Ñ Lua ½Å±¾·¢Ë͵½·þÎñ¶Ë£¬·þÎñ¶ËÔØÈë½Å±¾µ½ lua »·¾³£¬lua »·¾³°Ñ redis.call() º¯ÊýÒªÖ´ÐÐµÄ redis ÃüÁî·¢Ë͵½ lua α¿Í»§¶Ë£¬Î±¿Í»§¶Ë¾ÍºÍÆÕͨ¿Í»§¶ËÒ»ÑùµØÓëÃüÁîÖ´ÐÐÆ÷½»»¥¡ª¡ª¡ª¡ª·¢ËÍÃüÁîÓë»ñÈ¡ÃüÁî½á¹û¡£ÆäÖУ¬ redis.call() º¯Êý¿ÉÄÜÊÇÔÚ lua ½Å±¾Öжà´Î±»µ÷Óõģ¬ËùÒÔ»áÓжà´ÎµÄÓë redis ÃüÁîÖ´ÐÐÆ÷µÄ ½»»¥ ¡£

3.2.3.2 lua »·¾³Ö®½Å±¾×Öµä

ÔÚ Lua »·¾³Óë·þÎñ¶ËµÄ½»»¥µÄ¹ý³ÌÖУ¬³ýÁËα¿Í»§¶ËÕâ¸ö×é¼þ£¬»¹ÓÐÁíÒ»¸ö×é¼þÊÇ ½Å±¾×Öµä £¨lua_sripts£©¡£Õâ¸ö×ÖµäµÄ¼üÊÇij¸ö Lua ½Å±¾µÄ SHA1 УÑéºÍ£¬×ÖµäµÄÖµÊÇÕâ¸ö½Å±¾£¬ÄÇô×Öµä¾Í¿ÉÒÔά»¤¶à¸ö lua ½Å±¾¡£

ͼ15£ºÍ¨¹ý script load ÃüÁî¼ÓÔØ lua ½Å±¾µÄ SHA1 Öµ

ͼ16£ºredisServer ½á¹¹ÖÐµÄ lua_scripts

3.2.4 eval ÃüÁî¸ñʽ¼°ÆäÖ´Ðйý³Ì

3.2.4.1 eval ÃüÁî¸ñʽ

Redis ͨ¹ý eval ÃüÁîÖ´ÐÐ lua ½Å±¾£¬eval ÃüÁî¸ñʽΪ£º EVAL script numkeys key [key ...] arg [arg ...]

ÃüÁîµÚÒ»¸ö²ÎÊý scipts Êǽű¾£¬µÚ¶þ¸ö²ÎÊý numkeys ÊǼüÃû key µÄ¸öÊý£¬ºóÃæ¸ú׿ü key£¬½Ó×ÅÊǽű¾ËùÐè²ÎÊý arg¡£±ÈÈ磺

> eval "return {KEYS[1],KEYS[2],ARGV[1]}" 2key1 key2 first

1) "key1"

2) "key2"

3) "first"

ÕâÀï numkeys Ϊ2±íʾÓÐ key1 key2 Á½¸ö¼ü£¬key1 key2 ´«Èëµ½½Å±¾ÖУ¬±» KEYS[] Êý×é½ÓÊÕ£¬first ½Å±¾²ÎÊý±» ARGV[] Êý×é½ÓÊÕ¡£ÏêÇëÇë²Î¿¼£º Redis eval command

Redis ½¨ÒéËùÓÐÓõ½µÄ key (Ö¸redisµÄkey)£¬¶¼ÐèÒª´«µ½ KEYS[] Êý×飬¶ø²»ÊÇ´«µ½ ARGV[] Êý×飬Õâ¸öÓ¦¸ÃÊÇ»ùÓÚ Redis ¼¯ÈºµÄ¿¼ÂÇ¡£

×¢Ò⣺lua ½Å±¾ºÍÊÂÎñÆäÖÐÓÐÃüÁî³ö´í£¬¶¼»á¼ÌÐøÍùÏÂÖ´ÐУ¬²¢Ã»Óлعö¡£

ΪÁ˱£Ö¤Ô­×ÓÐÔ£¬ÓÃscan£¬zscan »òÕß sscan µÈÃüÁî»á¡°×èÈû¡±·þÎñ¶Ë£¬ÕâÀïµÄ¡°×èÈû¡±ÊÇÖ¸¶Ô redis Êý¾Ý¿âµÄд²Ù×÷ÎÞ·¨ÉúЧ¡£

3.2.4.2 eval ÃüÁîÖ´Ðйý³Ì

ºÃÁË£¬ÏÖÔÚÔÙÀ´»Ø´ðÇ°ÃæËµ£¬eval ÃüÁî·¢Ëͽű¾µ½·þÎñ¶Ëµ½·þÎñ¶ËÖ´Ðнű¾Õâ¸ö¹ý³ÌÊÇÔõôÑùµÄÄǸöÎÊÌâ¡£

eval ÃüÁîÖ´Ðйý³Ì¿ÉÒÔ·ÖΪÒÔÏÂÈý¸ö²½Ö裺

ͼ17£ºeval ÃüÁîÖ´Ðйý³Ì

¸ù¾Ý¿Í»§¶Ë¸ø¶¨µÄ Lua ½Å±¾£¬ÔÚ Lua »·¾³Öж¨ÒåÒ»¸ö Lua º¯Êý¡£

¼ÆËã½Å±¾µÄ SHA1 УÑéºÍ

º¯ÊýÃûΪ f_SHA1УÑéºÍ£¬º¯ÊýÌåΪ½Å±¾±¾Éí

ÀýÈ磺¶ÔÓÚÃüÁî eval "return 'hello world'" 0 £¬½Å±¾Îª return 'hello world' £¬¼ÆËãËüµÄ SHA1 УÑéºÍΪ ¡° 5332031c6b470dc5a0dd9b4bf2030dea6d65de91 ¡±£¬ÄÇôº¯ÊýÃûΪ f_5332031c6b470dc5a0dd9b4bf2030dea6d65de91 £¬º¯ÊýÌåΪ return 'hello world' ¡£

ʹÓú¯Êý±£´æ´æÈë½Å±¾ºÃ´¦ÊÇ£º

Ö´Ðнű¾ºÜ¼òµ¥£¬µ÷ÓÃÓë½Å±¾ÏàÓ¦µÄº¯Êý¼´¿É¡£

ͨ¹ýº¯ÊýµÄ¾Ö²¿ÐÔÈà Lua »·¾³±£³ÖÇå½à£¬¼õÉÙÀ¬»ø»ØÊյŤ×÷Á¿£¬²¢ÇÒ±ÜÃâʹÓÃÈ«¾Ö±äÁ¿¡£

Èç¹û½Å±¾¶ÔÓ¦µÄº¯Êý±»¶¨Òå¹ý£¬ÄÇôֻҪ¼ÇסÕâ¸ö½Å±¾µÄ SHA1 УÑéºÍ£¬¾Í¿ÉÒÔÔÚ²»ÖªµÀ½Å±¾µÄÇé¿öÏ£¬Ö±½Óͨ¹ýµ÷Óà lua º¯ÊýÖ´Ðк¯Êý¡£ÕâÒ²ÊÇ eval ÃüÁîµÄʵÏÖÔ­Àí¡£

ÉÏͼÖУ¬µ±µÃÖª½Å±¾µÄ SHA1 УÑéºÍ£¬Ö±½Óͨ¹ý evelsha ÃüÁî¿ÉÒÔÖ±½Óµ÷Óà SHA1 УÑéºÍ¶ÔÓ¦µÄ½Å±¾ £¬¼´ÉÏÃæµÄ return 'hello world'

½«¿Í»§¶Ë¸ø¶¨µÄ Lua ½Å±¾±£´æµ½ lua_scripts ×ֵ䣬µÈ´ý½«À´½øÒ»²½Ê¹Óá£

½Å±¾µÄ SHA1 УÑéºÍ×÷Ϊ key £¬ ½Å±¾±¾Éí×÷Ϊ value Öµ´æÈë lua_scripts ×ֵ䡣

Ö´ÐиոÕÔÚ Lua »·¾³Öж¨ÒåµÄº¯Êý£¬ÒÔ´ËÀ´Ö´Ðпͻ§¶Ë¸ø¶¨µÄ Lua ½Å±¾¡£

×¼±¸ºÍÖ´Ðнű¾¹ý³ÌÈçÏ£º

½« eval ÃüÁî´«ÈëµÄ¼üÃû²ÎÊýºÍ½Å±¾²ÎÊý·Ö±ð´æµ½ KEYS Êý×éºÍ ARGV Êý×é £¬×÷Ϊ È«¾Ö±äÁ¿ ´«µ½ Lua »·¾³ÀïÃæ¡£

½« Lua »·¾³×°Ôس¬Ê±´¦Àí¹³×Ó£¬Ôڽű¾³öÏÖ³¬Ê±Çé¿öÏ£¬¿Í»§¶Ë¿Éͨ¹ý script kill ÃüÁîÍ£Ö¹½Å±¾»òÕß shutdown nosave ÃüÁîÖ±½Ó¹Ø±Õ·þÎñÆ÷

½Å±¾ÓÐ×î´óÖ´ÐÐʱ¼ä£¬Ä¬ÈÏΪ 5 Ã룬±£´æÔÚÅäÖÃÎļþµÄ lua-time-limit ÅäÖÃÏîÀï¡£

Ö´Ðнű¾º¯Êý

½Å±¾Ö»¿É´«²ÎºÍÐÞ¸Ä Redis Êý¾Ý£¬²»¿É·ÃÎÊÍⲿϵͳ£¨·ÃÎÊÎļþϵͳºÍϵͳµ÷Óã©

ÒÆ³ý³¬Ê±¹³×Ó

½«Ö´Ðк¯ÊýËùµÃ ½á¹û±£´æµ½Êä³ö»º³åÇø £¬µÈµ½·þÎñÆ÷½«½á¹û·µ»Ø¸ø¿Í»§¶Ë

¶Ô Lua »·¾³Ö´ÐÐ À¬»ø»ØÊÕ ²Ù×÷

ËÄ¡¢¡°ËÄÔòÔËË㡱Ëã·¨»ù´¡ÖªÊ¶

ÊýѧÒâÒåÉÏ£¬¼Ó¼õ³Ë³ýÔËËã±»³ÆÎª¡°ËÄÔòÔËË㡱£¬Èç 1+2*3-4 £¬¡°ËÄÔòÔËË㡱Ëã·¨Ö÷Òª·ÖÁ½²½£ºµÚÒ»²½ÊÇ ÖÐ׺±í´ïʽתºó׺±í´ïʽ £¬µÚ¶þ²½ÊÇ ¼ÆËãºó׺±í´ïʽµÃµ½½á¹û ¡£

4.1 »ù±¾¸ÅÄî½éÉÜ

4.1.1 ÖÐ׺±í´ïʽÓëºó׺±í´ïʽ

Ò»°ãÇé¿öÏ£¬ËÄÔòÔËËãµÄ±í´ïʽΪÖÐ׺±í´ïʽ£¬±ÈÈç±í´ïʽ A+(B-C/D)*E £¬¸Ã±í´ïʽµÄÖÐ׺±í´ïʽÓëºó׺±í´ïʽÈçÏ£º

ÖÐ׺±í´ïʽ£º A+(B-C/D)*E

ºó׺±í´ïʽ£º ABCD/-E*+

ÖÐ׺±í´ïʽ½« ²Ù×÷·û ÖÃÓÚÁ½¸ö²Ù×÷Êý ÖÐ £» ºó׺±í´ïʽ ½« ²Ù×÷·û ÖÃÓÚÁ½¸ö²Ù×÷ÊýÖ® ºó £»ÁíÍ⣬ºó׺±í´ïʽÒѾ­ È¥³ýÀ¨ºÅ £¬²¢ÇÒ ¶¨ÒåÁËÔËËãµÄÏȺó˳Ðò £¬ÉÔºóÎÒÃÇÀ´·ÖÎö¡£

4.1.2 ²Ù×÷·ûÓë²Ù×÷Êý

Öкó׺±í´ïʽÖеÄ×Ö·ûÓвÙ×÷ÊýºÍ²Ù×÷·ûÖ®·Ö£º

²Ù×÷·û£º±í´ïʽÖÐµÄ +-*/() £¨ÉÔºóÔËËãÓõ½µÄ # ·ûºÅÒ²ÊÇ£©

²Ù×÷Êý£º±í´ïʽÖÐµÄ ABCDE

Ò²¾ÍÊÇ˵£¬ÎÒÃǽ«¼Ó(+)¡¢¼õ(-)¡¢³Ë(*)¡¢³ý(/)¡¢ºÍÀ¨ºÅ("()")³Æ×÷ ²Ù×÷·û £¬½«ÔËËãµÄ×Ö·ûA¡¢B¡¢C¡¢D¡¢E³Æ×÷ ²Ù×÷Êý ¡£

4.1.3 Õ»¡¢¶ÓÁÐÓë²Ù×÷·ûÓÅÏȼ¶

½«ÖÐ׺±í´ïʽתΪºó׺±í´ïʽ£¬ÐèÒª

Ò»¸ö²Ù×÷·ûÕ» ¡ª¡ª ºó½øÏȳö LIFO

Ò»¸ö×Ö·û¶ÓÁÐ ¡ª¡ª ÏȽøÏȳö FIFO

¶¨Òå²Ù×÷·ûÓÅÏȼ¶

ÆäÖУ¬ ²Ù×÷·ûÕ» ´æ´¢²Ù×÷·û£¬²¢¶Ô²Ù×÷·û½øÐÐÈëÕ»³öÕ»²Ù×÷£» ×Ö·û¶ÓÁÐ ´æ´¢×ª»»Ç°ºóµÄ±í´ïʽ£» ²Ù×÷·ûÓÅÏȼ¶ ¶¨ÒåÁËÕ»ÄÚÒÔ¼°Õ»Íâ¸÷¸ö²Ù×÷·ûµÄÓÅÏȼ¶¡£

²Ù×÷·ûÓÅÏȼ¶¹æÔòÈçÏ£º

* / ÓÅÏȼ¶Ïàͬ£¬ + - ÓÅÏȼ¶Ïàͬ

ÓÅÏȼ¶£º * / > + - £»

ͬһÓÅÏȼ¶(±ÈÈç + - )£ºÏȽøÕ» < ºó½øÕ»£»

¾®ºÅ # ÓÅÏȼ¶×îµÍ

ÔÚÕ»Í⣬×óÀ¨ºÅ ( ÓÅÏȼ¶×î¸ß£»ÔÚÕ»ÄÚ£¬ ( ÓÅÏȼ¶³ý¾®ºÅ # Íâ×îµÍ

×ܵÄÀ´Ëµ£¬ÔÚÕ»Íâ ( > * / > + - > ) > '#'£»ÔÚÕ»ÄÚ * / > + - > ) > ( > #

¼ÆËãºó׺±í´ïʽ£¬ÐèÒª

Ò»¸ö²Ù×÷ÊýÕ» ¡ª¡ª ºó½øÏȳö LIFO

Ò»¸ö×Ö·û¶ÓÁÐ ¡ª¡ª ÏȽøÏȳö FIFO

4.2 ÖÐ׺±í´ïʽתºó׺±í´ïʽµÄ¹ý³Ì

4.2.1 ת»»¹ý³ÌÁ÷³Ìͼ

ͼ18£ºÖÐ׺±í´ïʽתºó׺±í´ïʽ¹ý³Ì

Ö÷ÒªµÄ¹ý³ÌΪ£º

Ñ­»·¶ÁÈ¡±í´ïʽ×Ö·û¶ÓÁеÄ×Ö·û

Èç¹ûÊDzÙ×÷Êý

Ö±½ÓÈë¶ÓÁÐ

Èç¹ûÊDzÙ×÷·û

Èç¹ûÊÇ ")" ²Ù×÷·û

Õ»¶¥ÔªËسöÕ»£¬Èë¶ÓÁУ¬Ö±µ½Óöµ½µÚÒ»¸ö ¡°(¡±

Èç¹û»¹Ã»¶ÁÈ¡µ½ ¡±(¡°£¬¾ÍÒѾ­¶Áµ½ÁË "#"£¬ËµÃ÷±í´ïʽ×óÀ¨ºÅºÍÓÒÀ¨ºÅ²»Æ¥Åä

·ñÔò£¬Èç¹ûÊÇ ¡°(¡± ²Ù×÷·û

Ö±½ÓÈëÕ»

·ñÔò£¬±È½ÏÖ¸Õë¶ÁÈ¡µÄµ±Ç°²Ù×÷·û£¬ÓëÕ»¶¥²Ù×÷·ûµÄÓÅÏȼ¶

Èç¹ûµ±Ç°ÔªËØ <= Õ»¶¥ÔªËØ

Õ»¶¥ÔªËسöÕ»£¬Èë¶ÓÁÐ

Ö±µ½Óöµ½ÓÅÏȼ¶ > µ±Ç°ÔªËصÄÕ»¶¥µ¥´Ê£¬»òÕßÓöµ½¡°#¡±£¬µ±Ç°ÔªËØÈëÕ»

·ñÔò£¬£¨µ±Ç°ÔªËØÓÅÏȼ¶ > Õ»¶¥ÔªËØ£©µ±Ç°ÔªËØÈëÕ»

µ±¶ÓÁжÁÈ¡µ½Ä©Î²£¬Õ»ÖÐËùÓÐÔªËØÒÀ´Î³öÕ»£¬²¢Èë¶ÓÁУ¨#Ò²Èë¶ÓÁУ©

4.2.2 ת»»¹ý³ÌÏêϸʾÀý

±í´ïʽ A+(B-C/D)*E ÖÐ׺תºó׺Á÷³Ì²Î¼ûÈçÏ PPT ÑÝʾ£º ÖÐ׺תºó׺Á÷³Ì

4.3 ¼ÆËãºó׺±í´ïʽ¹ý³Ì

4.3.1 ¼ÆËã¹ý³ÌÁ÷³Ìͼ

ͼ19£º¼ÆËã¹ý³ÌÁ÷³Ìͼ

Ö÷ÒªµÄ¹ý³ÌΪ£º

Ñ­»·¶ÁÈ¡±í´ïʽ×Ö·û¶ÓÁеÄ×Ö·û

Èç¹ûÊDzÙ×÷Êý£¨²»ÊDzÙ×÷·û£©

Ö±½ÓÈëÕ»

·ñÔòÊDzÙ×÷·û

Õ»¶¥µ¯³öÁ½¸ö²Ù×÷·û£¬×öËÄÔòÔËË㣬½á¹ûÖØÐÂÈëÕ»

Èç¹ûÓöµ½¶ÓÁÐ⣬½áÊø

4.3.2 ¼ÆËã¹ý³ÌʾÀý

±í´ïʽ ABCD/-E*+ ¼ÆËãºó׺±í´ïʽÁ÷³Ì²Î¼ûÈçÏ PPT ÑÝʾ£º ¼ÆËãºó׺±í´ïʽÁ÷³Ì

4.4 ¼òµ¥Ê¾Àý

ÏÂÃæÑÝʾһ¸ö¼òµ¥µÄʾÀý£¬ÑÝʾͨ¹ýÖÐ׺±í´ïʽתºó׺±í´ïʽ£¬²¢¼ÆËãºó׺±í´ïʽÀ´¼ÆËã 1+(3-4/2)*5 µÄ¹ý³Ì£º

±í´ïʽ 1+(3-4/2)*5 ÖÐ׺תºó׺Á÷³Ì²Î¼ûÈçÏ PPT ÑÝʾ£º ÖÐ׺תºó׺ʾÀý

±í´ïʽ 1342/-5*+ ¼ÆËãºó׺±í´ïʽÁ÷³Ì²Î¼ûÈçÏ PPT ÑÝʾ£º ¼ÆËãºó׺±í´ïʽʾÀý

Îå¡¢Lua ½Å±¾ÊµÏÖ ¡°ËÄÔòÔËË㡱Ëã·¨¡°ÓÅ»¯¡±¼¯ºÏÔËËã

5.1 ´ÓÀíÂÛµ½ lua ½Å±¾ÊµÕ½¸ÅÊö

¼ÈÈ»ÒѾ­ÕÒµ½ÁË Redis Óë Lua µÄ»ù´¡ÖªÊ¶£¬Ò²ÖªµÀ¡°ËÄÔòÔËË㡱Ëã·¨µÄ»ù´¡ÖªÊ¶£¬ÄÇô½ÓÏÂÀ´ÎÒÃÇ¿´¿´ÈçºÎÓà Lua ½Å±¾À´ÊµÏÖ£¬²¢ÇÒ¹ý³ÌÖÐÐèÒª×öÄÄЩÂäµØÊµÕ½µÄ¸ÄÔì¡£

ÔÙ¿´Ò»ÏÂ֮ǰµÄ Lua ½Å±¾´¦Àí¼¯ºÏ¸öÊý²»¶¨£¬ÒµÎñÐèÇó¶à±äµÄÇé¿öµÄͼ¡£

ͼ20£ºlua ½Å±¾´¦Àí¼¯ºÏ¸öÊý²»¶¨£¬ÒµÎñÐèÇó¶à±äµÄÇé¿ö

´ÓͼµÄ×ó±ßÒ»À¸ÎÒÃÇ¿ÉÒÔ¿´µ½£¬Ã¿Ò»À¸Î»¶¼ÊÇÒ»¸ö±í´ïʽ£¬ÎÒÃÇ¿ÉÒÔ¶ÔÆäÖеıí´ïʽ×ö²ð·Ö£¬ÒÔ·ûºÏ¡°ËÄÔòÔËË㡱Ëã·¨ÖС°×Ö·û¡±µÄ¶¨Ò壬ÕâÀïÎÒÃÇÒÔʾÀýÀ´½²½â£¬ credit:score >= 50 && male ¿ÉÒÔ²ð·ÖΪ credit:score ¡¢ >= ¡¢ 50 ¡¢ && ºÍ male Î岿·Ö£¬ÆäÖУº

²Ù×÷·û£º >= &&

²Ù×÷Êý£º credit:score ¡¢ 50 ¡¢ male

ÎÒÃǰѲÙ×÷·ûºÍ²Ù×÷Êý×÷Ϊ×î»ù±¾µÄµ¥Ôª£¬Ï൱ÓÚ¾­µä¡°ËÄÔòÔËË㡱Ëã·¨µÄ¡°×Ö·û¡±£¬ÕâÀïÎÒÃdzÆ×÷¡°µ¥´Ê¡±£¬¼´ÒÔ¡°µ¥´Ê¡±×ö×î»ù±¾µ¥Ôª×÷ÔËËã¡£

ÎÒÃÇ¿ÉÒÔÏëµ½£¬Èç¹û°Ñ¾­µä¡°ËÄÔòÔËË㡱Ëã·¨µÄ²Ù×÷·û + - * / »»³É && || ^ >= > <= < = != µÈ²Ù×÷·û£¬°Ñ¾­µä¡°ËÄÔòÔËË㡱Ëã·¨µÄ²Ù×÷Êý A B C D E £¬Ì滻Ϊ Redis ¼¯ºÏ½»²¢²îÔËËãÐèÒªµÄ male ¡¢ age ¡¢ºÍ credit:score µÈ²Ù×÷Êý£¬ÄÇôÎÒÃǾͿÉÒÔʵÏÖÕâ¸ö Lua ½Å±¾Âú×㼯ºÏµÄ½»²¢²îµÈ»ìºÏÔËËã¡£

5.2 lua ½Å±¾ÊµÕ½

5.2.1 ¼òµ¥ÑÝʾ

»¹ÊǵÚÒ»½Ú¾ÙÀýµÄÀý×Ó£º

ͼ21£º×¼±¸ÎÞÐò¼¯ºÏ male£¬sh£¬ÓÐÐò¼¯ºÏ age

ͼ22£ºÊ¹Óà lua ½Å±¾ÔËËã sh && male && age:score >40 ʾÀý

ͼ23£ºÅÜ shell ½Å±¾µ÷Óà lua ½Å±¾

ͼ24£º²é¿´ lua ½Å±¾ÔËËãµÃµ½µÄÓÐÐò¼¯ºÏ result

´ÓÒÔÉϼ¸¸öͼ¿ÉÒÔ¿´µ½£¬ÔËËã sh && male && age:score >40 Òâ˼ÊÇÕÒ³ö ¾ÓסÔÚÉϺ£ÇÒÄêÁä´óÓÚ40ËêµÄÄÐÐÔ £¬´Ó½á¹û¿ÉÖª£¬¾ÍÊÇ ÍõÎå £¬ÆäÄêÁäΪ45Ëê¡£´ÓÕâ¸ö¼òµ¥µÄʾÀýÎÒÃÇ¿ÉÒÔÍÆ²â£¬Ö»ÒªÓÐÏàÓ¦µÄ¼¯ºÏ£¬µ±Ð´ºÃ±í´ïʽ£¬¶¼ÄÜÒ»´ÎÐÔµØÓë·þÎñ¶Ë½»»¥£¬Ëã³öÏëÒªµÄ±í´ïʽ½á¹û¡£

½ÓÏÂÀ´ÎÒÃÇ´ÓÉè¼ÆºÍ´úÂë²ãÃæÀ´ÊµÏÖÕâ¸ö½Å±¾¡£

5.2.2 Éè¼Æ²ãÃæ

ÎÒÃÇÐèÒª£º

Á½ÖÖÊý¾Ý½á¹¹£º

Õ»

¶ÓÁÐ

Ö÷ÒªµÄÁ½¸öÁ÷³Ì£º

ÖÐ׺±í´ïʽתºó׺±í´ïʽ

¼ÆËãºó׺±í´ïʽµÃµ½½á¹û

¸¨ÖúµÄÒ»¸öÁ÷³Ì£º

×Ö·ûÐòÁÐתµ¥´ÊÐòÁÐ

²Ù×÷·ûÓÅÏȼ¶

5.2.3 ´úÂë²ãÃæ

5.2.3.1 Õ»¶¨Òå

--[[
Õ»¶¨Òå
¸ñʽʾÀý£º{stack_table={"A","B","C"} }
º¯Êý£º
н¨²¢³õʼ»¯Õ»£ºnew(o) --oΪ»ù´¡Õ»£¬¿ÉΪ nil
ÈëÕ»£ºpush(element)
³öÕ»£ºpop()
»ñȡջ¶¥ÔªËØ£ºtop()
ÅжÏÊÇ·ñ¿ÕÕ»£ºisEmpty()
Õ»´óС£ºsize()
Çå¿ÕÕ»£ºclear()
´òÓ¡Õ»ÔªËØ£ºprintElement()
--]]

5.2.3.2 ¶ÓÁж¨Òå

--[[
¶ÓÁж¨Òå
¸ñʽʾÀý£º{queue_table={"A","B","C"},capacity= 10000,size_= 3,head= 0,rear= 0}
º¯Êý£º
н¨²¢³õʼ»¯¶ÓÁУºnew(o) --oΪ»ù´¡¶ÓÁУ¬¿ÉΪ nil
Èë¶ÓÁУºenQueue(element)
³ö¶ÓÁУºdeQueue()
ÅжÏÊÇ·ñ¿Õ¶ÓÁУºisEmpty()
¶ÓÁдóС£ºsize()
Çå¿Õ¶ÓÁУºclear()
´òÓ¡¶ÓÁÐÔªËØ£ºprintElement()

--]]

5.2.3.3 Âß¼­±í´ïʽÀඨÒå

--[[
Âß¼­±í´ïʽ¼ÆËãÆ÷¶¨Òå £¨ÀûÓñհüµÄ·½Ê½Ä£ÄâÃæÏò¶ÔÏó±à³ÌµÄÀࣩ
˽ÓгÉÔ±ÊôÐÔ£º
logic_expr£ºÂß¼­±í´ïʽ
key_final_set£º×îÖÕ½á¹û¼¯µÄkey
is_sorted_set_calc£ºÊÇ·ñÊÇÓÐÐò¼¯ºÏµÄÔËËã
˽ÓгÉÔ±º¯Êý£º
ÅжÏÊÇ·ñΪ²Ù×÷·û£ºisOperator(key)
Åжϱí´ïʽÊÇ·ñÓб£Áô×Ö'#'£ºhasNoSharpInExpr()
УÑé±í´ïʽÀ¨ºÅÊÇ·ñ³É¶Ô³öÏÖ£ºisBracketsMatch()
str±í´ïʽתqueue_table£ºstrToQueueTable(str_expr)
ÖÐ׺±í´ïʽתºó׺£ºinfix2Suffix(expr_queue)
´Óµ¥´ÊÖлñÈ¡key£ºgetKeyFromWord(word)
Åжϵ¥´ÊÊÇ·ñΪÊý×Ö£ºis_operand_a_num(operand)
¼ÆËãºó׺Âß¼­±í´ïʽ£ºcalcInRedis()
¹«ÓгÉÔ±º¯Êý£º
¼ÆËãÂß¼­±í´ïʽÖ÷Á÷³Ì£ºcalc()
--]]

5.2.3.4 ²Ù×÷·ûÓÅÏȼ¶¶¨Òå

-- Õ»ÍâÓÅÏȼ¶
localopr_priority_out_table= { ["("] = 4, [">"] = 3, ["<"] = 3, [">="] = 3, ["<="] = 3, ["="] = 3, ["!="] = 3, ["||"] = 2, ["&&"] = 2, ["^"] = 2, [")"] = 1, ["#"] = -1 }

-- Õ»ÄÚÓÅÏȼ¶
localopr_priority_in_table= { ["("] = 0, [">"] = 3, ["<"] = 3, [">="] = 3, ["<="] = 3, ["="] = 3, ["!="] = 3, ["||"] = 2, ["&&"] = 2, ["^"] = 2, [")"] = 1, ["#"] = -1 }


-- ÓÅÏȼ¶´æ·ÅÔÚtableÖУ¬ Ï൱ÓÚÒ»¸öhashmap £¬ keyÓвÙ×÷·û£¬ valueΪÓÅÏȼ¶£¬ Êý×ÖÔ½´ó£¬ ÓÅÏȼ¶Ô½¸ß£¨¼´ 4 > 3 > 2 > 1 > 0 > -1£©

5.2.3.5 Ö÷Á÷³ÌʵÏÖ

-- ¼ÆËãÂß¼­±í´ïʽÖ÷Á÷³Ì
localcalc= function ()

--str±í´ïʽתqueue_table
localstatus,queue_table_=pcall(strToQueueTable)
if notstatusthen
return {-1,queue_table_}
end

-- ³õʼ»¯±í´ïʽ¶ÓÁÐ
localorigin_queue= {queue_table=queue_table_}
localexpr_queue= Queue:new(origin_queue)

-- ÖÐ׺±í´ïʽתºó׺
localstatus,suffix_queue= pcall(infix2Suffix,expr_queue)
if notstatusthen
return {-1,suffix_queue}
end

--¼ÆËãºó׺±í´ïʽ£¬ µÃµ½½á¹û¼¯µÄÔªËØ¸öÊý
localstatus,num_final_set =pcall (calcInRedis,suffix_queue)
if notstatusthen
return {-1,num_final_set}
end
returnnum_final_set
-- return {1, "success"}

end

5.2.3.6 ½Å±¾Ö´ÐÐÈë¿Ú

--[[
½Å±¾Ö´ÐÐÈë¿Ú
KEYS[1] ×îÖÕ½á¹û¼¯µÄkey
ARGV[1] Âß¼­±í´ïʽ
calc_result×îÖÕ½á¹û
--]]

-- localkey_final_set= "result"
-- locallogic_expr= "sh&¡á&&age:score>40"
-- localis_sorted_set_calc= true

-- ½ÓÊÕµ÷Óýű¾´«ÈëµÄKEYÓë²ÎÊý

localkey_final_set=KEYS[1]
locallogic_expr=ARGV[1]
localis_sorted_set_calc=ARGV[2]
localcalc_result= {-1, "logic_expr or key_final_set is nil."}

ifkey_final_set~= nil andlogic_expr~= nil then

-- ³õʼ»¯Âß¼­±í´ïʽ¼ÆËãÆ÷
locallogicExprCalculator= LogicExprCalculator (key_final_set,logic_expr, is_sorted_set_calc)

-- ¿ªÊ¼¼ÆËã
calc_result=logicExprCalculator.calc()

end

returncalc_result

ÒÔÉÏ´úÂëÊÇÕû¸ö lua ½Å±¾µÄ²¿·Ö´úÂëÆ¬¶Î£¬ ½Å±¾Èë¿Ú ÊÇ eval ÃüÁî´«²ÎÊýºÍ½ÓÊÕ²ÎÊýµÄÈë¿Ú£¬½Å±¾´ÓÕâÀ↑ʼµ÷Óà Ö÷Á÷³Ì £» Ö÷Á÷³Ì °üº¬¼¸´ó²½Ö裨ÒÔ sh&&male&&age:score>40 ¾ÙÀý£©£º

str ±í´ïʽת queue_table 1.1. queue_table = {sh,male,&&,age:score,>,40,#}

³õʼ»¯±í´ïʽ¶ÓÁÐ 2.1. expr_queue = queue_table = {sh,male,&&,age:score,>,40,#}

ÖÐ׺±í´ïʽתºó׺ 3.1. suffix_queue = {sh,male,&&,age:score,40,>,&&,#}

¼ÆËãºó׺±í´ïʽ£¬µÃµ½½á¹û¼¯µÄÔªËØ¸öÊý 4.1. ÏÈËã sh && male µÃµ½ result1£¨¼´ sinterstore result1 £©£¬ ÔÙËã age:score > 40 µÃµ½ result2£¬×îºóËã result1 && result2 µÃµ½ result¡£

·µ»Ø½á¹û¡£ 5.1. ·µ»Ø result µÄ¸öÊý

Lua ½Å±¾ÍêÕû´úÂëÇë²Î¿¼£º lua ½Å±¾¡°ÓÅ»¯¡± Redis ¼¯ºÏÔËËãÍêÕû´úÂë

5.2.4 »Ø¹Ë Lua ½Å±¾Äܹ»¡°ÓÅ»¯¡±µÄµØ·½

5.2.4.1 Îå¸öÓÅ»¯µã

Redis ¼¯ºÏÔËËãÐèÒª¡°ÓÅ»¯¡±µÄÔ­ÒòÓÐһϼ¸¸ö£º

Ô­Éú¼¯ºÏÃüÁî ²»Ö§³Ö¶à´Î ½»²¢²î¼¯ºÏ »ìºÏ ÔËË㣻

ʹÓÃÔ­Éú¼¯ºÏÃüÁî¶à´Î¼¯ºÏÔËËã ²»Äܱ£Ö¤Ô­×ÓÐÔ £»

ʹÓÃÔ­Éú¼¯ºÏÃüÁî¶à´ÎÓë·þÎñ¶Ë½»»¥ ·Ç³£ºÄʱ £»

ʹÓà Redis ÊÂÎñͬÑùÎÞ·¨±ÜÃâÓë·þÎñ¶Ë¶à´Î½»»¥ £»

ʹÓÃÔ­Éú¼¯ºÏÃüÁî»òÕßÊÂÎñÐèÒª ¿Í»§¶Ë±àд¸´ÔÓÂß¼­ ¡£

ÄÇôÏÖÔÚÀ´¿´¿´ÊµÏÖÁ˾­µä¡°ËÄÔòÔËË㡱Ëã·¨µÄ Lua ½Å±¾Äܹ»¡°ÓÅ»¯¡±ÄÄЩµã¡£

Lua ½Å±¾ÄÜÖ§³Ö && ¡¢ || ¡¢ ^ ¡¢ >= ¡¢ > ¡¢ <= ¡¢ < ¡¢ = ¡¢ != µÈ²Ù×÷·ûµÄ»ìºÏʹÓ㨱ÈÈç ( male && sh && age:score<40||credit:score>=750 £©¡£

½â¾öÉÏÊöµÄµÚ 1 µã£º ²»Ö§³Ö¶à´Î ½»²¢²î¼¯ºÏ »ìºÏ ÔËË㣻

Lua ½Å±¾´«Ë͵½·þÎñ¶Ëºó£¬·þÎñ¶ËÊÇÔ­×ÓÐÔµØÖ´ÐÐÕû¸ö Lua ½Å±¾£¬Ö´Ðнű¾¹ý³ÌÖÐÆäËûµ½´ïµÄÃüÁ±»×èÈû¡£

½â¾öÉÏÊöµÚ2µã£º ²»Äܱ£Ö¤Ô­×ÓÐÔ £»

Lua ½Å±¾Ò»´ÎÐÔ´«Êäµ½·þÎñ¶Ë£¬µ÷Ó÷½Ê¹Óÿͻ§¶ËÖ»Óë·þÎñ¶Ë×öÒ»´Î½»»¥£¬²¢ÇÒÔÚµ÷Óùý½Å±¾Ö®ºó£¬·þÎñ¶ËÓнű¾¶ÔÓ¦µÄ SHA1 УÑéºÍ ¿É¹©¿Í»§¶ËÖ±½ÓʹÓà evalsha ÃüÁî´«Èë SHA1 УÑéºÍ Ö±½Óµ÷Óýű¾£¬¹ý³ÌÖÐÒ»´Î½»»¥£¬ÇÒ²»ÐèÒªÔÙ´«Êä½Å±¾£¬¼õÉÙÁËÍøÂç´«ÊäµÄºÄʱ¡£Õâ¸öÉÔºóÓÐÏêϸ½éÉÜ¡£

½â¾öÁËÉÏÊöµÄµÚ3µã£º ·Ç³£ºÄʱ

Lua ½Å±¾Ò»´ÎÐÔ´«Êäµ½·þÎñ¶Ë£¬µ÷Ó÷½Ê¹Óÿͻ§¶ËÖ»Óë·þÎñ¶Ë×öÒ»´Î½»»¥¡£

½â¾öÉÏÊöµÄµÚ4µã£º ÎÞ·¨±ÜÃâÓë·þÎñ¶Ë¶à´Î½»»¥

Lua ½Å±¾´«Ë͵½·þÎñ¶Ëºó£¬½Å±¾¾Í³£×¤ÔÚ·þÎñ¶Ë£¨Èç¹ûûÓб» script flush µÄ»°£©£¬¿Í»§¶ËÖ»ÐèÒª´«Èë¼òµ¥µÄ±í´ïʽ£¬¶ø²»Óñàд¸´ÔÓµÄÂß¼­¡£

½â¾öÉÏÊöµÄµÚ5µã£º ¿Í»§¶Ë±àд¸´ÔÓÂß¼­

5.2.4.2 Lua ½â¾öºÄʱÎÊÌâ

½ÓÏÂÀ´×Ðϸ½éÉÜһϠLua ½Å±¾¡°ÓÅ»¯¡±µÄµÚ3µã£¬ÏÖÔÚÓÐ3¸ö¼¯ºÏÈçÏ£º

ͼ25£º×¼±¸ÎÞÐò¼¯ºÏ male£¬sh£¬ÓÐÐò¼¯ºÏ age

ÏÖÔÚÔËÐÐ sh ½Å±¾·Ö±ð²é¿´Ê¹Óà Lua ½Å±¾ÒÔ¼°²»Ê¹Óà Lua ½Å±¾ ÕÒ³ö ¾ÓסÔÚÉϺ£ÇÒÄêÁä´óÓÚ40ËêµÄÄÐÐÔ £¬·Ö±ðµÄºÄʱ¡£

ͼ26£ºÊ¹ÓúͲ»Ê¹Óà lua ½Å±¾ÔËËã sh && male && age:score >40 ʾÀý

ͼ27£ºÅÜ shell ½Å±¾µ÷Óà lua ½Å±¾²¢²é¿´ºÄʱ¡£

ͼ28£º²é¿´½á¹û

´Óͼ24¿ÉÒÔ¿´³ö£¬Ê¹Óà Lua ½Å±¾×ö¼¯ºÏÔËË㣬µÄÈ·¼õÉÙÁ˺Äʱ¡£µ±È»ÕâÖ»ÊÇÒ»´ÎµÄÔËËã½á¹ûÏÔʾ£¬ÎÒÃÇ¿ÉÒÔ²»¶ÏµØ±ä»»±í´ïʽ£¬È¥×öʹÓà Lua ½Å±¾ÒÔ¼°²»Ê¹Óà Lua ½Å±¾ºÄʱµÄ¶Ô±È¡£

ÁíÍâ£¬Ëæ×űí´ïÊ½Éæ¼°ÔËËãµÄ¼¯ºÏ¸öÊýµÄÔö¼Ó£¬²»Ê¹Óà Lua ½Å±¾Òª×öµÄ½»»¥´ÎÊýÔö¶à£¬ÍøÂçºÄʱ½«»áËæÖ®Ôö¶à£¬Èç¹ûÊÇʹÓà Lua ½Å±¾£¬ÄÇôֻÓÐÒ»´ÎµÄ½»»¥½«·Ç³£½Úʡʱ¼ä¡£

Âß¼­ÔËËãÍêÕûµÄ Lua ½Å±¾ ¼ÆËãºÄʱ sh ½Å±¾

5.2.5 ½Å±¾ÊµÕ½µÄ¼¸¸ö×¢Òâµã

Lua "Ò»ÇÐ" ¶¼ÊÇ table£¬ÕâÀïµÄ"Ò»ÇÐ"Ö÷ÒªÊÇÖ¸ array¡¢hashmap¡¢list µÈ¼¯ºÏÀàÐÍ¡£

Redis ²»Ö§³Ö Lua ½Å±¾Ä£¿é»¯£¬²»ÄÜͨ¹ý import ÒýÓÃÄ£¿é£¬ËùÒÔÕû¸ö½Å±¾¶¼ÊÇÔÚÒ»¸öÎļþÖС£

Õ»µÄʵÏֱȽϼòµ¥£¬¾ÍÊǶÔÊý×éµÄÔöɾ¸Ä£»¶ÓÁеÄʵÏÖ¸´ÔÓÒ»µã£¬µ«Ò²ÊǶÔÊý×éµÄÔöɾ¸Ä£¬Éè¼Æµ½Ò»¶¨µÄËã·¨£¬¿ÉÒÔÏê¿´´úÂë¡£

±í´ïʽ×Ö·û´®×ª×Ö·û¶ÓÁÐʱ£¬×¢Òâ·Ö´Ê£¨±ÈÈçÔõô°Ñ sh&&male&&age:score>40 ·Ö³ö sh ¡¢ && ¡¢ male ¡¢ age:score ¡¢ >= ¡¢ 40 À´£©¡£

ÔÚ¼ÆËãºó׺±í´ïʽʱ£¬×¢ÒâÓë redis ½»»¥µÄʱºò£¬Èç¹ûûÓÐÔ­ÉúÃüÁîÖ±½ÓÖ§³Ö£¬ÈçºÎͨ¹ý×éºÏÃüÁîÀ´ÊµÏÖ£¨±ÈÈç zdiffstore ,, ÓÐÐò¼¯ºÏµÄ >= £¬ > £¬ != µÈ£¬ÕâÀï²»Ïë˵£¬½Å±¾ÀïÓÐÏêϸµÄ×¢ÊÍ˵Ã÷£©¡£

ÔÚ¼ÆËãºó׺±í´ïʽʱ£¬×¢ÒâÓë redis ½»»¥µÄʱºò£¬»áÓкܶàÁÙʱ½á¹û¼¯µÄ²úÉú£¬ÐèÒªÇåÀíµôÁÙʱ½á¹û¼¯£¬²ÅÄܱ£Ö¤Ó벻ʹÓà lua ½Å±¾µÄЧ¹ûÊÇÒ»ÑùµÄ¡£

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

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

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

Êý¾ÝÖÎÀí¡¢Êý¾Ý¼Ü¹¹¼°Êý¾Ý±ê×¼
MongoDBʵս¿Î³Ì
²¢·¢¡¢´óÈÝÁ¿¡¢¸ßÐÔÄÜÊý¾Ý¿âÉè¼ÆÓëÓÅ»¯
PostgreSQLÊý¾Ý¿âʵսÅàѵ