1. 程式人生 > >redis在php中的應用(key篇)

redis在php中的應用(key篇)


KEY(鍵)

1、DEL

Redis DEL 命令用於刪除已存在的鍵。不存在的 key 會被忽略

語法:

 

redis 127.0.0.1:6379> DEL KEY_NAME

  

返回值: 被刪除 key 的數量

可用版本: >= 1.0.0

時間複雜度:O(N),N為要移除的key的數量。

      移除 單個字串型別的 key,時間複雜度為 O(1)。       移除 單個列表、集合、有序集合或雜湊表型別的key,時間複雜度為 O(M)M為以上資料結構內的元素數量。
<?php
$redis = new redis(); $redis->connect('127.0.0.1',6379); // The first case 刪除單獨的 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 刪除一個不存在的 key
if(!$redis->exists('fake_key')) { var_dump($redis->del('fake_key')); // 返回 int(); } // The third case 同時刪除多個 key $array_mset = array( 'key1' => 'val1', 'key2' => 'val2', 'key3' => 'val3', ); $redis->mset($array_mset); // 使用 mset 同時儲存多個值 $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); // 同時刪除多個值 var_dump($redis->mget($array_mget)); // 返回 array (size=3) 0 => boolean false 1 => boolean false 2 => boolean false

2、EXISTS

Redis EXISTS 命令用於檢查給定 key 是否存在

語法:

redis 127.0.0.1:6379> EXISTS KEY_NAME

返回值: 若 key 存在返回 1 ,否則返回 0 。

可用版本: >= 1.0.0

時間複雜度:O(1)

具體例項:

<?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 命令用於設定 key 的過期時間。key 過期後將不再可用。

語法:

redis 127.0.0.1:6379> EXPIRE KEY_NAME TIME_IN_SECONDS

返回值:設定成功返回 1 。 當 key 不存在或者不能為 key 設定過期時間時返回 0. (從2.1.3版本開始,key的生存時間可以被更新,也可以被PERSIST命令移除)

可用版本: >= 1.0.0

時間複雜度:O(1)

具體例項:

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

4、EXPIREAT

Redis Expireat 命令用於以 UNIX 時間戳(unix timestamp)格式設定 key 的過期時間。key 過期後將不再可用EXPIREAT的作用和EXPIRE一樣,都用於為key設定生存時間。不同在於EXPIREAT命令接受的時間引數是UNIX時間戳(unix timestamp)。

語法:

redis 127.0.0.1:6379> EXPIREAT KEY_NAME TIME_IN_UNIX_TIMESTAMP

返回值:設定成功返回 1 。 當 key 不存在或者不能為 key 設定過期時間時返回 0. 

可用版本: >= 1.0.0

時間複雜度:O(1)

具體例項:

<?php
$redis = new redis();
$redis->connect('127.0.0.1',6379);
$redis->set('w3ckey','redis');
$redis->expireAt('w3ckey',time()+10);      // 設定 w3ckey 的剩餘生存時間為 10s 後過期
sleep(3);
var_dump($redis->TTL('w3ckey'));           // 檢視給定 key 的剩餘生存時間,int 7

6、MOVE

Redis Keys 命令用於將當前資料庫(預設為0)的key移動到給定的資料庫db當中。如果當前資料庫(源資料庫)和給定資料庫(目標資料庫)有相同名字的給定key,或者key不存在於當前資料庫,那麼MOVE沒有任何效果

語法:

redis 127.0.0.1:6379> MOVE KEY_NAME DESTINATION_DATABASE

 

返回值:移動成功返回 1 ,失敗則返回 0 。

可用版本: >= 1.0.0

時間複雜度:O(1)

具體例項:

<?php
$redis = new redis();
$redis->connect('127.0.0.1',6379);
$redis->flushAll();
// This first case: key 存在於當前資料庫 $redis -> select(0); // redis 預設使用資料庫0,這裡在顯示指定一次 $redis -> set('favorite_fruit','pineapple'); // 確保 key 值存在 if($redis -> move('favorite_fruit',1)){ // 將 favorite_fruit 移動到資料庫 1 中, int 1 $redis -> select(1); // 選擇資料庫 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 移動到資料庫 1 中, int 0 } $redis -> select(1); var_dump($redis->exists('fake_key')); // boolean (false) // This third case: 源資料庫和目標資料庫有相同的 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 移動到資料庫 1 中, int 0 echo $redis -> get('favorite_singer'); // db0 的值沒有發生改變,string Jay Chou $redis -> select(1); echo $redis -> get('favorite_singer'); // db1 的值沒有發生改變,string Xu Wei

7、PERSIST

Redis PERSIST 命令用於移除給定 key 的過期時間,使得 key 永不過期

語法:

redis 127.0.0.1:6379> PERSIST KEY_NAME

返回值:當過期時間移除成功時,返回 1 。 如果 key 不存在或 key 沒有設定過期時間,返回 0

可用版本: >= 2.2.0

時間複雜度:O(1)

具體例項:

<?php
$redis = new redis();
$redis->connect('127.0.0.1',6379);
$redis->flushAll();
// This first case: key 存在且設定了過期時間 $redis -> set('favorite_fruit','pineapple'); $redis -> expire('favorite_fruit',20); sleep(2); echo $redis -> ttl('favorite_fruit')."</br>"; // 18 $redis -> persist('favorite_fruit'); // 移除過期時間 echo $redis -> ttl('favorite_fruit'); // -1 ,表示成功移除過期時間 // 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 存在但是沒有設定過期時間 $redis -> select(0); $redis -> set('favorite_singer','Jay Chou'); var_dump($redis -> persist('favorite_singer')); // boolean false

8、TTL

Redis TTL 命令以秒為單位返回 key 的剩餘過期時間

語法:

redis 127.0.0.1:6379> TTL KEY_NAME

返回值:

  (1)當 key 不存在時,返回 -2 

  (2)當 key 存在但沒有設定剩餘生存時間時,返回 -1 。

  (3)否則,以秒為單位,返回 key 的剩餘生存時間。

  注意:在 Redis 2.8 以前,當 key 不存在,或者 key 沒有設定剩餘生存時間時,命令都返回 -1 。

可用版本: >= 2.2.0

時間複雜度:O(1)

具體例項:

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

// This first case: key 存在且設定了過期時間
$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 存在但是沒有設定過期時間
$redis -> select(0);
$redis -> set('favorite_singer','Jay Chou');
var_dump($redis -> ttl('favorite_singer'));     // int -1

9、RANDOMKEY

Redis RANDOMKEY 命令從當前資料庫中隨機返回一個 key (不刪除) 。

語法:

redis 127.0.0.1:6379> RANDOMKEY 

返回值:當資料庫不為空時,返回一個 key 。 當資料庫為空時,返回 nil 。

可用版本: >= 1.0.0

時間複雜度:O(1)

具體例項 :

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

// This first case: 資料庫不為空
$array_mset_randomkey = array(
    'fruit' => 'pineapple',
    'food' => 'beef',
    'drink' => 'beer'
);
$redis -> mset($array_mset_randomkey);
var_dump($redis -> randomKey());        // string 'food' ,隨機返回一個 key
var_dump($redis -> keys('*'));          // 檢視資料庫裡所有的 key ,驗證 randomKey 不刪除任何 key

// This second case: 資料庫為空
$redis->flushAll();                     // 清空資料庫裡的資料
var_dump($redis -> randomKey());        // boolean false

10、RENAME

Redis Rename 命令用於修改 key 的名稱 。

語法:

redis 127.0.0.1:6379> RENAME OLD_KEY_NAME NEW_KEY_NAME

返回值:

(1)改名成功時提示 OK ,失敗時候返回一個錯誤。

(2)當 OLD_KEY_NAME 和 NEW_KEY_NAME 相同,或者 OLD_KEY_NAME 不存在時,返回一個錯誤。

(3)當 NEW_KEY_NAME 已經存在時, RENAME 命令將覆蓋舊值。

可用版本: >= 1.0.0

時間複雜度:O(1)

具體例項 :

<?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 已經不存在
var_dump($redis -> exists('favorite_fruit'));   // boolean true, key 變成了 newkey

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

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

// This fourth case: newkey 已經存在, 覆蓋
$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 不存在時修改 key 的名稱 。

語法:

redis 127.0.0.1:6379> RENAMENX OLD_KEY_NAME NEW_KEY_NAME

返回值:修改成功時,返回 1 。 如果 NEW_KEY_NAME 已經存在,返回 0 。

可用版本: >= 1.0.0

時間複雜度:O(1)

具體例項 :

<?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 已經不存在
var_dump($redis -> exists('favorite_fruit'));   // boolean true, key 變成了 newkey

// This second case: newkey已經存在,改名失敗
$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 所儲存的值的型別

語法:

redis 127.0.0.1:6379> TYPE KEY_NAME 

返回值: 返回 key 的資料型別,資料型別有:

  • none (key不存在)   int(0)
  • string (字串)     int(1)
  • set (集合)           int(2)
  • list (列表)              int(3)
  • zset (有序集)          int(4)
  • hash (雜湊表)         int(5)

可用版本: >= 1.0.0

時間複雜度:O(1)

具體例項 :

<?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

Redis Type 命令用於返回 key 所儲存的值的型別

語法:

SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC | DESC] [ALPHA] [STORE destination]

  array(
    'by' => 'some_pattern_*',
    'limit' => array(offset, count),
    'get' => 'some_other_pattern_*' or an array of patterns,
    'sort' => 'asc' or 'desc',
    'alpha' => TRUE,
    'store' => 'external-key'
  )

返回值: 返回或儲存給定列表、集合、有序集合key中經過排序的元素。(排序預設以數字作為物件,值被解釋為雙精度浮點數,然後進行比較)。

具體例項 :

1、sort key  ,若儲存的值是數字,返回列表值從小到大的結果

//  sort key ,按從小到大進行排序
$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))進行排序(按字母表順序)

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

//  若儲存的是字串,使用sort(key,array('ALPHA'=>TRUE))進行排序(按字母表順序)
$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修飾符進行限制,使用sort(key,array('LIMIT'=>array(offset,count)))

  LIMIT修飾符接受兩個引數:offset 和 count。

  offset指定要跳過的元素數量,count指定跳過offset個指定的元素之後,要返回多少個物件

(1)排序的值為數字:

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

//  若排序之後返回的元素數量可以通過LIMIT修飾符進行限制,使用sort(key,array('LIMIT'=>array(offset,count)))
//  LIMIT修飾符接受兩個引數:offset和count。
// offset指定要跳過的元素數量,count指定跳過offset個指定的元素之後,要返回多少個物件。
$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 個元素,跳過之後返回 5 個元素
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 個元素,跳過之後返回 5 個元素
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);

//  若排序之後返回的元素數量可以通過LIMIT修飾符進行限制,使用sort(key,array('LIMIT'=>array(offset,count)))
//  LIMIT修飾符接受兩個引數:offset和count。
// offset指定要跳過的元素數量,count指定跳過offset個指定的元素之後,要返回多少個物件。
$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 個元素,跳過之後返回 5 個元素
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 個元素,跳過之後返回 5 個元素
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 進行排序(有時候會希望使用外部的key作為權重來比較元素,代替預設的對比方法

  假設現在有使用者(user)資料如下:

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)首先將資料加入到資料庫中

<?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)

// 有時候只是返回相應的id沒有什麼用,你可能更希望排序後返回id對應的使用者名稱,GET 可以幫忙實現
$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_*返回的結果位置不同, '#',為當前元素
);
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)只獲取物件而不排序(若希望獲取外部物件而又不希望引起排序開銷時使用,BY修飾符可以將一個不存在的key當作權重,讓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)儲存排序結果

預設情況下,SORT操作只是簡單地返回排序結果,如果你希望儲存排序結果,可以給 STORE 選項指定一個key作為引數,排序結果將以列表的形式被儲存到這個key上。(若指定key已存在,則覆蓋。)

// 使用 STORE 之後,可以將結果以 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)

一個有趣的用法是將SORT結果儲存,用EXPIRE為結果集設定生存時間,這樣結果集就成了SORT操作的一個快取。這樣就不必頻繁地呼叫SORT操作了,只有當結果集過期時,才需要再呼叫一次SORT操作。

有時候為了正確實現這一用法,你可能需要加鎖以避免多個客戶端同時進行快取重建(也就是多個客戶端,同一時間進行SORT操作,並儲存為結果集),具體參見SETNX命令。

 

轉自http://www.cnblogs.com/chrdai/p/6825684.html