将 value 关联到 key ,并将 key 的生存时间设为 seconds (以秒为单位)。 如果 key 已经存在,SETEX命令将覆写旧。 这个命令类于以下两个命令: $redis -SET('key', 'value'); $redis -EXPIRE('key','seconds'); # 设置生存时间 不同之处是,SETEX是一个原子
将值value关联到key,并将key的生存时间设为seconds(以秒为单位)。
如果key 已经存在,SETEX命令将覆写旧值。
这个命令类似于以下两个命令:
<span>$redis</span>->SET('key', 'value'); <span>$redis</span>->EXPIRE('key','seconds'); <span>#</span><span> 设置生存时间 </span>
不同之处是,SETEX是一个原子性(atomic)操作,关联值和设置生存时间两个动作会在同一时间内完成,该命令在Redis用作缓存时,非常实用。
- 时间复杂度:
- O(1)
- 返回值:
-
设置成功时返回OK。
当seconds参数不合法时,返回一个错误。
<span>#</span><span> 情况1:key不存在</span><span>$redis</span>->SETEX('cache_user_id', 60,10086);<span>//</span><span>bool(true)</span><span>echo</span> <span>$redis</span>->GET('cache_user_id'); <span>#</span><span> 值 //"10086"</span> <span>sleep</span>(4); <span>echo</span> <span>$redis</span>->TTL('cache_user_id'); <span>#</span><span> 剩余生存时间 //int(56)</span> <span>#</span><span> 情况2:key已经存在,key被覆写</span><span>$redis</span>->SET('cd', "timeless"); <span>//</span><span>bool(true);</span><span>$redis</span>->SETEX('cd', 3000,"goodbye my love"); <span>//</span><span>bool(true);</span><span>echo</span> <span>$redis</span>->GET('cd');<span>//</span><span>"goodbye my love"</span>
SETRANGE
SETRANGE key offset value
用value参数覆写(Overwrite)给定key所储存的字符串值,从偏移量offset开始。
不存在的key当作空白字符串处理。
SETRANGE命令会确保字符串足够长以便将value设置在指定的偏移量上,如果给定key原来储存的字符串长度比偏移量小(比如字符串只有5个字符长,但你设置的offset是10),那么原字符和偏移量之间的空白将用零比特(zerobytes,"\x00")来填充。
注意你能使用的最大偏移量是2^29-1(536870911),因为Redis的字符串被限制在512兆(megabytes)内。如果你需要使用比这更大的空间,你得使用多个key。
- 时间复杂度:
-
对小(small)的字符串,平摊复杂度O(1)。(关于什么字符串是”小”的,请参考APPEND命令)
否则为O(M),M为value参数的长度。
- 返回值:
- 被SETRANGE修改之后,字符串的长度。
警告
当生成一个很长的字符串时,Redis需要分配内存空 间,该操作有时候可能会造成服务器阻塞(block)。在2010年的Macbook Pro上,设置偏移量为536870911(512MB内存分配),耗费约300毫秒, 设置偏移量为134217728(128MB内存分配),耗费约80毫秒,设置偏移量33554432(32MB内存分配),耗费约30毫秒,设置偏移量 为8388608(8MB内存分配),耗费约8毫秒。 注意若首次内存分配成功之后,再对同一个key调用SETRANGE操作,无须再重新内存。
模式
因为有了SETRANGE和GETRANGE命令,你可以将Redis字符串用作具有O(1)随机访问时间的线性数组。这在很多真实用例中都是非常快速且高效的储存方式。
<span>#</span><span> 情况1:对非空字符串进行SETRANGE</span><span>$redis</span>->SET('greeting', "hello world"); <span>$redis</span>->SETRANGE('greeting', 6, "Redis"); <span>//</span><span>int(11)</span><span>$redis</span>->GET('greeting');<span>//</span><span>"hello Redis"</span> <span>#</span><span> 情况2:对空字符串/不存在的key进行SETRANGE</span><span>$redis</span>->EXISTS('empty_string');<span>//</span><span>bool(false)</span><span>$redis</span>->SETRANGE('empty_string', 5 ,"Redis!"); <span>#</span><span> 对不存在的key使用SETRANGE //int(11)</span><span>var_dump</span>(<span>$redis</span>->GET('empty_string')); <span>#</span><span> 空白处被"\x00"填充 #"\x00\x00\x00\x00\x00Redis!" //return string(11) "Redis!"</span>
MSET
MSET key value [key value ...]
同时设置一个或多个key-value对。
当发现同名的key存在时,MSET会用新值覆盖旧值,如果你不希望覆盖同名key,请使用MSETNX命令。
MSET是一个原子性(atomic)操作,所有给定key都在同一时间内被设置,某些给定key被更新而另一些给定key没有改变的情况,不可能发生。
- 时间复杂度:
- O(N),N为要设置的key数量。
- 返回值:
- 总是返回OK(因为MSET不可能失败)
-
<span>#</span><span>MSET</span><span>echo</span> '<br><br>MSET<br>'; <span>$redis</span>->select(0); <span>$redis</span>->flushdb(); <span>$array_mset</span>=<span>array</span>('date'=>'2012.3.5', 'time'=>'9.09a.m.', 'weather'=>'sunny' ); <span>$redis</span>->MSET(<span>$array_mset</span>); <span>//</span><span>bool(true)</span> <span>var_dump</span>(<span>$redis</span>->KEYS('*')); <span>#</span><span> 确保指定的三个key-value对被插入 //array(3) { [0]=> string(4) "time" [1]=> string(7) "weather" [2]=> string(4) "date" }</span> <span>#</span><span> MSET覆盖旧值的例子 但是经过测试覆盖不了</span><span>var_dump</span>(<span>$redis</span>->SET('google', "google.cn")); <span>//</span><span>bool(true)</span><span>var_dump</span>(<span>$redis</span>->MSET('google',"google.hk")); <span>//</span><span>bool(false)</span><span>echo</span> <span>$redis</span>->GET('google'); <span>//</span><span>google.cn <strong>与redis手册的示例结果不符</strong></span>
MSETNX
- MSETNX key value [key value ...]
-
同时设置一个或多个key-value对,当且仅当key不存在。
即使只有一个key已存在,MSETNX也会拒绝所有传入key的设置操作
MSETNX是原子性的,因此它可以用作设置多个不同key表示不同字段(field)的唯一性逻辑对象(unique logic object),所有字段要么全被设置,要么全不被设置。
- 时间复杂度:
- O(N),N为要设置的key的数量。
- 返回值:
-
当所有key都成功设置,返回1。
如果所有key都设置失败(最少有一个key已经存在),那么返回0。
<span>#</span><span> 情况1:对不存在的key进行MSETNX</span><span>$array_mset</span>=<span>array</span>('rmdbs'=>'MySQL', 'nosql'=>'MongoDB', 'key-value-store'=>'redis' ); <span>$redis</span>->MSETNX(<span>$array_mset</span>);<span>//</span><span>bool(true)</span> <span>#</span><span> 情况2:对已存在的key进行MSETNX</span><span>$array_mset</span>=<span>array</span>('rmdbs'=>'Sqlite', 'language'=>'python' ); <span>var_dump</span>(<span>$redis</span>->MSETNX(<span>$array_mset</span>)); <span>#</span><span> rmdbs键已经存在,操作失败 //bool(false)</span><span>var_dump</span>(<span>$redis</span>->EXISTS('language')); <span>#</span><span> 因为操作是原子性的,language没有被设置 bool(false)</span> <span>echo</span> <span>$redis</span>->GET('rmdbs'); <span>#</span><span> rmdbs没有被修改 //"MySQL"</span> <span>$array_mset_keys</span>=<span>array</span>( 'rmdbs', 'nosql', 'key-value-store'); <span>print_r</span>(<span>$redis</span>->MGET(<span>$array_mset_keys</span>)); <span>//</span><span>Array ( [0] => MySQL [1] => MongoDB [2] => redis )</span>
APPEND
- APPEND key value
-
如果key已经存在并且是一个字符串,APPEND命令将value追加到key原来的值之后。
如果key不存在,APPEND就简单地将给定key设为value,就像执行SET key value一样。
- 时间复杂度:
- 平摊复杂度O(1)
- 返回值:
- 追加value之后,key中字符串的长度。
<span>#</span><span> 情况1:对不存在的key执行APPEND</span> <span>$redis</span>->EXISTS('myphone'); <span>#</span><span> 确保myphone不存在 //bool(false)</span><span>$redis</span>->APPEND('myphone',"nokia"); <span>#</span><span> 对不存在的key进行APPEND,等同于SET myphone "nokia" //int(5) # 字符长度</span> <span>#</span><span> 情况2:对字符串进行APPEND</span><span>$redis</span>->APPEND('myphone', " - 1110");<span>#</span><span> 长度从5个字符增加到12个字符 //int(12)</span> <span>echo</span> <span>$redis</span>->GET('myphone'); <span>#</span><span> 查看整个字符串 //"nokia - 1110"</span>
GET
- GET key
-
返回key所关联的字符串值。
如果key不存在则返回特殊值nil。
假如key储存的值不是字符串类型,返回一个错误,因为GET只能用于处理字符串值。
- 时间复杂度:
- O(1)
- 返回值:
-
key的值。
如果key不存在,返回nil。
<span>//</span><span>GET</span><span>var_dump</span>(<span>$redis</span>->GET('fake_key')); <span>#</span><span>(nil) //return bool(false)</span><span>$redis</span>->SET('animate', "anohana"); <span>//</span><span>return bool(true)</span><span>var_dump</span>(<span>$redis</span>->GET('animate')); <span>//</span><span>return string(7) "anohana"</span>
MGET
- MGET key [key ...]
-
返回所有(一个或多个)给定key的值。
如果某个指定key不存在,那么返回特殊值nil。因此,该命令永不失败。
- 时间复杂度:
- O(1)
- 返回值:
- 一个包含所有给定key的值的列表。
<span>//</span><span>MGET</span><span>echo</span> '<br><br>MGET<br>'; <span>$redis_mget_data_array</span>=<span>array</span>('name'=>'ikodota','blog'=>'cnblogs.com/ikodota'); <span>$redis</span>->MSET(<span>$redis_mget_data_array</span>);<span>#</span><span>用MSET一次储存多个值 </span> <span>$redis_mget_key_array</span>=<span>array</span>('name','blog'); <span>var_dump</span>(<span>$redis</span>->MGET(<span>$redis_mget_key_array</span>)); <span>//</span><span>array(2) { [0]=> string(7) "ikodota" [1]=> string(19) "cnblogs.com/ikodota" }</span> <span>$redis</span>->EXISTS('fake_key'); <span>//</span><span>bool(false)</span> <span>$redis_mget_key_array</span>=<span>array</span>('name','fake_key'); <span>var_dump</span>(<span>$redis</span>->MGET(<span>$redis_mget_key_array</span>)); <span>#</span><span> 当MGET中有不存在key的情况 //array(2) { [0]=> string(7) "ikodota" [1]=> bool(false) }</span>
GETRANGE
- GETRANGE key start end
-
返回key中字符串值的子字符串,字符串的截取范围由start和end两个偏移量决定(包括start和end在内)。
负数偏移量表示从字符串最后开始计数,-1表示最后一个字符,-2表示倒数第二个,以此类推。
GETRANGE通过保证子字符串的值域(range)不超过实际字符串的值域来处理超出范围的值域请求。
- 时间复杂度:
-
O(N),N为要返回的字符串的长度。
复杂度最终由返回值长度决定,但因为从已有字符串中建立子字符串的操作非常廉价(cheap),所以对于长度不大的字符串,该操作的复杂度也可看作O(1)。
- 返回值:
- 截取得出的子字符串。
注解:在
<span>//</span><span>GETRANGE</span><span>echo</span> '<br><br>GETRANGE<br>'; <span>$redis</span>->SET('greeting', "hello, my friend"); <span>echo</span> <span>$redis</span>->GETRANGE('greeting', 0, 4).'<br>'; <span>#</span><span> 返回索引0-4的字符,包括4。 //"hello"</span><span>echo</span> <span>$redis</span>->GETRANGE('greeting', -1 ,-5).'<br>'; <span>#</span><span> 不支持回绕操作 //""</span><span>echo</span> <span>$redis</span>->GETRANGE('greeting', -3 ,-1).'<br>'; <span>#</span><span> 负数索引 //"end"</span><span>echo</span> <span>$redis</span>->GETRANGE('greeting', 0, -1).'<br>'; <span>#</span><span> 从第一个到最后一个 //"hello, my friend"</span><span>echo</span> <span>$redis</span>->GETRANGE('greeting', 0, 1008611).'<br>'; <span>#</span><span> 值域范围不超过实际字符串,超过部分自动被符略 //"hello, my friend"</span>
GETSET
- GETSET key value
-
将给定key的值设为value,并返回key的旧值。
当key存在但不是字符串类型时,返回一个错误。
- 时间复杂度:
- O(1)
- 返回值:
-
返回给定key的旧值(old value)。
当key没有旧值时,返回nil。
<span>//</span><span>GETSET</span><span>echo</span> '<br><br>GETSET<br>'; <span>var_dump</span>(<span>$redis</span>->EXISTS('mail'));<span>//</span><span>return bool(false);</span><span>var_dump</span>(<span>$redis</span>->GETSET('mail','xxx@google.com')); <span>#</span><span> 因为mail之前不存在,没有旧值,返回nil ,#(nil) //bool(false)</span> <span>var_dump</span>(<span>$redis</span>->GETSET('mail','xxx@yahoo.com')); <span>#</span><span> mail被更新,旧值被返回 //string(14) "xxx@google.com"</span>
设计模式
GETSET可以和INCR组合使用,实现一个有原子性(atomic)复位操作的计数器(counter)。
举例来说,每次当某个事件发生时,进程可能对一个名为mycount的key调用INCR操作,通常我们还要在一个原子时间内同时完成获得计数器的值和将计数器值复位为0两个操作。
可以用命令GETSET mycounter 0来实现这一目标。
<span>$redis</span>->SELECT(2); <span>echo</span> <span>$redis</span>->INCR('mycount').'<br>'; <span>#</span><span>(integer) 11</span> <span>if</span>(<span>$redis</span>->GET('mycount')>19){ <span>echo</span> <span>$redis</span>->GETSET('mycount', 0).'<br>'; <span>#</span><span> 一个原子内完成GET mycount和SET mycount 0操作 #"11" </span>} <span>echo</span> <span>$redis</span>->GET('mycount'); <span>#</span><span>"0"</span>
STRLEN
- STRLEN key
-
返回key所储存的字符串值的长度。
当key储存的不是字符串值时,返回一个错误。
- 复杂度:
- O(1)
- 返回值:
-
字符串值的长度。
当 key不存在时,返回0。
<span>$redis</span>->SET('mykey', "Hello world"); <span>echo</span> <span>$redis</span>-><span>STRLEN</span>('mykey'); <span>//</span><span>int(11)</span><span>echo</span> <span>$redis</span>-><span>STRLEN</span>('nonexisting'); <span>#</span><span> 不存在的key长度视为0 //int(0)</span>
INCR
- INCR key
-
将key中储存的数字值增一。
如果key不存在,以0为key的初始值,然后执行INCR操作。
如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
本操作的值限制在64位(bit)有符号数字表示之内。
- 时间复杂度:
- O(1)
- 返回值:
- 执行INCR命令之后key的值。
注解:这是一个针对字符串的操作,因为Redis没有专用的整数类型,所以key内储存的字符串被解释为十进制64位有符号整数来执行INCR操作。
<span>$redis</span>->SET('page_view', 20); <span>var_dump</span>(<span>$redis</span>->INCR('page_view')); <span>//</span><span>int(21) </span><span>var_dump</span>(<span>$redis</span>->GET('page_view')); <span>#</span><span> 数字值在Redis中以字符串的形式保存 //string(2) "21</span>
INCRBY
- INCRBY key increment
-
将key所储存的值加上增量increment。
如果key不存在,以0为key的初始值,然后执行INCRBY命令。
如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
本操作的值限制在64位(bit)有符号数字表示之内。
关于更多递增(increment)/递减(decrement)操作信息,参见INCR命令。
- 时间复杂度:
- O(1)
- 返回值:
- 加上increment之后,key的值。
<span>//</span><span>INCRBY</span><span>echo</span> '<br><br>INCRBY<br>'; <span>#</span><span> 情况1:key存在且是数字值</span><span>$redis</span>->SET('rank', 50); <span>#</span><span> 设置rank为50</span><span>$redis</span>->INCRBY('rank', 20); <span>#</span><span> 给rank加上20</span><span>var_dump</span>(<span>$redis</span>->GET('rank')); <span>#</span><span>"70" //string(2) "70"</span> <span>#</span><span> 情况2:key不存在</span><span>$redis</span>->EXISTS('counter'); <span>//</span><span>bool(false)</span><span>$redis</span>->INCRBY('counter'); <span>#</span><span>int 30 //bool(false)</span><span>var_dump</span>(<span>$redis</span>->GET('counter')); <span>#</span><span>30 /<strong>/经测试 与手册上结果不一样</strong>,不能直接从bool型转为int型。 return bool(false) </span> <span>#</span><span> 情况3:key不是数字值</span><span>$redis</span>->SET('book', "long long ago..."); <span>var_dump</span>(<span>$redis</span>->INCRBY('book', 200)); <span>#</span><span>(error) ERR value is not an integer or out of range // bool(false)</span>
DECR
- DECR key
-
将key中储存的数字值减一。
如果key不存在,以0为key的初始值,然后执行DECR操作。
如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
本操作的值限制在64位(bit)有符号数字表示之内。
关于更多递增(increment)/递减(decrement)操作信息,参见INCR命令。
- 时间复杂度:
- O(1)
- 返回值:
- 执行DECR命令之后key的值。
<span>//</span><span>DECR</span><span>$redis</span>->SELECT(3); <span>$redis</span>->flushdb(); <span>echo</span> '<br><br>DECR<br>'; <span>#</span><span> 情况1:对存在的数字值key进行DECR</span><span>$redis</span>->SET('failure_times', 10); <span>$redis</span>->DECR('failure_times'); <span>//</span><span>int(9)</span><span>echo</span> <span>$redis</span>->GET('failure_times').'<br>'; <span>//</span><span>string(1) "9"</span> <span>#</span><span> 情况2:对不存在的key值进行DECR</span><span>$redis</span>->EXISTS('count'); <span>#</span><span>(integer) 0 //bool(false)</span><span>$redis</span>->DECR('count'); <span>//</span><span>int(-1) </span><span>echo</span> <span>$redis</span>->GET('count').'<br>'; <span>//</span><span>string(2) "-1"</span> <span>#</span><span> 情况3:对存在但不是数值的key进行DECR</span><span>$redis</span>->SET('company', 'YOUR_CODE_SUCKS.LLC'); <span>var_dump</span>(<span>$redis</span>->DECR('company')); <span>#</span><span>(error) ERR value is not an integer or out of range //bool(false)</span><span>echo</span> <span>$redis</span>->GET('company').'<br>'; <span>//</span><span>YOUR_CODE_SUCKS.LLC</span>
DECRBY
- DECRBY key decrement
-
将key所储存的值减去减量decrement。
如果key不存在,以0为key的初始值,然后执行DECRBY操作。
如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
本操作的值限制在64位(bit)有符号数字表示之内。
关于更多递增(increment)/递减(decrement)操作信息,参见INCR命令。
- 时间复杂度:
- O(1)
- 返回值:
- 减去decrement之后,key的值。
<span>#</span><span> 情况1:对存在的数值key进行DECRBY</span><span>$redis</span>->SET('count', 100); <span>var_dump</span>(<span>$redis</span>->DECRBY('count', 20)); <span>//</span><span>int(80)</span><span>var_dump</span>(<span>$redis</span>->GET('count')); <span>//</span><span>string(2) "80"</span> <span>#</span><span> 情况2:对不存在的key进行DECRBY</span><span>$redis</span>->EXISTS('pages');<span>#</span><span>(integer) 0 //bool(false)</span><span>var_dump</span>(<span>$redis</span>->DECRBY('pages', 10)); <span>//</span><span>int(-10)</span><span>var_dump</span>(<span>$redis</span>->GET('pages')); <span>//</span><span>string(3) "-10"</span>
SETBIT
- SETBIT key offset value
-
对key所储存的字符串值,设置或清除指定偏移量上的位(bit)。
位的设置或清除取决于value参数,可以是0也可以是1。
当key不存在时,自动生成一个新的字符串值。
字符串会增长(grown)以确保它可以将value保存在指定的偏移量上。当字符串值增长时,空白位置以0填充。
offset参数必须大于或等于0,小于2^32(bit映射被限制在512MB内)。
- 时间复杂度:
- O(1)
- 返回值:
- 指定偏移量原来储存的位("0"或"1").
警告:对使用大的offset的SETBIT操作来说,内存分配可能造成Redis服务器被阻塞。具体参考SETRANGE命令,warning(警告)部分。
<span>//</span><span>SETBIT</span><span>echo</span> '<br><br>SETBIT<br>'; <span>$bit_val</span>=67; <span>echo</span> <span>decbin</span>(<span>$bit_val</span>).'<br>'; <span>//</span><span>1000011</span><span>var_dump</span>(<span>$redis</span>->SETBIT('bit',1,1));<span>//</span><span>int(0) 空位上都是0</span><span>var_dump</span>(<span>$redis</span>->SETBIT('bit',2,0));<span>//</span><span>int(0)</span><span>var_dump</span>(<span>$redis</span>->SETBIT('bit',3,0));<span>//</span><span>int(0)</span><span>var_dump</span>(<span>$redis</span>->SETBIT('bit',4,0));<span>//</span><span>int(0)</span><span>var_dump</span>(<span>$redis</span>->SETBIT('bit',5,0));<span>//</span><span>int(0)</span><span>var_dump</span>(<span>$redis</span>->SETBIT('bit',6,1));<span>//</span><span>int(0)</span><span>var_dump</span>(<span>$redis</span>->SETBIT('bit',7,1));<span>//</span><span>int(0)</span> <span>var_dump</span>(<span>$redis</span>->GET('bit')); <span>//</span><span>string(1) "C" ,二进制为:1000011 ,ASCII:67</span> <span>var_dump</span>(<span>$redis</span>->GETBIT('bit', 6 )); <span>//</span><span>int(1) 取出第6位(从左到右)为“1”</span> <span>var_dump</span>(<span>$redis</span>->SETBIT('bit',5,1));<span>//</span><span>int(0) 把第5位的0改为1</span><span>var_dump</span>(<span>$redis</span>->SETBIT('bit',6,0));<span>//</span><span>int(1) 把第6位的1改为0</span> <span>var_dump</span>(<span>$redis</span>->GET('bit')); <span>//</span><span>string(1) "E ,二进制为:1000101,ASCII:69l</span>
GETBIT
- GETBIT key offset
-
对key所储存的字符串值,获取指定偏移量上的位(bit)。
当offset比字符串值的长度大,或者key不存在时,返回0。
- 时间复杂度:
- O(1)
- 返回值:
- 字符串值指定偏移量上的位(bit)。
<span>#</span><span>参见SETBIT的示例</span>
哈希表(Hash)
HSET
- HSET key field value
-
将哈希表key中的域field的值设为value。
如果key不存在,一个新的哈希表被创建并进行HSET操作。
如果域field已经存在于哈希表中,旧值将被覆盖。
- 时间复杂度:
- O(1)
- 返回值:
-
如果field是哈希表中的一个新建域,并且值设置成功,返回1。
如果哈希表中域field已经存在且旧值已被新值覆盖,返回0。
HSETNX
- HSETNX key field value
-
将哈希表key中的域field的值设置为value,当且仅当域field不存在。
若域field已经存在,该操作无效。
如果key不存在,一个新哈希表被创建并执行HSETNX命令。
- 时间复杂度:
- O(1)
- 返回值:
-
设置成功,返回1。
如果给定域已经存在且没有操作被执行,返回0。
HMSET
- HMSET key field value [field value ...]
-
同时将多个field - value(域-值)对设置到哈希表key中。
此命令会覆盖哈希表中已存在的域。
如果key不存在,一个空哈希表被创建并执行HMSET操作。
- 时间复杂度:
- O(N),N为field - value对的数量。
- 返回值:
-
如果命令执行成功,返回OK。
当key不是哈希表(hash)类型时,返回一个错误。
HGET
- HGET key field
-
返回哈希表key中给定域field的值。
- 时间复杂度:
- O(1)
- 返回值:
-
给定域的值。
当给定域不存在或是给定key不存在时,返回nil。
HMGET
- HMGET key field [field ...]
-
返回哈希表key中,一个或多个给定域的值。
如果给定的域不存在于哈希表,那么返回一个nil值。
因为不存在的key被当作一个空哈希表来处理,所以对一个不存在的key进行HMGET操作将返回一个只带有nil值的表。
- 时间复杂度:
- O(N),N为给定域的数量。
- 返回值:
- 一个包含多个给定域的关联值的表,表值的排列顺序和给定域参数的请求顺序一样。
HGETALL
- HGETALL key
-
返回哈希表key中,所有的域和值。
在返回值里,紧跟每个域名(field name)之后是域的值(value),所以返回值的长度是哈希表大小的两倍。
- 时间复杂度:
- O(N),N为哈希表的大小。
- 返回值:
- 以列表形式返回哈希表的域和域的值。 若key不存在,返回空列表。
HDEL
- HDEL key field [field ...]
-
删除哈希表key中的一个或多个指定域,不存在的域将被忽略。
- 时间复杂度:
- O(N),N为要删除的域的数量。
- 返回值:
- 被成功移除的域的数量,不包括被忽略的域。
注解:在Redis2.4以下的版本里,HDEL每次只能删除单个域,如果你需要在一个原子时间内删除多个域,请将命令包含在MULTI/ EXEC块内。
HLEN
- HLEN key
-
返回哈希表key中域的数量。
- 时间复杂度:
- O(1)
- 返回值:
-
哈希表中域的数量。
当key不存在时,返回0。
HEXISTS
- HEXISTS key field
-
查看哈希表key中,给定域field是否存在。
- 时间复杂度:
- O(1)
- 返回值:
-
如果哈希表含有给定域,返回1。
如果哈希表不含有给定域,或key不存在,返回0。
HINCRBY
- HINCRBY key field increment
-
为哈希表key中的域field的值加上增量increment。
增量也可以为负数,相当于对给定域进行减法操作。
如果key不存在,一个新的哈希表被创建并执行HINCRBY命令。
如果域field不存在,那么在执行命令前,域的值被初始化为0。
对一个储存字符串值的域field执行HINCRBY命令将造成一个错误。
本操作的值限制在64位(bit)有符号数字表示之内。
- 时间复杂度:
- O(1)
- 返回值:
- 执行HINCRBY命令之后,哈希表key中域field的值。
HKEYS
- HKEYS key
-
返回哈希表key中的所有域。
- 时间复杂度:
- O(N),N为哈希表的大小。
- 返回值:
-
一个包含哈希表中所有域的表。
当key不存在时,返回一个空表。
HVALS
- HVALS key
-
返回哈希表key中的所有值。
- 时间复杂度:
- O(N),N为哈希表的大小。
- 返回值:
-
一个包含哈希表中所有值的表。
当key不存在时,返回一个空表。
表(List)
头元素和尾元素
头元素指的是列表左端/前端第一个元素,尾元素指的是列表右端/后端第一个元素。
举个例子,列表list包含三个元素:x, y, z,其中x是头元素,而z则是尾元素。
空列表
指不包含任何元素的列表,Redis将不存在的key也视为空列表。
LPUSH
- LPUSH key value [value ...]
-
将一个或多个值value插入到列表key的表头。
如果有多个value值,那么各个value值按从左到右的顺序依次插入到表头:比如对一个空列表(mylist)执行LPUSH mylist a b c,则结果列表为c b a,等同于执行执行命令LPUSH mylist a、LPUSH mylist b、LPUSH mylist c。
如果key不存在,一个空列表会被创建并执行LPUSH操作。
当key存在但不是列表类型时,返回一个错误。
- 时间复杂度:
- O(1)
- 返回值:
- 执行LPUSH命令后,列表的长度。
注解:在Redis 2.4版本以前的LPUSH命令,都只接受单个value值。
LPUSHX
- LPUSHX key value
-
将值value插入到列表key的表头,当且仅当key存在并且是一个列表。
和LPUSH命令相反,当key不存在时,LPUSHX命令什么也不做。
- 时间复杂度:
- O(1)
- 返回值:
- LPUSHX命令执行之后,表的长度。
RPUSH
- RPUSH key value [value ...]
-
将一个或多个值value插入到列表key的表尾。
如果有多个value值,那么各个value值按从左到右的顺序依次插入到表尾:比如对一个空列表(mylist)执行RPUSH mylist a b c,则结果列表为a b c,等同于执行命令RPUSHmylist a、RPUSH mylist b、RPUSH mylist c。
如果key不存在,一个空列表会被创建并执行RPUSH操作。
当key存在但不是列表类型时,返回一个错误。
- 时间复杂度:
- O(1)
- 返回值:
- 执行RPUSH操作后,表的长度。
注解:在Redis 2.4版本以前的RPUSH命令,都只接受单个value值。
RPUSHX
- RPUSHX key value
-
将值value插入到列表key的表尾,当且仅当key存在并且是一个列表。
和RPUSH命令相反,当key不存在时,RPUSHX命令什么也不做。
- 时间复杂度:
- O(1)
- 返回值:
- RPUSHX命令执行之后,表的长度。
LPOP
- LPOP key
-
移除并返回列表key的头元素。
- 时间复杂度:
- O(1)
- 返回值:
-
列表的头元素。
当key不存在时,返回nil。
RPOP
- RPOP key
-
移除并返回列表key的尾元素。
- 时间复杂度:
- O(1)
- 返回值:
-
列表的尾元素。
当key不存在时,返回nil。
BLPOP
- BLPOP key [key ...] timeout
-
BLPOP是列表的阻塞式(blocking)弹出原语。
它是LPOP命令的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被BLPOP命令阻塞,直到等待超时或发现可弹出元素为止。
当给定多个key参数时,按参数key的先后顺序依次检查各个列表,弹出第一个非空列表的头元素。
非阻塞行为
当BLPOP被调用时,如果给定key内至少有一个非空列表,那么弹出遇到的第一个非空列表的头元素,并和被弹出元素所属的列表的名字一起,组成结果返回给调用者。
当存在多个给定key时,BLPOP按给定key参数排列的先后顺序,依次检查各个列表。
假设现在有job、 command和request三个列表,其中job不存在,command和request都持有非空列表。考虑以下命令:
BLPOP job command request 0
BLPOP保证返回的元素来自command,因为它是按”查找job -> 查找command -> 查找request“这样的顺序,第一个找到的非空列表。
阻塞行为
如果所有给定key都不存在或包含空列表,那么BLPOP命令将阻塞连接,直到等待超时,或有另一个客户端对给定key的任意一个执行LPUSH或RPUSH命令为止。
超时参数timeout接受一个以秒为单位的数字作为值。超时参数设为0表示阻塞时间可以无限期延长(block indefinitely) 。
相同的key被多个客户端同时阻塞
相同的key可以被多个客户端同时阻塞。
不同的客户端被放进一个队列中,按”先阻塞先服务”(first-BLPOP,first-served)的顺序为key执行BLPOP命令。
在MULTI/EXEC事务中的BLPOP
BLPOP可以用于流水线(pipline,批量地发送多个命令并读入多个回复),但把它用在MULTI/EXEC块当中没有意义。因为这要求整个服务器被阻塞以保证块执行时的原子性,该行为阻止了其他客户端执行LPUSH或RPUSH命令。
因此,一个被包裹在MULTI/EXEC块内的BLPOP命令,行为表现得就像LPOP一样,对空列表返回nil,对非空列表弹出列表元素,不进行任何阻塞操作。
时间复杂度:O(1)返回值:
如果列表为空,返回一个nil。
反之,返回一个含有两个元素的列表,第一个元素是被弹出元素所属的key,第二个元素是被弹出元素的值。
BRPOP
- BRPOP key [key ...] timeout
-
BRPOP是列表的阻塞式(blocking)弹出原语。
它是RPOP命令的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被BRPOP命令阻塞,直到等待超时或发现可弹出元素为止。
当给定多个key参数时,按参数key的先后顺序依次检查各个列表,弹出第一个非空列表的尾部元素。
关于阻塞操作的更多信息,请查看BLPOP命令,BRPOP除了弹出元素的位置和BLPOP不同之外,其他表现一致。
- 时间复杂度:
- O(1)
- 返回值:
-
假如在指定时间内没有任何元素被弹出,则返回一个nil和等待时长。
反之,返回一个含有两个元素的列表,第一个元素是被弹出元素所属的key,第二个元素是被弹出元素的值。
LLEN
- LLEN key
-
返回列表key的长度。
如果key不存在,则key被解释为一个空列表,返回0.
如果key不是列表类型,返回一个错误。
- 时间复杂度:
- O(1)
- 返回值:
- 列表key的长度。
LRANGE
- LRANGE key start stop
-
返回列表key中指定区间内的元素,区间以偏移量start和stop指定。
下标(index)参数start和stop都以0为底,也就是说,以0表示列表的第一个元素,以1表示列表的第二个元素,以此类推。
你也可以使用负数下标,以-1表示列表的最后一个元素,-2表示列表的倒数第二个元素,以此类推。
注意LRANGE命令和编程语言区间函数的区别
假如你有一个包含一百个元素的列表,对该列表执行LRANGE list 0 10,结果是一个包含11个元素的列表,这表明stop下标也在LRANGE命令的取值范围之内(闭区间),这和某些语言的区间函数可能不一致,比如Ruby的Range.new、Array#slice和Python的range()函数。
超出范围的下标
超出范围的下标值不会引起错误。
如果start下标比列表的最大下标end(LLEN list减去1)还要大,或者start > stop,LRANGE返回一个空列表。
如果stop下标比end下标还要大,Redis将stop的值设置为end。
- 时间复杂度:
- O(S+N),S为偏移量start,N为指定区间内元素的数量。
- 返回值:
- 一个列表,包含指定区间内的元素。
LREM
- LREM key count value
-
根据参数count的值,移除列表中与参数value相等的元素。
- count的值可以是以下几种:
-
- count > 0: 从表头开始向表尾搜索,移除与value相等的元素,数量为count。
- count 0: 从表尾开始向表头搜索,移除与value相等的元素,数量为count的绝对值。
- count = 0: 移除表中所有与value相等的值。
- 时间复杂度:
- O(N),N为列表的长度。
- 返回值:
-
被移除元素的数量。
因为

