php redis key,redis 在 php 中的应用(key篇)
KEY(鍵)
Redis DEL 命令用于刪除已存在的鍵。不存在的 key 會被忽略。
$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 = 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 = 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 = 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
5、KEYS
Redis Keys 命令用于查找所有符合給定模式 pattern 的 key 。
(1)KEYS * 命中數據庫中所有key。
(2)KEYS h?llo 命中hello, hallo and hxllo等。
(3)KEYS h*llo 命中hllo和heeeeello等。
(4)KEYS h[ae]llo 命中hello和hallo,但不命中hillo。
(5)特殊符號用""隔開
$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 * 命中數據庫中所有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" 后面有幾個問號就命中幾位數。
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 命令用于將當前數據庫(默認為0)的key移動到給定的數據庫db當中。如果當前數據庫(源數據庫)和給定數據庫(目標數據庫)有相同名字的給定key,或者key不存在于當前數據庫,那么MOVE沒有任何效果。
$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 = 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').""; // 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 = 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').""; // 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 = 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 = 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 = 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 = 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 中經過排序的元素。
排序默認以數字作為對象,值被解釋為雙精度浮點數,然后進行比較。
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))進行排序(按字母表順序)
$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)排序的值為數字:
$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)排序的值為字符串
$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)首先將數據加入到數據庫中
$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命令。
總結
以上是生活随笔為你收集整理的php redis key,redis 在 php 中的应用(key篇)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果 iOS 17.1.1 系统修复宝马
- 下一篇: php比较float大小,PHP中两个f