Redis 有序集合和集合一樣也是string類型元素的集合,且不允許重復的成員僵腺。
不同的是每個元素都會關聯(lián)一個double類型的分數(shù)庐氮。redis正是通過分數(shù)來為集合中的成員進行從小到大的排序。
有序集合的成員是唯一的,但分數(shù)(score)卻可以重復售淡。
集合是通過哈希表實現(xiàn)的挤巡,所以添加,刪除浮庐,查找的復雜度都是O(1)。
Sorted-set(有序集合)
1柬焕、ZADD
Redis Zadd 命令用于將一個或多個成員元素及其分數(shù)值加入到有序集當中审残。(分數(shù)值可以是整數(shù)值或雙精度浮點數(shù)。)
(1)如果某個成員已經(jīng)是有序集的成員斑举,那么更新這個成員的分數(shù)值搅轿,并通過重新插入這個成員元素,來保證該成員在正確的位置上富玷。
(2)如果有序集合 key 不存在璧坟,則創(chuàng)建一個空的有序集并執(zhí)行 ZADD 操作。
(3)當 key 存在但不是有序集類型時赎懦,返回一個錯誤沸柔。
注意: 在 Redis 2.4 版本以前, ZADD 每次只能添加一個元素铲敛。
返回值: 被成功添加的新成員的數(shù)量,不包括那些被更新的会钝、已經(jīng)存在的成員伐蒋。
<?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'); // 集合中的元素唯一,但是分數(shù)可以重復
$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 已經(jīng)是 myset 的成員迁酸,此時更新分數(shù)值并重新插入這個成員元素
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
2先鱼、ZREM
Redis Zrem 命令用于移除有序集中的一個或多個成員,不存在的成員將被忽略奸鬓。
當 key 存在但不是有序集類型時焙畔,返回一個錯誤。
注意: 在 Redis 2.4 版本以前串远, ZREM 每次只能刪除一個元素宏多。
redis 127.0.0.1:6379> ZREM key member
php語法:
<?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'); // 集合中的元素唯一儿惫,但是分數(shù)可以重復
$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
3、ZCARD
Redis Zcard 命令用于計算集合中元素的數(shù)量伸但。
<?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'); // 集合中的元素唯一肾请,但是分數(shù)可以重復
$redis -> zAdd('myset',2,'hi');
$redis -> zAdd('myset',2.5,'welcome');
var_dump($redis ->zCard('myset')); // int 5
4、ZCOUNT
Redis Zcount 命令用于計算有序集合中指定分數(shù)區(qū)間的成員數(shù)量更胖。
<?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'); // 集合中的元素唯一铛铁,但是分數(shù)可以重復
$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
5、ZSCORE
Redis Zscore 命令返回有序集中却妨,成員的分數(shù)值饵逐。 如果成員元素不是有序集 key 的成員,或 key 不存在彪标,返回 nil 倍权。
<?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'); // 集合中的元素唯一,但是分數(shù)可以重復
$redis -> zAdd('myset',2,'hi');
$redis -> zAdd('myset',2.5,'welcome');
$redis -> zAdd('myset',3,'score');
// 返回 foo 的分數(shù)值
var_dump($redis ->zScore('myset','foo')); // float 1
6捐下、ZINCRBY
Redis Zincrby 命令對有序集合中指定成員的分數(shù)加上增量 increment(分數(shù)值可以是整數(shù)值或雙精度浮點數(shù)账锹。)
(1)可以通過傳遞一個負數(shù)值 increment ,讓分數(shù)減去相應的值坷襟,比如 ZINCRBY key -5 member 奸柬,就是讓 member 的 score 值減去 5 。
(2)當 key 不存在婴程,或分數(shù)不是 key 的成員時廓奕, ZINCRBY key increment member 等同于 ZADD key increment member 。
(3)當 key 不是有序集類型時档叔,返回一個錯誤桌粉。
<?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'); // 集合中的元素唯一,但是分數(shù)可以重復
$redis -> zAdd('myset',2,'hi');
$redis -> zAdd('myset',2.5,'welcome');
$redis -> zAdd('myset',3,'score');
// 將 world 的分數(shù)增加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
7衙四、ZRANGE
Redis Zrange 返回有序集中铃肯,指定區(qū)間內(nèi)的成員。(其中成員的位置按分數(shù)值遞增(從小到大)來排序传蹈。具有相同分數(shù)值的成員按字典序(lexicographical order )來排列押逼。)
如果你需要成員按值遞減(從大到小)來排列,請使用 ZREVRANGE 命令惦界。
下標參數(shù) start 和 stop 都以 0 為底挑格,也就是說,以 0 表示有序集第一個成員沾歪,以 1 表示有序集第二個成員漂彤,以此類推。
你也可以使用負數(shù)下標,以 -1 表示最后一個成員挫望, -2 表示倒數(shù)第二個成員立润,以此類推。
<?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'); // 集合中的元素唯一士骤,但是分數(shù)可以重復
$redis -> zAdd('myset',2,'hi');
$redis -> zAdd('myset',2.5,'welcome');
$redis -> zAdd('myset',3,'score');
var_dump($redis ->zRange('myset',0,-1,'withScore'));
8范删、ZREVRANGE
Redis Zrevrange 命令返回有序集中,指定區(qū)間內(nèi)的成員拷肌。
其中成員的位置按分數(shù)值遞減(從大到小)來排列到旦。
具有相同分數(shù)值的成員按字典序的逆序(reverse lexicographical order)排列。
除了成員按分數(shù)值遞減的次序排列這一點外巨缘, ZREVRANGE 命令的其他方面和 ZRANGE 命令一樣添忘。
<?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'); // 集合中的元素唯一,但是分數(shù)可以重復
$redis -> zAdd('myset',2,'hi');
$redis -> zAdd('myset',2.5,'welcome');
$redis -> zAdd('myset',3,'score');
var_dump($redis ->zRevRange('myset',0,-1,'withScore'));
9若锁、ZRANGEBYSCORE
Redis Zremrangebyscore 命令用于移除有序集中搁骑,指定分數(shù)(score)區(qū)間內(nèi)的所有成員。
<?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')); // 返回分數(shù)值從負無窮到正無窮之間的值
//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
10又固、ZREVRANGEBYSCORE
Redis Zrevrangebyscore 返回有序集中指定分數(shù)區(qū)間內(nèi)的所有的成員仲器。有序集成員按分數(shù)值遞減(從大到小)的次序排列。
具有相同分數(shù)值的成員按字典序的逆序(reverse lexicographical order )排列仰冠。
除了成員按分數(shù)值遞減的次序排列這一點外乏冀, ZREVRANGEBYSCORE 命令的其他方面和 ZRANGEBYSCORE 命令一樣。
<?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')); // 返回分數(shù)值從正無窮到負無窮之間的值
//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
11洋只、ZREMRANGEBYSCORE
Redis Zremrangebyscore 命令用于移除有序集中指定分數(shù)(score)區(qū)間內(nèi)的所有成員辆沦。
<?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
12、ZINTER
Redis Zinter 命令計算給定的一個或多個有序集的交集. (作用與 redis 在 cmd 命令下的 ZINTERSTORE 作用相同)
默認情況下识虚,結果集中某個成員的分數(shù)值是所有給定集下該成員分數(shù)值之和肢扯。
<?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
13、ZUNION
Redis Zunionstore 命令計算給定的一個或多個有序集的并集.(其作用與 redis 在 cmd 中ZUNIONSTORE 相同)
默認情況下担锤,結果集中某個成員的分數(shù)值是所有給定集下該成員分數(shù)值之和 蔚晨。
<?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
14、ZRANK
Redis Zrank 返回有序集中指定成員的排名肛循。其中有序集成員按分數(shù)值遞增(從小到大)順序排列蛛株。
<?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
15、ZREVRANK
Redis Zrevrank 命令返回有序集中成員的排名育拨。其中有序集成員按分數(shù)值遞減(從大到小)排序。
排名以 0 為底欢摄,也就是說熬丧, 分數(shù)值最大的成員排名為 0 。
<?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
16怀挠、ZREMRANGEBYRANK
Redis Zremrangebyrank 命令用于移除有序集中指定排名(rank)區(qū)間內(nèi)的所有成員析蝴。
<?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'));