有些朋友可能会在安装系统时不小心设置成了英文,结果所有界面都变成了英文,看都看不懂。其实我们可以在控制面板中设置语言,将语言更改为中文,下面就一起来看一下更改的方法吧。win7如何更改语言为中文1、首先点击屏幕左下角的按钮,然后选择“ControlPanel”2、找到“Clock,Language,andRegion”下的“Changedispalylanguage”3、点击下方“English”就可以在下拉菜单中选择简体中文了。4、确定之后点击“Logoffnow”注销并重启电脑。5、回来之后

有时候我们再刚刚入手安装好电脑系统之后发现系统时英文的,遇到这种情况我们就需要把电脑的语言改成中文,那么win10系统里面该怎么把电脑的语言改成中文呢,现在就给大家带来具体的操作方法。win10电脑语言怎么改成中文1、打开电脑点击左下角的开始按键。2、点击左侧的设置选项。3、打开的页面选择“时间和语言”4、打开后,再点击左侧的“语言”5、在这里就可以设置你要的电脑语言。

Win11系统语言如何改成中文?近期有用户刚给电脑安装了最新的Win11系统,但是在使用中发现系统语言为英文,自己使用起来很吃力,为此有没有什么方法可以将系统语言改成中文呢?方法很简单,下面我们来看看这篇Win11系统语言设置为中文的方法吧。 Win11系统语言设置为中文的步骤 1、首先我们进入齿轮按钮的settings,然后找到其中的Time打开时间和语言。 2、在时间和语言中点击左边栏的Language选项,然后在右侧点击Addalanguage。 3、接着在上方搜索框输入chi

