redis 在 php 中的應(yīng)用(key篇)

KEY(鍵)

Redis DEL 命令用于刪除已存在的鍵负饲。不存在的 key 會被忽略瘫筐。

<?php
$redis = new redis();
$redis->connect('127.0.0.1',6379);
// The first case 刪除單獨(dú)的 key
$redis->set('w3ckey','redis');
var_dump($redis->get('w3ckey'));     // 返回 redis
$redis ->del('w3ckey');              // 刪除該key蜜暑,若需要獲取返回值,則返回值為 int(1)
var_dump($redis->get('w3ckey'));     // 返回 boolean(false)

// The second case 刪除一個(gè)不存在的 key
if(!$redis->exists('fake_key'))
{
    var_dump($redis->del('fake_key'));   // 返回 int();
}

// The third case 同時(shí)刪除多個(gè) key
$array_mset = array(
  'key1' => 'val1',
  'key2' => 'val2',
  'key3' => 'val3',
);
$redis->mset($array_mset);           // 使用 mset 同時(shí)存儲多個(gè)值
$array_mget = array('key1', 'key2', 'key3');
var_dump($redis->mget($array_mget)); // 返回 array (size=3)0 => string 'val1' (length=4) 1 => string 'val2' (length=4) 2 => string 'val3' (length=4)
$redis -> del($array_mget);          // 同時(shí)刪除多個(gè)值
var_dump($redis->mget($array_mget)); // 返回 array (size=3) 0 => boolean false 1 => boolean false 2 => boolean false

2策肝、EXISTS

Redis EXISTS 命令用于檢查給定 key 是否存在肛捍。

<?php
$redis = new redis();
$redis->connect('127.0.0.1',6379);
$redis->set('w3ckey','redis');
var_dump($redis->exists('w3ckey'));   // boolean true
$redis ->del('w3ckey');
var_dump($redis->exists('w3ckey'));   // boolean(false)

3、EXPIRE

Redis Expire 命令用于設(shè)置 key 的過期時(shí)間之众。key 過期后將不再可用拙毫。

<?php
$redis = new redis();
$redis->connect('127.0.0.1',6379);
$redis->set('w3ckey','redis');
$redis->expire('w3ckey',20);      // 設(shè)置 w3ckey 的剩余生存時(shí)間為 20s
sleep(2);
var_dump($redis->TTL('w3ckey'));  // 查看給定 key 的剩余生存時(shí)間,int 18
$redis->expire('w3ckey',30);      // 更新 w3ckey 的剩余生存時(shí)間為 30s
sleep(3);
var_dump($redis->TTL('w3ckey'));  // int 27

4棺禾、EXPIREAT

Redis Expireat 命令用于以 UNIX 時(shí)間戳(unix timestamp)格式設(shè)置 key 的過期時(shí)間缀蹄。key 過期后將不再可用。EXPIREAT的作用和EXPIRE一樣膘婶,都用于為key設(shè)置生存時(shí)間缺前。不同在于EXPIREAT命令接受的時(shí)間參數(shù)是UNIX時(shí)間戳(unix timestamp)。

<?php
$redis = new redis();
$redis->connect('127.0.0.1',6379);
$redis->set('w3ckey','redis');
$redis->expireAt('w3ckey',time()+10);      // 設(shè)置 w3ckey 的剩余生存時(shí)間為 10s 后過期
sleep(3);
var_dump($redis->TTL('w3ckey'));           // 查看給定 key 的剩余生存時(shí)間悬襟,int 7

5瞬逊、KEYS

Redis Keys 命令用于查找所有符合給定模式 pattern 的 key 。

(1)KEYS * 命中數(shù)據(jù)庫中所有key窃肠。
(2)KEYS h?llo 命中hello纺弊, hallo and hxllo等。
(3)KEYS h*llo 命中hllo和heeeeello等逸绎。
(4)KEYS h[ae]llo 命中hello和hallo惹恃,但不命中hillo。
(5)特殊符號用""隔開

