Redis+lua

作者: 超人001 | 来源:发表于2021-04-29 17:56 被阅读0次

    userName是zhangsan 如果有,则将lisi传入userName

    lua脚本

    local key = KEYS[1]
    local val = redis.call("GET", key);
    
    if val == ARGV[1]
    then
            redis.call('SET', KEYS[1], ARGV[2])
            return 1
    else
            return 0
    end
    

    执行结果

    ## Redis客户端执行
    127.0.0.1:6379> set userName zhangsan 
    OK
    127.0.0.1:6379> get userName
    "zhangsan"
    
    ## linux服务器执行
    ## 第一次执行:compareAndSet成功,返回1
    ## 第二次执行:compareAndSet失败,返回0
    [root@vm01 learn_lua]# redis-cli -a 123456 --eval Redis_CompareAndSet.lua userName , zhangsan lisi
    (integer) 1
    [root@vm01 learn_lua]# redis-cli -a 123456 --eval Redis_CompareAndSet.lua userName , zhangsan lisi
    (integer) 0
    

    使用Lua控制IP访问频率

    需求:实现一个访问频率控制,某个IP在短时间内频繁访问页面,需要记录并检测出来,就可以通过Lua脚本高效的实现。
    小声说明:本实例针对固定窗口的访问频率,而动态的非滑动窗口。即:如果规定一分钟内访问10次,记为超限。在本实例中前一分钟的最后一秒访问9次,下一分钟的第1秒又访问9次,不计为超限。
    lua脚本:

    local visitNum = redis.call('incr', KEYS[1])
    
    if visitNum == 1 then
            redis.call('expire', KEYS[1], ARGV[1])
    end
    
    if visitNum > tonumber(ARGV[2]) then
            return 0
    end
    
    return 1;
    

    脚本如下:

    ## LimitIP:127.0.0.1为key, 10 3表示:同一IP在10秒内最多访问三次
    ## 前三次返回1,代表未被限制;第四、五次返回0,代表127.0.0.1这个ip已被拦截
    [root@vm01 learn_lua]# redis-cli -a 123456 --eval Redis_LimitIpVisit.lua LimitIP:127.0.0.1 , 10 3
     (integer) 1
    [root@vm01 learn_lua]# redis-cli -a 123456 --eval Redis_LimitIpVisit.lua LimitIP:127.0.0.1 , 10 3
     (integer) 1
    [root@vm01 learn_lua]# redis-cli -a 123456 --eval Redis_LimitIpVisit.lua LimitIP:127.0.0.1 , 10 3
     (integer) 1
    [root@vm01 learn_lua]# redis-cli -a 123456 --eval Redis_LimitIpVisit.lua LimitIP:127.0.0.1 , 10 3
     (integer) 0
    [root@vm01 learn_lua]# redis-cli -a 123456 --eval Redis_LimitIpVisit.lua LimitIP:127.0.0.1 , 10 3
     (integer) 0
    

    相关文章

      网友评论

          本文标题:Redis+lua

          本文链接:https://www.haomeiwen.com/subject/ytdcrltx.html