redis 在 php 中的應用(Sorted-set篇)

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'));

轉載自:https://www.cnblogs.com/chrdai/p/6851731.html

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末害捕,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子闷畸,更是在濱河造成了極大的恐慌尝盼,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件佑菩,死亡現(xiàn)場離奇詭異盾沫,居然都是意外死亡,警方通過查閱死者的電腦和手機殿漠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門赴精,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人绞幌,你說我怎么就攤上這事蕾哟。” “怎么了莲蜘?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵谭确,是天一觀的道長。 經(jīng)常有香客問我票渠,道長逐哈,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任庄新,我火速辦了婚禮鞠眉,結果婚禮上,老公的妹妹穿的比我還像新娘择诈。我一直安慰自己械蹋,他們只是感情好,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布羞芍。 她就那樣靜靜地躺著哗戈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪荷科。 梳的紋絲不亂的頭發(fā)上唯咬,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機與錄音畏浆,去河邊找鬼胆胰。 笑死,一個胖子當著我的面吹牛刻获,可吹牛的內(nèi)容都是我干的蜀涨。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼厚柳!你這毒婦竟也來了氧枣?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤别垮,失蹤者是張志新(化名)和其女友劉穎便监,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體碳想,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡烧董,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了移袍。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片解藻。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖葡盗,靈堂內(nèi)的尸體忽然破棺而出螟左,到底是詐尸還是另有隱情,我是刑警寧澤觅够,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布胶背,位于F島的核電站,受9級特大地震影響喘先,放射性物質發(fā)生泄漏钳吟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一窘拯、第九天 我趴在偏房一處隱蔽的房頂上張望红且。 院中可真熱鬧,春花似錦涤姊、人聲如沸暇番。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至辖所,卻和暖如春恨课,著一層夾襖步出監(jiān)牢的瞬間舆乔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工剂公, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留希俩,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓纲辽,卻偏偏與公主長得像颜武,于是被迫代替她去往敵國和親贫母。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容