2月23日消息,官方威世智今日宣布,自《摩登新篇3》之后将不再生产葡萄牙语版产品,自《Bloomburrow》开始停止生产中文版实体卡牌产品。完整公告如下:万智牌实体卡牌产品语言调整通知万智牌作为一款全球知名游戏,一直深受全球玩家的喜爱。今年,我们遗憾地做出这个艰难的决定:在《摩登新篇3》之后将不再生产葡萄牙语版产品,自《Bloomburrow》开始停止生产中文版实体卡牌产品。我们深知这对热爱万智牌的中国和葡萄牙玩家是一次重大的变化,但这一决策并不是对玩家热情的否定。请大家相信,我们将继续在这两

eclipse语言设置为中文的方法:1、打开浏览器找到语言包下载地址,并将最新的安装包地址复制;2、打开eclipse,点击“help”,然后点击安装新的插件;3、点击“Add”,在Location中粘帖网址;4、在下拉菜单中找到简体中文包,进行勾选,点击Next等待安装;5、重启eclipse即可。

解决matplotlib中文乱码问题的方法,需要具体代码示例Matplotlib是一个常用的用于数据可视化的Python库,可以生成各种图表和图形。然而,对于中文用户来说,经常会遇到一个问题,就是生成的图表中的中文字符显示乱码。这个问题可以通过一些简单的方法来解决。本文将介绍一些常见的解决方法,并附上相关的代码示例,帮助读者解决这个烦人的问题。方法一:设置字

