¶Ô±ÈÐÂÎļþ |
| | |
| | | -- lua 䏿 ä» 1 å¼å§ |
| | | -- éæµ key |
| | | local key = KEYS[1] |
| | | -- éæµå¤§å° |
| | | local max = tonumber(ARGV[1]) |
| | | -- è¶
æ¶æ¶é´ |
| | | local ttl = tonumber(ARGV[2]) |
| | | -- èè主ä»çç¥åèæ¬åæ¾æºå¶ï¼è¿ä¸ªtimeç±å®¢æ·ç«¯è·åä¼ å
¥ |
| | | local now = tonumber(ARGV[3]) |
| | | -- å·²ç»è¿æçæ¶é´ç¹ |
| | | local expired = now - (ttl * 1000) |
| | | |
| | | -- æ¸
é¤è¿æçæ°æ®,ç§»é¤æå®åæ°ï¼scoreï¼åºé´å
çæææå |
| | | redis.call('zremrangebyscore', key, 0, expired) |
| | | -- è·åå½åæµéå¤§å° |
| | | local currentLimit = tonumber(redis.call('zcard', key)) |
| | | |
| | | local nextLimit = currentLimit + 1 |
| | | if nextLimit > max then |
| | | -- è¾¾å°éæµå¤§å° è¿å 0 |
| | | return 0; |
| | | else |
| | | -- 没æè¾¾å°éå¼ value + 1 |
| | | redis.call("zadd", key, now, now) |
| | | -- ç§ä¸ºåä½è®¾ç½® key ççåæ¶é´ |
| | | redis.call("pexpire", key, ttl) |
| | | return nextLimit |
| | | end |