<?php
$redis = new redis();
$redis->connect('127.0.0.1',6379);
$redis->flushAll();
$array_mset_keys = array(
    'one' => 1,
    'two' => 2,
    'three' => 3,
    'four' => 4,
);
$redis -> mset($array_mset_keys);
// KEYS * 命中數(shù)據(jù)庫中所有key棺牧。
var_dump($redis -> keys('*'));   
 // array (size=4) 0 => string 'four' (length=4) 1 => string 'two' (length=3) 2 => string 'three' (length=5) 3 => string 'one' (length=3)

// KEYS *o* 命中所有包含 "o" 的key巫糙。
var_dump($redis -> keys('*o*')); 
 // array (size=4) 0 => string 'four' (length=4) 1 => string 'two' (length=3) 2 => string 'one' (length=3)

// KEYS 0?? 命中 "o" 后面有幾個(gè)問號就命中幾位數(shù)。
var_dump($redis->keys("o??"));   
 //array (size=1) 0 => string 'one' (length=3)

// KEYS t[wh]* 命中 "t" 后面跟了 "w" , "h" 或者 "wh" 的key颊乘。
var_dump($redis->keys("t[wh]*")); 
//array (size=2) 0 => string 'two' (length=3) 1 => string 'three' (length=5)

6参淹、MOVE

Redis Keys 命令用于將當(dāng)前數(shù)據(jù)庫(默認(rèn)為0)的key移動到給定的數(shù)據(jù)庫db當(dāng)中醉锄。如果當(dāng)前數(shù)據(jù)庫(源數(shù)據(jù)庫)和給定數(shù)據(jù)庫(目標(biāo)數(shù)據(jù)庫)有相同名字的給定key,或者key不存在于當(dāng)前數(shù)據(jù)庫浙值,那么MOVE沒有任何效果恳不。

<?php
$redis = new redis();
$redis->connect('127.0.0.1',6379);
$redis->flushAll();

// This first case: key 存在于當(dāng)前數(shù)據(jù)庫
$redis -> select(0);                            // redis 默認(rèn)使用數(shù)據(jù)庫0,這里在顯示指定一次
$redis -> set('favorite_fruit','pineapple');    // 確保 key 值存在
if($redis -> move('favorite_fruit',1)){         // 將 favorite_fruit 移動到數(shù)據(jù)庫 1 中开呐, int 1
    $redis -> select(1);                        // 選擇數(shù)據(jù)庫 1
    var_dump($redis -> get('favorite_fruit'));  // string pineapple
}

// This second case: key 不存在
$redis -> select(0);
if(! $redis->exists('fake_key')){               // key 不存在
    $redis -> move('fake_key',1);               // 將 favorite_fruit 移動到數(shù)據(jù)庫 1 中烟勋, int 0
}
$redis -> select(1);
var_dump($redis->exists('fake_key'));           // boolean (false)

// This third case: 源數(shù)據(jù)庫和目標(biāo)數(shù)據(jù)庫有相同的 key
$redis -> select(0);
$redis -> set('favorite_singer','Jay Chou');    // db0 和 db1 有相同的 key : favorite_singer
$redis -> select(1);
$redis -> set('favorite_singer','Xu Wei');
$redis -> select(0);
$redis -> move('favorite_singer',1);            // 將 favorite_fruit 移動到數(shù)據(jù)庫 1 中, int 0
echo $redis -> get('favorite_singer');          // db0 的值沒有發(fā)生改變筐付,string Jay Chou
$redis -> select(1);
echo $redis -> get('favorite_singer');          // db1 的值沒有發(fā)生改變卵惦,string Xu Wei

7、PERSIST

Redis PERSIST 命令用于移除給定 key 的過期時(shí)間瓦戚,使得 key 永不過期沮尿。

<?php
$redis = new redis();
$redis->connect('127.0.0.1',6379);
$redis->flushAll();

// This first case: key 存在且設(shè)置了過期時(shí)間
$redis -> set('favorite_fruit','pineapple');
$redis -> expire('favorite_fruit',20);
sleep(2);
echo $redis -> ttl('favorite_fruit')."</br>";    // 18
$redis -> persist('favorite_fruit');             // 移除過期時(shí)間
echo $redis -> ttl('favorite_fruit');            // -1 ,表示成功移除過期時(shí)間

// This second case: key 不存在
$redis -> select(0);
if(! $redis->exists('fake_key')){               // key 不存在
    var_dump($redis -> persist('fake_key'));    // boolean false
}

