<meta name="keywords" content="华夏棋牌,setnx,Redis中文开发手册" />

华夏棋牌

目录 搜索
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
文字

SETNX key value

自1.0.0起可用。

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

假定不存在,则设置key为生涯字符串。在这类情形下,它即是SET。当曾经生涯一个值时,不推行任何操作。SETNX 是短期的“ SET假定ñ OTË X派”。valuekeykey

前往值

整数回复,详细为:

  • 1 假定密钥已设置

  • 0 假定密钥没有设置

例子

redis>  SETNX mykey "Hello" (integer) 1 redis>  SETNX mykey "World" (integer) 0 redis>  GET mykey "Hello"

设计形式:锁定 SETNX

请重视:

  1. 以下形式倒霉于Redlock算法,该算法完成起来稍微严重年夜一些,但供应了更好的保证并具有容错才干。

  1. 岂论若何,我们纪录旧的形式,由于某些现有的完成链接到此页面作为参考。此外,Redis 敕令若何用于装载编程原语是一个滑稽的例子。

  1. 岂论若何,纵然假定一个单实例锁定原语,从2.6.12泉源,可以培植一个更质朴的锁定原语,与此处议论辩说的等价,应用 SET 敕令取得锁,和一个质朴的 Lua 脚原来释放锁。该形式纪录在SET敕令页面中。

也就是说,SETNX 可以被用作历史上被用作锁定原语。例如,要取得密钥的锁定foo华夏棋牌,客户端可以考试考试以下操作:

SETNX lock.foo <current Unix time + lock timeout + 1>

假定 SETNX 前往1客户端取得的锁定,则将该lock.foo要害字设置为不再以为该锁定有用的 Unix 时间。客户端稍后将应用DEL lock.foo以释放锁。

假定 SETNX 前往0该键已被某个其他客户端锁定。假定它是非壅闭锁,我们可之前往给挪用者,或许输入一个循环重试以保持锁,直到我们告成或某种超时过时。

处置赏罚赏罚去世锁

在上述锁定算法中存在一个效果:假定客户端泛起误差,瓦解或没法释放锁,会发生甚么情形?可以检测到这类情形,由于锁定键网罗 UNIX 时间戳。假定这样的时间戳即是以后的 Unix 时间,则该锁不再有用。

发生这类情形时,我们不克不及仅仅经由历程挪用 DEL 来移除锁,然后考试考试收回 SETNX,由于这里存在争用条件,当多个客户端检测到过时的锁并考试考试释放它时。

  • C1和C2读取lock.foo以检查时间戳,由于它们0华夏棋牌在推行SETNX 以后都收到,由于锁依然由持有锁以后瓦解的 C3 持有。

  • C1发送 DEL lock.foo

  • C1发送SETNX lock.foo并告成

  • C2发送 DEL lock.foo

  • C2发送SETNX lock.foo并告成

  • 弱点:由于竞争条件,C1和C2都取得了锁定。

华夏棋牌幸运的是,应用以下算法可以防止尔效果。让我们看看我们的明智客户C4若何应用好的算法:

  • C4发送SETNX lock.foo以取得锁

  • 瓦解的客户端C3依然具有它,以是Redis将回复0给C4。

  • C4发送GET lock.foo来检查锁能否过时。假定不是,它会睡眠一段时间并从一泉源就重试。

  • 相反,假定锁由于 Unix 时间lock.foo华夏棋牌比以后 Unix 时间早而过时,C4会考试考试推行:

华夏棋牌GETSET lock.foo <current Unix timestamp + lock timeout + 1>

  • 由于 GETSET 语义,C4可以检查存储的旧值key能否依然是过时的时间戳。假定是这样,那就取得了锁。

  • 假定此外一个客户端(例如C5)比C4速率更快并经由历程 GETSET 操作取得了锁定,则C4 GETSET 操作将前往一个未过时的时间戳。C4将从第一步重新泉源。请重视,纵然C4在未来几秒钟内将键设置为几秒,这也不是效果。

华夏棋牌为了使这类锁定算法加倍结实,持有锁的客户端应当一直检查超时在 DEL 用于解锁密钥之前没有过时,由于客户端掉落败能够很严重年夜,不只会瓦解,而且会阻挡年夜量时间关于某些操作并考试考试在很长时间后收回 DEL(当 LOCK 已被此外一客户端占用时)。

上一篇: 下一篇: