本文為我閱讀了 redis參考手冊 之后編寫,注意 php_redis 和 redis-cli 的區別(主要是返回值類型和參數用法)
Redis 有序集合和集合一樣也是string類型元素的集合,且不允許重復的成員。
不同的是每個元素都會關聯一個double類型的分數。redis正是通過分數來為集合中的成員進行從小到大的排序。
有序集合的成員是唯一的,但分數(score)卻可以重復。
集合是通過哈希表實現的,所以添加,刪除,查找的復雜度都是O(1)。
目錄:
Sorted-set(有序集合) | |||||
ZADD | ZREM | ZCARD | ZCOUNT | ZSCORE | ZINCRBY |
ZRANGE | ZREVRANGE | ZRANGEBYSCORE | ZREVRANGEBYSCORE | ZREMRANGEBYSCORE | ZINTER |
ZUNION | ZRANK | ZREVRANK | ZREMRANGEBYRANK |
Redis Zadd 命令用於將一個或多個成員元素及其分數值加入到有序集當中。(分數值可以是整數值或雙精度浮點數。)
(1)如果某個成員已經是有序集的成員,那么更新這個成員的分數值,並通過重新插入這個成員元素,來保證該成員在正確的位置上。
(2)如果有序集合 key 不存在,則創建一個空的有序集並執行 ZADD 操作。
(3)當 key 存在但不是有序集類型時,返回一個錯誤。
注意: 在 Redis 2.4 版本以前, ZADD 每次只能添加一個元素。
語法:
redis 127.0.0.1:6379> ZADD KEY_NAME SCORE1 VALUE1.. SCOREN VALUEN
返回值: 被成功添加的新成員的數量,不包括那些被更新的、已經存在的成員。
可用版本:>= 1.2.0
時間復雜度:O(M*log(N)),N是有序集的基數,M為成功添加的新成員的數量。
具體實例:
<?php $redis = new redis(); $redis -> connect('127.0.0.1',6379); $redis -> flushAll(); $redis -> zAdd('myset',0,'hello'); $redis -> zAdd('myset',1,'world'); $redis -> zAdd('myset',1,'foo'); // 集合中的元素唯一,但是分數可以重復
$redis -> zAdd('myset',2,'hi'); $redis -> zAdd('myset',2.5,'welcome'); var_dump($redis -> zRange('myset',0,-1,'withScores')); //array (size=5) // 'hello' => float 0 // 'foo' => float 1 // 'world' => float 1 // 'hi' => float 2 // 'welcome' => float 2.5
$redis -> zAdd('myset',3,'hi'); // hi 已經是 myset 的成員,此時更新分數值並重新插入這個成員元素
var_dump($redis -> zRange('myset',0,-1,'withScores')); //array (size=5) // 'hello' => float 0 // 'foo' => float 1 // 'world' => float 1 // 'welcome' => float 2.5 // 'hi' => float 3
Redis Zrem 命令用於移除有序集中的一個或多個成員,不存在的成員將被忽略。
當 key 存在但不是有序集類型時,返回一個錯誤。
注意: 在 Redis 2.4 版本以前, ZREM 每次只能刪除一個元素。
語法:
redis 127.0.0.1:6379> ZREM key member
返回值: 被成功移除的成員的數量,不包括被忽略的成員。
可用版本:>= 1.2.0
時間復雜度:O(M*log(N)),N為有序集的基數,M為被成功移除的成員的數量。
具體實例:
<?php $redis = new redis(); $redis -> connect('127.0.0.1',6379); $redis -> flushAll(); $redis -> zAdd('myset',0,'hello'); $redis -> zAdd('myset',1,'world'); $redis -> zAdd('myset',1,'foo'); // 集合中的元素唯一,但是分數可以重復
$redis -> zAdd('myset',2,'hi'); $redis -> zAdd('myset',2.5,'welcome'); $redis ->zRem('myset','hi'); // 一處集合中的某個元素
var_dump($redis -> zRange('myset',0,-1,'withScores')); //array (size=4) // 'hello' => float 0 // 'foo' => float 1 // 'world' => float 1 // 'welcome' => float 2.5
Redis Zcard 命令用於計算集合中元素的數量。
語法:
redis 127.0.0.1:6379> ZCARD KEY_NAME
返回值: 當 key 存在且是有序集類型時,返回有序集的基數。 當 key 不存在時,返回 0 。
可用版本:>= 1.2.0
時間復雜度:O(1)
具體實例:
<?php $redis = new redis(); $redis -> connect('127.0.0.1',6379); $redis -> flushAll(); $redis -> zAdd('myset',0,'hello'); $redis -> zAdd('myset',1,'world'); $redis -> zAdd('myset',1,'foo'); // 集合中的元素唯一,但是分數可以重復
$redis -> zAdd('myset',2,'hi'); $redis -> zAdd('myset',2.5,'welcome'); var_dump($redis ->zCard('myset')); // int 5
Redis Zcount 命令用於計算有序集合中指定分數區間的成員數量。
語法:
redis 127.0.0.1:6379> ZCOUNT key min max
返回值: 分數值在 min 和 max 之間的成員的數量。
可用版本:>= 2.0.0
時間復雜度:O(log(N)+M),N為有序集的基數,M為值在min和max之間的元素的數量。
具體實例:
<?php $redis = new redis(); $redis -> connect('127.0.0.1',6379); $redis -> flushAll(); $redis -> zAdd('myset',0,'hello'); $redis -> zAdd('myset',1,'world'); $redis -> zAdd('myset',1,'foo'); // 集合中的元素唯一,但是分數可以重復
$redis -> zAdd('myset',2,'hi'); $redis -> zAdd('myset',2.5,'welcome'); $redis -> zAdd('myset',3,'score'); // 1分到3分之間的值有5個
var_dump($redis ->zCount('myset',1,3)); // int 5
Redis Zscore 命令返回有序集中,成員的分數值。 如果成員元素不是有序集 key 的成員,或 key 不存在,返回 nil 。
語法:
redis 127.0.0.1:6379> ZSCORE key member
返回值: 成員的分數值,以字符串形式表示。
可用版本:>= 1.2.0
時間復雜度:O(1)
具體實例:
<?php $redis = new redis(); $redis -> connect('127.0.0.1',6379); $redis -> flushAll(); $redis -> zAdd('myset',0,'hello'); $redis -> zAdd('myset',1,'world'); $redis -> zAdd('myset',1,'foo'); // 集合中的元素唯一,但是分數可以重復
$redis -> zAdd('myset',2,'hi'); $redis -> zAdd('myset',2.5,'welcome'); $redis -> zAdd('myset',3,'score'); // 返回 foo 的分數值
var_dump($redis ->zScore('myset','foo')); // float 1
Redis Zincrby 命令對有序集合中指定成員的分數加上增量 increment(分數值可以是整數值或雙精度浮點數。)
(1)可以通過傳遞一個負數值 increment ,讓分數減去相應的值,比如 ZINCRBY key -5 member ,就是讓 member 的 score 值減去 5 。
(2)當 key 不存在,或分數不是 key 的成員時, ZINCRBY key increment member 等同於 ZADD key increment member 。
(3)當 key 不是有序集類型時,返回一個錯誤。
語法:
redis 127.0.0.1:6379> ZINCRBY key increment member
返回值: member 成員的新分數值,以字符串形式表示。
可用版本:>= 1.2.0
時間復雜度:O(log(N))具體實例:
具體實例:
<?php $redis = new redis(); $redis -> connect('127.0.0.1',6379); $redis -> flushAll(); $redis -> zAdd('myset',0,'hello'); $redis -> zAdd('myset',1,'world'); $redis -> zAdd('myset',1,'foo'); // 集合中的元素唯一,但是分數可以重復
$redis -> zAdd('myset',2,'hi'); $redis -> zAdd('myset',2.5,'welcome'); $redis -> zAdd('myset',3,'score'); // 將 world 的分數增加0.6
var_dump($redis ->zIncrBy('myset',0.6,'world')); // float 1.6 // 將 score 的分減去1.2
var_dump($redis ->zIncrBy('myset',-1.2,'score')); // float 1.8
Redis Zrange 返回有序集中,指定區間內的成員。(其中成員的位置按分數值遞增(從小到大)來排序。具有相同分數值的成員按字典序(lexicographical order )來排列。)
如果你需要成員按值遞減(從大到小)來排列,請使用 ZREVRANGE 命令。
下標參數 start 和 stop 都以 0 為底,也就是說,以 0 表示有序集第一個成員,以 1 表示有序集第二個成員,以此類推。
你也可以使用負數下標,以 -1 表示最后一個成員, -2 表示倒數第二個成員,以此類推。
語法:
redis 127.0.0.1:6379> ZRANGE key start stop [WITHSCORES]
返回值:指定區間內,帶有分數值(可選)的有序集成員的列表。
可用版本:>= 1.2.0
時間復雜度:O(log(N)+M),N為有序集的基數,而M為結果集的基數。
具體實例:
<?php $redis = new redis(); $redis -> connect('127.0.0.1',6379); $redis -> flushAll(); $redis -> zAdd('myset',0,'hello'); $redis -> zAdd('myset',1,'world'); $redis -> zAdd('myset',1,'foo'); // 集合中的元素唯一,但是分數可以重復
$redis -> zAdd('myset',2,'hi'); $redis -> zAdd('myset',2.5,'welcome'); $redis -> zAdd('myset',3,'score'); var_dump($redis ->zRange('myset',0,-1,'withScore')); //array (size=6) // 'hello' => float 0 // 'foo' => float 1 // 'world' => float 1 // 'hi' => float 2 // 'welcome' => float 2.5 // 'score' => float 3
Redis Zrevrange 命令返回有序集中,指定區間內的成員。
其中成員的位置按分數值遞減(從大到小)來排列。
具有相同分數值的成員按字典序的逆序(reverse lexicographical order)排列。
除了成員按分數值遞減的次序排列這一點外, ZREVRANGE 命令的其他方面和 ZRANGE 命令一樣。
語法:
redis 127.0.0.1:6379> ZREVRANGE key start stop [WITHSCORES]
返回值:指定區間內,帶有分數值(可選)的有序集成員的列表。
可用版本:>= 1.2.0
時間復雜度:O(log(N)+M),N為有序集的基數,而M為結果集的基數
具體實例:
<?php $redis = new redis(); $redis -> connect('127.0.0.1',6379); $redis -> flushAll(); $redis -> zAdd('myset',0,'hello'); $redis -> zAdd('myset',1,'world'); $redis -> zAdd('myset',1,'foo'); // 集合中的元素唯一,但是分數可以重復
$redis -> zAdd('myset',2,'hi'); $redis -> zAdd('myset',2.5,'welcome'); $redis -> zAdd('myset',3,'score'); var_dump($redis ->zRevRange('myset',0,-1,'withScore')); //array (size=6) // 'score' => float 3 // 'welcome' => float 2.5 // 'hi' => float 2 // 'world' => float 1 // 'foo' => float 1 // 'hello' => float 0
Redis Zremrangebyscore 命令用於移除有序集中,指定分數(score)區間內的所有成員。
語法:
redis 127.0.0.1:6379> ZREMRANGEBYSCORE key min max
返回值:被移除成員的數量。
可用版本:>= 1.2.0
時間復雜度:O(log(N)+M),N為有序集的基數,M為被結果集的基數。
具體實例:
<?php $redis = new redis(); $redis -> connect('127.0.0.1',6379); $redis -> flushAll(); $redis -> zAdd('myset',0,'hello'); $redis -> zAdd('myset',1,'world'); $redis -> zAdd('myset',1,'foo'); $redis -> zAdd('myset',2,'hi'); $redis -> zAdd('myset',2.5,'welcome'); $redis -> zAdd('myset',3,'score'); var_dump($redis ->zRangeByScore('myset',2,3)); //array (size=3) // 0 => string 'hi' (length=2) // 1 => string 'welcome' (length=7) // 2 => string 'score' (length=5)
var_dump($redis ->zRangeByScore('myset','-inf','+inf')); // 返回分數值從負無窮到正無窮之間的值 //array (size=6) // 0 => string 'hello' (length=5) // 1 => string 'foo' (length=3) // 2 => string 'world' (length=5) // 3 => string 'hi' (length=2) // 4 => string 'welcome' (length=7) // 5 => string 'score' (length=5)
var_dump($redis -> zRange('myset',0,-1,'withScore')); // 原集合不變 //array (size=6) // 'hello' => float 0 // 'foo' => float 1 // 'world' => float 1 // 'hi' => float 2 // 'welcome' => float 2.5 // 'score' => float 3
Redis Zrevrangebyscore 返回有序集中指定分數區間內的所有的成員。有序集成員按分數值遞減(從大到小)的次序排列。
具有相同分數值的成員按字典序的逆序(reverse lexicographical order )排列。
除了成員按分數值遞減的次序排列這一點外, ZREVRANGEBYSCORE 命令的其他方面和 ZRANGEBYSCORE 命令一樣。
語法:
redis 127.0.0.1:6379> ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]
返回值:指定區間內,帶有分數值(可選)的有序集成員的列表。
可用版本:>= 2.2.0
時間復雜度:O(log(N)+M),N為有序集的基數,M為結果集的基數。
具體實例:
<?php $redis = new redis(); $redis -> connect('127.0.0.1',6379); $redis -> flushAll(); $redis -> zAdd('myset',0,'hello'); $redis -> zAdd('myset',1,'world'); $redis -> zAdd('myset',1,'foo'); $redis -> zAdd('myset',2,'hi'); $redis -> zAdd('myset',2.5,'welcome'); $redis -> zAdd('myset',3,'score'); var_dump($redis ->zRevRangeByScore('myset',3,2)); //array (size=3) // 0 => string 'score' (length=5) // 1 => string 'welcome' (length=7) // 2 => string 'hi' (length=2)
var_dump($redis ->zRevRangeByScore('myset','+inf','-inf')); // 返回分數值從正無窮到負無窮之間的值 //array (size=6) // 0 => string 'score' (length=5) // 1 => string 'welcome' (length=7) // 2 => string 'hi' (length=2) // 3 => string 'world' (length=5) // 4 => string 'foo' (length=3) // 5 => string 'hello' (length=5)
var_dump($redis -> zRange('myset',0,-1,'withScore')); // 原集合不變 //array (size=6) // 'hello' => float 0 // 'foo' => float 1 // 'world' => float 1 // 'hi' => float 2 // 'welcome' => float 2.5 // 'score' => float 3
Redis Zremrangebyscore 命令用於移除有序集中指定分數(score)區間內的所有成員。
語法:
redis 127.0.0.1:6379> ZREMRANGEBYSCORE key min max
返回值:被移除成員的數量。
可用版本:>= 1.2.0
時間復雜度:O(log(N)+M),N為有序集的基數,而M為被移除成員的數量。
具體實例:
<?php $redis = new redis(); $redis -> connect('127.0.0.1',6379); $redis -> flushAll(); $redis -> zAdd('myset',0,'hello'); // score=0
$redis -> zAdd('myset',1,'world'); // score=2
$redis -> zAdd('myset',1,'foo'); // score=1
$redis -> zAdd('myset',2,'hi'); // score=2
$redis -> zAdd('myset',2.5,'welcome'); // score=2.5
$redis -> zAdd('myset',3,'score'); // score=3
var_dump($redis ->zRemRangeByScore('myset',1,3)); // int 5
var_dump($redis ->zRange('myset',0,-1,'withScore')); //array (size=1) // 'hello' => float 0
Redis Zinter 命令計算給定的一個或多個有序集的交集. (作用與 redis 在 cmd 命令下的 ZINTERSTORE 作用相同)
默認情況下,結果集中某個成員的分數值是所有給定集下該成員分數值之和。
語法:
redis 127.0.0.1:6379> ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
返回值:保存到目標結果集的的成員數量。
可用版本:>= 2.0.0
時間復雜度:O(N*K)+O(M*log(M)),N為給定key中基數最小的有序集,K為給定有序集的數量,M為結果集的基數。
具體實例:
<?php $redis = new redis(); $redis -> connect('127.0.0.1',6379); $redis -> flushAll(); $redis -> zAdd('myset',0,'hello'); // score=0
$redis -> zAdd('myset',1,'world'); // score=2
$redis -> zAdd('myset',1,'foo'); // score=1
$redis -> zAdd('myset',2,'hi'); // score=2
$redis -> zAdd('myset',2.5,'welcome'); // score=2.5
$redis -> zAdd('myset',3,'score'); // score=3
$redis -> zAdd('otherset',0,'good'); $redis -> zAdd('otherset',1,'hello'); $redis -> zAdd('otherset',2,'world'); $array_set = array('myset','otherset'); var_dump($redis ->zInter('destinationset',$array_set)); // int 2
var_dump($redis ->zRange('destinationset',0,-1,'withScore')); //array (size=2) // 'hello' => float 1 // 'world' => float 3
Redis Zunionstore 命令計算給定的一個或多個有序集的並集.(其作用與 redis 在 cmd 中ZUNIONSTORE 相同)
默認情況下,結果集中某個成員的分數值是所有給定集下該成員分數值之和 。
語法:
redis 127.0.0.1:6379> ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
返回值:保存到 destination 的結果集的成員數量。
可用版本:>= 2.0.0
時間復雜度:O(N)+O(M log(M)),N為給定有序集基數的總和,M為結果集的基數。
具體實例:
<?php $redis = new redis(); $redis -> connect('127.0.0.1',6379); $redis -> flushAll(); $redis -> zAdd('myset',0,'hello'); // score=0
$redis -> zAdd('myset',1,'world'); // score=2
$redis -> zAdd('myset',1,'foo'); // score=1
$redis -> zAdd('myset',2,'hi'); // score=2
$redis -> zAdd('myset',2.5,'welcome'); // score=2.5
$redis -> zAdd('myset',3,'score'); // score=3
$redis -> zAdd('otherset',0,'good'); // score=0
$redis -> zAdd('otherset',1,'hello'); // score=1
$redis -> zAdd('otherset',2,'world'); // score=2
$array_set = array('myset','otherset'); var_dump($redis ->zUnion('destinationset',$array_set)); // int 7
var_dump($redis ->zRange('destinationset',0,-1,'withScore')); //array (size=7) // 'good' => float 0 // 'foo' => float 1 // 'hello' => float 1 // 'hi' => float 2 // 'welcome' => float 2.5 // 'score' => float 3 // 'world' => float 3
Redis Zrank 返回有序集中指定成員的排名。其中有序集成員按分數值遞增(從小到大)順序排列。
語法:
redis 127.0.0.1:6379> ZRANK key member
返回值:如果成員是有序集 key 的成員,返回 member 的排名。 如果成員不是有序集 key 的成員,返回 nil 。
可用版本:>= 2.0.0
時間復雜度:O(log(N))
具體實例:
<?php $redis = new redis(); $redis -> connect('127.0.0.1',6379); $redis -> flushAll(); $redis -> zAdd('myset',0,'hello'); $redis -> zAdd('myset',1,'world'); $redis -> zAdd('myset',1,'foo'); $redis -> zAdd('myset',2,'hi'); $redis -> zAdd('myset',2.5,'welcome'); $redis -> zAdd('myset',3,'score'); var_dump($redis ->zRank('myset','welcome')); // int 4
Redis Zrevrank 命令返回有序集中成員的排名。其中有序集成員按分數值遞減(從大到小)排序。
排名以 0 為底,也就是說, 分數值最大的成員排名為 0 。
語法:
redis 127.0.0.1:6379> ZREVRANK key member
返回值:如果成員是有序集 key 的成員,返回成員的排名。 如果成員不是有序集 key 的成員,返回 nil 。
可用版本:>= 2.2.0
時間復雜度:O(log(N))
具體實例:
<?php $redis = new redis(); $redis -> connect('127.0.0.1',6379); $redis -> flushAll(); $redis -> zAdd('myset',0,'hello'); $redis -> zAdd('myset',1,'world'); $redis -> zAdd('myset',1,'foo'); $redis -> zAdd('myset',2,'hi'); $redis -> zAdd('myset',2.5,'welcome'); $redis -> zAdd('myset',3,'score'); var_dump($redis ->zRevRank('myset','welcome')); // int 1
Redis Zremrangebyrank 命令用於移除有序集中指定排名(rank)區間內的所有成員。
語法:
redis 127.0.0.1:6379> ZREMRANGEBYRANK key start stop
返回值:被移除成員的數量。
可用版本:>= 2.0.0
時間復雜度:O(log(N)+M),N為有序集的基數,而M為被移除成員的數量。
具體實例:
<?php $redis = new redis(); $redis -> connect('127.0.0.1',6379); $redis -> flushAll(); $redis -> zAdd('myset',0,'hello'); // rank=0
$redis -> zAdd('myset',1,'world'); // rank=2
$redis -> zAdd('myset',1,'foo'); // rank=1
$redis -> zAdd('myset',2,'hi'); // rank=3
$redis -> zAdd('myset',2.5,'welcome'); // rank=4
$redis -> zAdd('myset',3,'score'); // rank=5
var_dump($redis ->zRemRangeByRank('myset',1,3)); // int 3
var_dump($redis ->zRange('myset',0,-1,'withScore')); //array (size=3) // 'hello' => float 0 // 'welcome' => float 2.5 // 'score' => float 3
如有轉載,請注明出處:http://www.cnblogs.com/chrdai/p/6851731.html