// This third case: key 存在但是沒有設(shè)置過期時(shí)間
$redis -> select(0);
$redis -> set('favorite_singer','Jay Chou');
var_dump($redis -> persist('favorite_singer'));  // boolean false

8、TTL

Redis TTL 命令以秒為單位返回 key 的剩余過期時(shí)間较解。

<?php
$redis = new redis();
$redis->connect('127.0.0.1',6379);
$redis->flushAll();

// This first case: key 存在且設(shè)置了過期時(shí)間
$redis -> set('favorite_fruit','pineapple');
$redis -> expire('favorite_fruit',20);
sleep(2);
echo $redis -> ttl('favorite_fruit')."</br>";    // 18

// This second case: key 不存在
$redis -> select(0);
if(! $redis->exists('fake_key')){               // key 不存在
    var_dump($redis -> ttl('fake_key'));        // int -2
}

// This third case: key 存在但是沒有設(shè)置過期時(shí)間
$redis -> select(0);
$redis -> set('favorite_singer','Jay Chou');
var_dump($redis -> ttl('favorite_singer'));     // int -1

9畜疾、RANDOMKEY

Redis RANDOMKEY 命令從當(dāng)前數(shù)據(jù)庫中隨機(jī)返回一個(gè) key (不刪除) 。

<?php
$redis = new redis();
$redis->connect('127.0.0.1',6379);

// This first case: 數(shù)據(jù)庫不為空
$array_mset_randomkey = array(
    'fruit' => 'pineapple',
    'food' => 'beef',
    'drink' => 'beer'
);
$redis -> mset($array_mset_randomkey);
var_dump($redis -> randomKey());        // string 'food' ,隨機(jī)返回一個(gè) key
var_dump($redis -> keys('*'));          // 查看數(shù)據(jù)庫里所有的 key ,驗(yàn)證 randomKey 不刪除任何 key

// This second case: 數(shù)據(jù)庫為空
$redis->flushAll();                     // 清空數(shù)據(jù)庫里的數(shù)據(jù)
var_dump($redis -> randomKey());        // boolean false

10印衔、RENAME

Redis Rename 命令用于修改 key 的名稱 啡捶。

<?php
$redis = new redis();
$redis->connect('127.0.0.1',6379);
$redis->flushAll();

// This first case: key 存在且 newkey 不存在 ,成功改名
$redis -> set('fruit','pineapple');
$redis -> rename('fruit','favorite_fruit');     // 重命名
var_dump($redis -> exists('fruit'));            // boolean false, 原來的 key 已經(jīng)不存在
var_dump($redis -> exists('favorite_fruit'));   // boolean true, key 變成了 newkey

// This second case: key 不存在 当编,返回錯(cuò)誤
$redis->flushAll();
if(! $redis ->exists('fake_key'))
{
    var_dump($redis -> rename('fake_key','never_exists'));  // boolean false
}

// This third case: key 和 newkey 相同 届慈,返回錯(cuò)誤
$redis -> set('favorite_singer','Jay Chou');
var_dump($redis -> rename('favorite_singer','favorite_singer')); // boolean false

// This fourth case: newkey 已經(jīng)存在, 覆蓋
$redis -> set('PC','SONY');
$redis -> set('personal_computer','lenovo');
var_dump($redis -> rename('PC','personal_computer'));       // boolean true
var_dump($redis -> get('personal_computer'));               // string SONY

11、RENAMENX

Redis Renamenx 命令用于在新的 key 不存在時(shí)修改 key 的名稱 忿偷。

<?php
$redis = new redis();
$redis->connect('127.0.0.1',6379);
$redis->flushAll();

// This first case: key 存在且 newkey 不存在 金顿,成功改名
$redis -> set('fruit','pineapple');
$redis -> renameNx('fruit','favorite_fruit');     // 重命名
var_dump($redis -> exists('fruit'));            // boolean false, 原來的 key 已經(jīng)不存在
var_dump($redis -> exists('favorite_fruit'));   // boolean true, key 變成了 newkey

// This second case: newkey已經(jīng)存在,改名失敗
$redis -> set('PC','SONY');
$redis -> set('personal_computer','lenovo');
var_dump($redis -> renameNx('PC','personal_computer'));       // boolean false
var_dump($redis -> get('PC'));                                // string SONY
var_dump($redis -> get('personal_computer'));                 // string lenovo

12鲤桥、TYPE

Redis Type 命令用于返回 key 所儲存的值的類型揍拆。

<?php
$redis = new redis();
$redis->connect('127.0.0.1',6379);

// This first case: key 不存在 ,返回 int(0)
$redis->flushAll();
var_dump($redis -> type('fake_key'));           // int(0)

// This second case: 字符串類型 ,返回 int(1)
$redis -> set('favorite_fruit','banana');
var_dump($redis -> type('favorite_fruit'));     // int(1)

// This third case: 集合類型 茶凳, 返回 int(2)
$redis -> sAdd('favorite_singer','Jay Chou');
var_dump($redis -> type('favorite_singer'));     // int(2)

// This fourth case: 列表類型 嫂拴, 返回 int(3)
$redis -> lPush('program','PHP');
var_dump($redis -> type('program'));            // int(3)

// This fifth case: 有序類型 , 返回 int(4)
$redis -> zAdd('pats','0','dog');
$redis -> zAdd('pats','1','cat');
$redis -> zAdd('pats','1','pig');
$redis -> zAdd('pats','2','fox');
var_dump($redis -> zRange('pats',0,-1));        // array (size=4) 0 => string 'dog' (length=3) 1 => string 'cat' (length=3) 2 => string 'pig' (length=3) 3 => string 'fox' (length=3)
var_dump($redis -> type('pats'));               // int(4)

// This sixth case: 哈希類型 贮喧, 返回 int(5)
$redis -> hSet('website','baidu','www.baidu.com');
var_dump($redis -> hGet('website','baidu'));    // string www.baidu.com
var_dump($redis -> type('website'));            // int(5)

13筒狠、sort

返回或保存給定列表、集合箱沦、有序集合 key 中經(jīng)過排序的元素辩恼。
排序默認(rèn)以數(shù)字作為對象,值被解釋為雙精度浮點(diǎn)數(shù),然后進(jìn)行比較灶伊。

1疆前、sort key ,若保存的值是數(shù)字聘萨,返回列表值從小到大的結(jié)果

//  sort key ,按從小到大進(jìn)行排序
$redis -> flushAll();
$redis -> lPush('number',1.5);
$redis -> lPush('number',18);
$redis -> lPush('number',75);
$redis -> lPush('number',38);
var_dump($redis -> sort('number'));    
// array (size=4) 
//  0 => string '1.5' (length=3) 
//  1 => string '18' (length=2) 
//  2 => string '38' (length=2) 
//  3 => string '75' (length=2)

2竹椒、 若保存的是字符串,使用sort(key,array('ALPHA'=>TRUE))進(jìn)行排序(按字母表順序)

<?php
$redis = new redis();
$redis -> connect('127.0.0.1',6379);

//  若保存的是字符串米辐,使用sort(key,array('ALPHA'=>TRUE))進(jìn)行排序(按字母表順序)
$redis -> flushAll();
$redis -> lPush('website','www.baidu.com');
$redis -> lPush('website','www.google.com');
$redis -> lPush('website','www.tencent.com');
$redis -> lPush('website','www.firefox.com');
var_dump($redis -> sort('website', array('ALPHA'=>TRUE)));
//  array (size=4)
//      0 => string 'www.baidu.com' (length=13)
//      1 => string 'www.firefox.com' (length=15)
//      2 => string 'www.google.com' (length=14)
//      3 => string 'www.tencent.com' (length=15)

3胸完、排序之后返回的元素可以通過LIMIT修飾符進(jìn)行限制

使用sort(key,array('LIMIT'=>array(offset,count)))

LIMIT修飾符接受兩個(gè)參數(shù):offset 和 count。

offset指定要跳過的元素?cái)?shù)量儡循,count指定跳過offset個(gè)指定的元素之后舶吗,要返回多少個(gè)對象征冷。

(1)排序的值為數(shù)字:

<?php
$redis = new redis();
$redis -> connect('127.0.0.1',6379);

//  若排序之后返回的元素?cái)?shù)量可以通過LIMIT修飾符進(jìn)行限制择膝,使用sort(key,array('LIMIT'=>array(offset,count)))
//  LIMIT修飾符接受兩個(gè)參數(shù):offset和count。
// offset指定要跳過的元素?cái)?shù)量检激,count指定跳過offset個(gè)指定的元素之后肴捉,要返回多少個(gè)對象。
$redis -> flushAll();
$redis -> lPush('rank',5);  //1
$redis -> lPush('rank',55); //7
$redis -> lPush('rank',52); //6
$redis -> lPush('rank',25); //4
$redis -> lPush('rank',24); //3
$redis -> lPush('rank',37); //5
$redis -> lPush('rank',13); //2
$redis -> lPush('rank',87); //8
$redis_sort_option = array('LIMIT' => array(2,5));      // 正序排序叔收,跳過 2 個(gè)元素齿穗,跳過之后返回 5 個(gè)元素
var_dump($redis -> sort('rank', $redis_sort_option));
//  array (size=5)
//      0 => string '24' (length=2)
//      1 => string '25' (length=2)
//      2 => string '37' (length=2)
//      3 => string '52' (length=2)
//      4 => string '55' (length=2)

$redis_sort_desc = array('LIMIT' => array(2,5),'SORT'=>'desc');      // 逆序排序,跳過 2 個(gè)元素饺律,跳過之后返回 5 個(gè)元素
var_dump($redis -> sort('rank', $redis_sort_desc));
//  array (size=5)
//      0 => string '52' (length=2)
//      1 => string '37' (length=2)
//      2 => string '25' (length=2)
//      3 => string '24' (length=2)
//      4 => string '13' (length=2)

(2)排序的值為字符串

<?php
$redis = new redis();
$redis -> connect('127.0.0.1',6379);

//  若排序之后返回的元素?cái)?shù)量可以通過LIMIT修飾符進(jìn)行限制窃页,使用sort(key,array('LIMIT'=>array(offset,count)))
//  LIMIT修飾符接受兩個(gè)參數(shù):offset和count。
// offset指定要跳過的元素?cái)?shù)量复濒,count指定跳過offset個(gè)指定的元素之后脖卖,要返回多少個(gè)對象。
$redis -> flushAll();
$redis -> lPush('website','www.baidu.com');     //2
$redis -> lPush('website','www.tencent.com');   //7
$redis -> lPush('website','www.firefox.com');   //3
$redis -> lPush('website','www.wangyi.com');    //8
$redis -> lPush('website','www.google.com');    //4
$redis -> lPush('website','www.software.com');  //6
$redis -> lPush('website','www.12306.cn');      //1
$redis -> lPush('website','www.hao123.com');    //5
$redis_sort_option = array('LIMIT' => array(0,5),'ALPHA'=>TRUE);      // 正序排序巧颈,如果是字符串的話需要加 "ALPHA"=>TRUE ,跳過 0 個(gè)元素畦木,跳過之后返回 5 個(gè)元素
var_dump($redis -> sort('website', $redis_sort_option));
//  array (size=5)
//      0 => string 'www.12306.cn' (length=12)
//      1 => string 'www.baidu.com' (length=13)
//      2 => string 'www.firefox.com' (length=15)
//      3 => string 'www.google.com' (length=14)
//      4 => string 'www.hao123.com' (length=14)

$redis_sort_desc = array('LIMIT' => array(0,5),'SORT'=>'desc','ALPHA'=>TRUE);      // 逆序排序,跳過 0 個(gè)元素砸泛,跳過之后返回 5 個(gè)元素
var_dump($redis -> sort('website', $redis_sort_desc));
//  array (size=5)
//      0 => string 'www.wangyi.com' (length=14)
//      1 => string 'www.tencent.com' (length=15)
//      2 => string 'www.software.com' (length=16)
//      3 => string 'www.hao123.com' (length=14)
//      4 => string 'www.google.com' (length=14)

4十籍、使用外部 key 進(jìn)行排序

有時(shí)候會希望使用外部的key作為權(quán)重來比較元素,代替默認(rèn)的對比方法)唇礁。

假設(shè)現(xiàn)在有用戶(user)數(shù)據(jù)如下:

id name password level
1 Kangkang Kangkang123 5
4 Michael Michael123 3
2 Jane Jane123 2
3 Maria Maria123 7
  id 保存在 key 名為 user_id 的列表中勾栗;

