华夏棋牌

目录 搜索
Cluster cluster addslots(集群 槽位) cluster count failure reports(集群计数掉落败申报) cluster countkeysinslot cluster delslots cluster failover cluster forget cluster getkeysinslot cluster info cluster keyslot(集群键槽) cluster meet cluster nodes(集群节点) cluster replicate(集群复制) cluster reset(集群重置) cluster saveconfig cluster set config epoch cluster setslot cluster slaves cluster slots readonly readwrite Connection auth echo ping quit select swapdb Geo geoadd geodist geohash geopos georadius georadiusbymember Hashes hdel hexists hget hgetall hincrby hincrbyfloat hkeys hlen hmget hmset hscan hset hsetnx hstrlen hvals HyperLogLog pfadd pfcount pfmerge Keys del dump exists expire expireat keys migrate move object persist pexpire pexpireat pttl randomkey rename renamenx restore scan sort touch ttl type unlink wait Lists blpop brpop brpoplpush lindex linsert llen lpop lpush lpushx lrange lrem lset ltrim rpop rpoplpush rpush rpushx Pub/Sub psubscribe publish pubsub punsubscribe subscribe unsubscribe Scripting eval evalsha script debug script exists script flush script kill script load Server bgrewriteaof bgsave client getname client kill client list client pause client reply client setname command command count command getkeys command info config get config resetstat config rewrite config set dbsize debug object debug segfault flushall flushdb info lastsave monitor role save shutdown slaveof slowlog time Sets sadd scard sdiff sdiffstore sinter sinterstore sismember smembers smove spop srandmember srem sscan sunion sunionstore Sorted Sets zadd zcard zcount zincrby zinterstore zlexcount zrange zrangebylex zrangebyscore zrank zrem zremrangebylex zremrangebyrank zremrangebyscore zrevrange zrevrangebylex zrevrangebyscore zrevrank zscan zscore zunionstore Strings append bitcount bitfield bitop bitpos decr decrby get getbit getrange getset incr incrby incrbyfloat mget mset msetnx psetex set setbit setex setnx setrange strlen Transactions discard exec multi unwatch watch
文字

INCR key

自1.0.0起可用。

时间严重年夜度: O(1)

将存储的数字key加1。假定密钥不存在,则0在推行操作之前将其设置为。假定密钥网罗弱点类型的值或网罗没法体现为整数的字符串,则会前往弱点。该操作仅限于64位有符号整数。

重视:这是一个字符串操作,由于Redis没有公用的整数类型。存储在密钥中的字符串被诠释为一个以10为底的64位有符号整数来推行操作。

Redis 以整数体现形式存储整数,是以关于现实上网罗整数的字符串值,不存在用于存储整数的字符串体现形式的开支。

前往值

整数回复:key增量后的值

例子

redis>  SET mykey "10" "OK" redis>  INCR mykey (integer) 11 redis>  GET mykey "11"

形式:计数器

计数器形式是应用 Redis 原子增量操作可以做的最显着的使命。这个想法主意主意只是在每次操作发生时发送 INCR 敕令给 Redis。例如,在一个 Web 应用法式模范模范中,我们能够想知道这个用户一年中天天都做了若干页面浏览。

华夏棋牌为此,Web 应用法式模范模范可以在每次用户推行页面视图时质朴地增添一个键,培植毗连用户 ID 的键名和代表以后日期的字符串。

华夏棋牌这类质朴形式可以经由历程多种要领阻拦扩年夜:

  • 可以在每个页面视图中一起应用 INCR 和 EXPIRE,使计数器只盘算比来 N 个分页少于指定秒数的页面视图。

  • 华夏棋牌客户端可以应用 GETSET 来自动取得以后计数器值并将其重置为零。

  • 应用其他原子增量/减量敕令(如 DECR 或 INCRBY),可以凭证用户推行的操作来处置赏罚赏罚能够变年夜或变小的值。想象一下在线游戏中不适用户的分数。

形式:限速器

速率限制器形式是一个特殊的计数器,用于限制推行操作的速率。这类形式的经典完成触及限制可以针对公共 API 推行的请求的数目。

我们应用 INCR 供应了这类形式的两种完成,我们假定要处置赏罚赏罚的效果是将 API 挪用的数目限制为每IP地址每秒最多10个请求

形式:限速器1

这类形式的更俭梗直接的完成以下:

FUNCTION LIMIT_API_CALL(ip)ts = CURRENT_UNIX_TIME()keyname = ip+":"+ts
current = GET(keyname)IF current != NULL AND current > 10 THEN
    ERROR "too many requests per second"ELSE
    MULTI        INCR(keyname,1)        EXPIRE(keyname,10)
    EXEC    PERFORM_API_CALL()END

基本上我们有每个IP的柜台,每隔一秒钟。但是这个计数器总是递增的,设置10秒过时,以便在以后秒不应时自动将它们由 Redis移除。

华夏棋牌请重视应用 MULTI 和 EXEC,以确保我们在每次 API 挪用时都邑递增并设置到期。

形式:限速器2

华夏棋牌此外一种完成措施是应用单个计数器,但要在没有竞争条件的情形下阻拦准确的设置会更严重年夜一些。我们将研究不合的变体。

FUNCTION LIMIT_API_CALL(ip):current = GET(ip)IF current != NULL AND current > 10 THEN
    ERROR "too many requests per second"ELSE
    value = INCR(ip)
    IF value == 1 THEN        EXPIRE(ip,1)
    END    PERFORM_API_CALL()END

华夏棋牌计数器的培植要领只能在以后秒的第一次请求泉源后才干存活一秒。假定在统一秒内有逾越10个请求,则计数器将到达年夜于10的值,否则将过时并从0泉源。

不才面的代码中有一个竞争条件。假定由于某种启事,客户端推行INCR 敕令但不推行 EXPIRE,密钥将被走漏,直到我们再次看到类似的IP地址。

华夏棋牌这可以很容易地处置赏罚赏罚,将带有可选 EXPIRE 的 INCR 转换为应用EVAL 敕令发送的 Lua 剧本(仅在 Redis 版本2.6以后可用)。

local current
current = redis.call("incr",KEYS[1])if tonumber(current) == 1 then
    redis.call("expire",KEYS[1],1)end

华夏棋牌有一种不应用剧本处置赏罚赏罚尔效果的措施,但应用 Redis 列表而不是计数器。完成更严重年夜,应用更多高等功效,但具有记着以后正在推行API挪用的客户端的IP地址的优点,凭证应用法式模范模范的不合,该地址能够有用或无用。

FUNCTION LIMIT_API_CALL(ip)current = LLEN(ip)IF current > 10 THEN
    ERROR "too many requests per second"ELSE
    IF EXISTS(ip) == FALSE
        MULTI            RPUSH(ip,ip)            EXPIRE(ip,1)
        EXEC
    ELSE        RPUSHX(ip,ip)
    END    PERFORM_API_CALL()END

华夏棋牌假定密钥曾经存在,RPUSHX 敕令只会推送元素。

请重视,我们在这里有一场角逐,但这不是效果:在我们在MULTI / EXEC 块中培植它之前,EXISTS 能够会前往 false,但能够会由此外一个客户端培植密钥。可是,这类竞争只会在极多数情形下错过API挪用,以是速率限制依然可以正常使命。

上一篇: 下一篇: