Ò»ÍòÁùǧ×Ö̸̸ÈçºÎʵÏÖ¾µä¡°ËÄÔòÔËË㡱Ëã·¨ÓÅ»¯
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 ½Å±¾µÄЧ¹ûÊÇÒ»ÑùµÄ¡£ |