name 保存在 username_{id} 的 key 中;

password 保存在 userpassword_{id} 的 key 中盏筐;

level 保存在 userlevel_{id} 的 key 中围俘。

(1)首先將數(shù)據(jù)加入到數(shù)據(jù)庫中

<?php
$redis = new redis();
$redis -> connect('127.0.0.1',6379);
$redis -> flushAll();

// kangkang
$redis -> lPush('user_id',1);
$redis -> set('username_1','Kangkang');
$redis -> set('userpassword_1','Kangkang123');
$redis -> set('userlevel_1',5);

// Michael
$redis -> lPush('user_id',4);
$redis -> set('username_4','Michael');
$redis -> set('userpassword_4','Michael123');
$redis -> set('userlevel_4',3);

// Jane
$redis -> lPush('user_id',2);
$redis -> set('username_2','Jane');
$redis -> set('userpassword_2','Jane123');
$redis -> set('userlevel_2',2);

// Maria
$redis -> lPush('user_id',3);
$redis -> set('username_3','Maria');
$redis -> set('userpassword_3','Maria123');
$redis -> set('userlevel_3',7);

(2)如果希望按 level 從大到小的順序排序,可以這樣做:

// 按 level 從大到小排序 id
$array_sort_option = array(
    'BY' => 'userlevel_*',
    'SORT' => 'DESC',
);
var_dump($redis -> sort('user_id',$array_sort_option));
//  array (size=4)
//      0 => string '3' (length=1)
//      1 => string '1' (length=1)
//      2 => string '4' (length=1)
//      3 => string '2' (length=1)

// 有時(shí)候只是返回相應(yīng)的id沒有什么用,你可能更希望排序后返回id對應(yīng)的用戶名楷拳,GET 可以幫忙實(shí)現(xiàn)
$array_sort_option = array(
    'BY' => 'userlevel_*',
    'SORT' => 'DESC',
    'GET' => 'username_*'
);
var_dump($redis -> sort('user_id',$array_sort_option));
//  array (size=4)
//      0 => string 'Maria' (length=5)
//      1 => string 'Kangkang' (length=8)
//      2 => string 'Michael' (length=7)
//      3 => string 'Jane' (length=4)

// 若不但希望獲取用戶名绣夺,還希望連用戶的密碼也一并列出,可以使用以下命令,可以多次地欢揖、有序地使用 GET 操作來獲取更多外部 key
$array_sort_option = array(
    'BY' => 'userlevel_*',
    'SORT' => 'DESC',
    'GET' => array('#','username_*','userpassword_*')   // 注意GET操作是有序的陶耍,GET username_* GET userpassword_* 和 GET userpassword_* GET username_*返回的結(jié)果位置不同, '#',為當(dāng)前元素
);
var_dump($redis -> sort('user_id',$array_sort_option));
//  array (size=12)
//      0 => string '3' (length=1)
//      1 => string 'Maria' (length=5)
//      2 => string 'Maria123' (length=8)
//      3 => string '1' (length=1)
//      4 => string 'Kangkang' (length=8)
//      5 => string 'Kangkang123' (length=11)
//      6 => string '4' (length=1)
//      7 => string 'Michael' (length=7)
//      8 => string 'Michael123' (length=10)
//      9 => string '2' (length=1)
//      10 => string 'Jane' (length=4)
//      11 => string 'Jane123' (length=7)

(3)只獲取對象而不排序(若希望獲取外部對象而又不希望引起排序開銷時(shí)使用她混,BY修飾符可以將一個(gè)不存在的key當(dāng)作權(quán)重烈钞,讓SORT跳過排序操作)。

// 此處無論是 ASC 還是 DESC 都無效坤按,是按照先 lpush 的user_id 在走后毯欣,后 lpush 的user_id 在最前
if(!$redis -> exists('fake_key')){
    $array_sort_option1 = array(
        'BY' => 'fake_key',
        'GET' => array('#','username_*','userpassword_*')
    );
    var_dump($redis -> sort('user_id',$array_sort_option1));
}
//  array (size=12)
//      0 => string '3' (length=1)
//      1 => string 'Maria' (length=5)
//      2 => string 'Maria123' (length=8)
//      3 => string '2' (length=1)
//      4 => string 'Jane' (length=4)
//      5 => string 'Jane123' (length=7)
//      6 => string '4' (length=1)
//      7 => string 'Michael' (length=7)
//      8 => string 'Michael123' (length=10)
//      9 => string '1' (length=1)
//      10 => string 'Kangkang' (length=8)
//      11 => string 'Kangkang123' (length=11)

(4)保存排序結(jié)果

默認(rèn)情況下,SORT操作只是簡單地返回排序結(jié)果臭脓,如果你希望保存排序結(jié)果酗钞,可以給 STORE 選項(xiàng)指定一個(gè)key作為參數(shù),排序結(jié)果將以列表的形式被保存到這個(gè)key上来累。(若指定key已存在砚作,則覆蓋。)

// 使用 STORE 之后嘹锁,可以將結(jié)果以 list 的形式保存在 STORE 所定義的 key 中葫录。
$array_sort_option = array(
    'BY' => 'userlevel_*',
    'SORT' => 'DESC',
    'GET' => array('#','username_*','userpassword_*'),
    'STORE' => 'userinfo_sort_by_level'
);
var_dump($redis -> sort('user_id',$array_sort_option));     // int 12
var_dump($redis -> lRange('userinfo_sort_by_level',0,-1));
//  array (size=12)
//      0 => string '3' (length=1)
//      1 => string 'Maria' (length=5)
//      2 => string 'Maria123' (length=8)
//      3 => string '1' (length=1)
//      4 => string 'Kangkang' (length=8)
//      5 => string 'Kangkang123' (length=11)
//      6 => string '4' (length=1)
//      7 => string 'Michael' (length=7)
//      8 => string 'Michael123' (length=10)
//      9 => string '2' (length=1)
//      10 => string 'Jane' (length=4)
//      11 => string 'Jane123' (length=7)

一個(gè)有趣的用法是將SORT結(jié)果保存,用EXPIRE為結(jié)果集設(shè)置生存時(shí)間领猾,這樣結(jié)果集就成了SORT操作的一個(gè)緩存米同。這樣就不必頻繁地調(diào)用SORT操作了,只有當(dāng)結(jié)果集過期時(shí)摔竿,才需要再調(diào)用一次SORT操作面粮。

有時(shí)候?yàn)榱苏_實(shí)現(xiàn)這一用法,你可能需要加鎖以避免多個(gè)客戶端同時(shí)進(jìn)行緩存重建(也就是多個(gè)客戶端拯坟,同一時(shí)間進(jìn)行SORT操作但金,并保存為結(jié)果集),具體參見SETNX命令郁季。

轉(zhuǎn)載冷溃,出處http://www.cnblogs.com/chrdai/p/6825684.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市梦裂,隨后出現(xiàn)的幾起案子似枕,更是在濱河造成了極大的恐慌,老刑警劉巖年柠,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凿歼,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)答憔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進(jìn)店門味赃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人虐拓,你說我怎么就攤上這事心俗。” “怎么了蓉驹?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵城榛,是天一觀的道長。 經(jīng)常有香客問我态兴,道長狠持,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任瞻润,我火速辦了婚禮喘垂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘敢订。我一直安慰自己王污,他們只是感情好罢吃,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布楚午。 她就那樣靜靜地躺著,像睡著了一般尿招。 火紅的嫁衣襯著肌膚如雪矾柜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天就谜,我揣著相機(jī)與錄音怪蔑,去河邊找鬼。 笑死丧荐,一個(gè)胖子當(dāng)著我的面吹牛缆瓣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播虹统,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼弓坞,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了车荔?” 一聲冷哼從身側(cè)響起渡冻,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎忧便,沒想到半個(gè)月后族吻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年超歌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了砍艾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,030評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡巍举,死狀恐怖辐董,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情禀综,我是刑警寧澤简烘,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站定枷,受9級特大地震影響孤澎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜欠窒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一覆旭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧岖妄,春花似錦型将、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至福扬,卻和暖如春腕铸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背铛碑。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工狠裹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人汽烦。 一個(gè)月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓涛菠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親撇吞。 傳聞我的和親對象是個(gè)殘疾皇子俗冻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評論 2 355

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