在matplotlib中正确地显示中文字符,是很多中文用户常常遇到的问题。默认情况下,matplotlib使用的是英文字体,无法正确显示中文字符。为了解决这个问题,我们需要设置正确的中文字体,并将其应用到matplotlib中。下面是一些具体的代码示例,帮助你正确地在matplotlib中显示中文字符。首先,我们需要导入需要的库:importmatplot

虽然Linux有LibreOffice,但是对微软的office兼容不是很好,有些排版会出现问题。而几年前,金山也开发了Linux版的WPS,不过在Ubuntu上使用,无法直接输入中文,这咋弄才可以让WPS正常输入中文呢1、打开WPS的文档,右上角的输入法已经是中文了,但是实际输入的时候,只能输入英文字母,出不了中文2、在终端输入:sudogedit/usr/bin/wps3、从第二行加上:exportXMODIFIERS="@im=fcitx"exportQT_IM_MODULE=&


Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

PhpStorm versi Mac
Alat pembangunan bersepadu PHP profesional terkini (2018.2.1).

Dreamweaver Mac版
Alat pembangunan web visual

SecLists
SecLists ialah rakan penguji keselamatan muktamad. Ia ialah koleksi pelbagai jenis senarai yang kerap digunakan semasa penilaian keselamatan, semuanya di satu tempat. SecLists membantu menjadikan ujian keselamatan lebih cekap dan produktif dengan menyediakan semua senarai yang mungkin diperlukan oleh penguji keselamatan dengan mudah. Jenis senarai termasuk nama pengguna, kata laluan, URL, muatan kabur, corak data sensitif, cangkerang web dan banyak lagi. Penguji hanya boleh menarik repositori ini ke mesin ujian baharu dan dia akan mempunyai akses kepada setiap jenis senarai yang dia perlukan.

DVWA
Damn Vulnerable Web App (DVWA) ialah aplikasi web PHP/MySQL yang sangat terdedah. Matlamat utamanya adalah untuk menjadi bantuan bagi profesional keselamatan untuk menguji kemahiran dan alatan mereka dalam persekitaran undang-undang, untuk membantu pembangun web lebih memahami proses mengamankan aplikasi web, dan untuk membantu guru/pelajar mengajar/belajar dalam persekitaran bilik darjah Aplikasi web keselamatan. Matlamat DVWA adalah untuk mempraktikkan beberapa kelemahan web yang paling biasa melalui antara muka yang mudah dan mudah, dengan pelbagai tahap kesukaran. Sila ambil perhatian bahawa perisian ini

MinGW - GNU Minimalis untuk Windows
Projek ini dalam proses untuk dipindahkan ke osdn.net/projects/mingw, anda boleh terus mengikuti kami di sana. MinGW: Port Windows asli bagi GNU Compiler Collection (GCC), perpustakaan import yang boleh diedarkan secara bebas dan fail pengepala untuk membina aplikasi Windows asli termasuk sambungan kepada masa jalan MSVC untuk menyokong fungsi C99. Semua perisian MinGW boleh dijalankan pada platform Windows 64-bit.
