Key相關操作
TYPE
類型檢測,字符串返回string,列表返回 list,set表返回set/zset,hash表返回hash,key不存在返回0
<?php echo $redis->type('not_exists_key'); //none /int(0)
$redis->set('str_key',"str_val"); //構建一個字符串
echo $redis->type('str_key'); //string / int(1)
$redis->sadd('s_key',"s_val1"); //構建一個集合
echo $redis->TYPE('s_key'); //set /int(2)
$redis->lpush('list_key',"list_val1"); //構建一個列表
echo $redis->type('list_key'); //list / int(3)
$redis->zadd('z_key',1,'z_val1'); //構建一個zset (sorted set) // int(1)
$redis->zadd('z_key',2,'z_val2'); $redis->zadd('z_key',3,'z_val3'); echo $redis->zrange('z_key',0,-1); // array(3) { [0]=> string(3) "z_val1" [1]=> string(3) "z_val2" [2]=> string(3) "z_val3" }
echo $redis->type('z_key'); //zset / int(4)
$redis->hset('website','baidu','www.baidu.com'); //一個新域
echo $redis->hget('website','baidu'); //string(8) "www.baidu.com"
echo $redis->type('website'); //hash /int(5)
DEL
移除給定的一個或多個key,如果key不存在,則忽略該命令。
<?php //①刪除單個key
$redis->set('key','val'); $redis->del('key'); //返回 TRUE(1)
var_dump($redis->get('key')); //返回 bool(false) //②刪除一個不存在的key
if(!$redis->exists('no_exists_key')) //不存在
var_dump($redis->del('no_exists_key')); //返回 int(0) //③同時刪除多個key
$array_mset=['key1'=>'val1','key2'=>'val2','key3'=>'val3']; $redis->mset($array_mset); //用MSET一次儲存多個值
$array_mget=array('key1','key2','key3'); var_dump($redis->mget($array_mget)); //一次返回多個值 //array(3) { [0]=> string(4) "val1" [1]=> string(4) "val2" [2]=> string(4) "val3" }
$redis->del($array_mget); //同時刪除多個key
var_dump($redis->mget($array_mget)); //返回 array(3) { [0]=> bool(false) [1]=> bool(false) [2]=> bool(false) }
RANDOMKEY
從當前數據庫中隨機返回(不刪除)一個key。當數據庫不為空時,返回一個key,當數據庫為空時,返回nil。
<?php //①數據庫不為空
echo $redis->randomkey(); //返回隨機key //②數據庫為空
var_dump($redis-> randomkey()); //bool(false)
EXPIRE
為給定key設置生存時間,當key過期時,它會被自動刪除。
<?php $redis->expire('key', 30); //設置有效期為30秒;第二參數不傳遞,則取消expire行為
EXPIREAT
EXPIREAT的作用和EXPIRE一樣,都用於為key設置生存時間。不同在於EXPIREAT命令接受的時間參數是UNIX時間戳。
<?php $redis->set('key','val'); echo $redis->expireat('key',strtotime('2018-01-23 18:00')); //設定過期時間為2018-01-23 18:00
echo $redis->ttl('key'); //倒計時剩余秒數
TTL
返回給定key的剩余生存時間,單位秒。當 key 不存在時,返回 -2,當 key 存在但沒有設置剩余生存時間時,返回 -1 。
<?php //①設置過期時間的key
$redis->set('key','val'); $redis->expire('key',30); //設置生存時間為30秒 //return (integer) 1
echo $redis->get('key'); //return val
echo $redis->ttl('key'); //(integer) 25 ,不斷輸出,會不斷縮減過期時間
echo $redis->ttl('key'); //30秒過去,name過期 //(integer) -2
var_dump($redis->get('key')); //過期的key將被刪除 //return bool(false); //②沒有設置過期時間的key
$redis->set('key','val'); var_dump($redis->ttl('key')); //int(-1) //③不存在的key
$redis->exists('not_exists_key');//int(0)
var_dump($redis->ttl('not_exists_key'));//int(-2)
EXISTS
檢查給定key是否存在,若key存在,返回1,否則返回0。
<?php var_dump($redis->exists('key')); //key存在 返回bool(true) ,否則false
RENAME
對key進行改名,當key和newkey相同或者key不存在時,返回一個錯誤;當newkey已經存在時,RENAME命令將覆蓋舊值。
<?php //①key存在且newkey不存在
$redis->set('key',"val"); var_dump($redis->rename('key','new_key')); //bool(true)
var_dump($redis->exists('key')); //key不復存在 //bool(false)
var_dump($redis->exists('new_key')); //new_key取而代之 //bool(true) //②當key不存在時,返回錯誤 ,返回false;
var_dump($redis->rename('not_exists_key','new_key')); //bool(false) //③new_key已存在時,RENAME會覆蓋舊new_key
$redis->set('key',"val"); $redis->set('key2',"val2"); var_dump($redis->rename('key','key2')); //bool(true)
var_dump($redis->get('key')); //(nil) bool(false)
var_dump($redis->get('key2')); //string(6) "val"
RENAMENX
當且僅當new_key不存在時,將key改為new_key。出錯的情況和RENAME一樣(key不存在時報錯)。修改成功時,返回1。如果newkey已經存在,返回0。
<?php //① new_key不存在,成功
$redis->set('key',"val"); $redis->exists('new_key'); //int(0)
var_dump($redis->renamenx('key','new_key')); // bool(true) //②new_key存在時,失敗
$redis->set('key1',"val1"); $redis->set('key2',"val2"); var_dump($redis->renamenx('key1', 'key2'));// bool(false)
SORT
參數:
array(
'by' => 'pattern', //匹配模式
'limit' => array(0, 1),
'get' => 'pattern'
'sort' => 'asc' or 'desc',
'alpha' => TRUE,
'store' => 'external-key'
)
返回或保存給定列表、集合、有序集合key中經過排序的元素。
①一般排序
<?php $redis->lpush('test', 1); $redis->lpush('test', 10); $redis->lpush('test', 8); print_r($redis->sort('test')); //結果:Array ( [0] => 1 [1] => 8 [2] => 10 )
②字母排序
<?php
$redis->lpush('website', "www.reddit.com"); $redis->lpush('website', "www.slashdot.com"); $redis->lpush('website', "www.infoq.com"); //默認排序 var_dump($redis->SORT('website'));//array(3) { [0]=> string(13) "www.infoq.com" [1]=> string(16) "www.slashdot.com" [2]=> string(14) "www.reddit.com" } //按字符排序 ALPHA=true var_dump($redis->SORT('website', array('ALPHA'=>TRUE))); //array(3) { [0]=> string(13) "www.infoq.com" [1]=> string(14) "www.reddit.com" [2]=> string(16) "www.slashdot.com" }
③排序取部分數據
<?php $redis->lpush('test', 1); $redis->lpush('test', 10); $redis->lpush('test', 8); print_r($redis->sort('test')); //結果:Array ( [0] => 1 [1] => 8 [2] => 10 )
④使用外部key進行排序
有時候你會希望使用外部的key作為權重來比較元素,代替默認的對比方法。
假設現在有用戶(user)數據如下:
id name level -------------------------------
1 admin 9999
2 huangz 10
59230 jack 3
222 hacker 9999
id數據保存在key名為user_id的列表中。
name數據保存在key名為user_name_{id}的列表中
level數據保存在user_level_{id}的key中。
<?php //先將要使用的數據加入到數據庫中 //admin
$redis->LPUSH('user_id', 1);//(integer) 1
$redis->SET('user_name_1', 'admin'); $redis->SET('user_level_1',9999); //huangz
$redis->LPUSH('user_id', 2);//(integer) 2
$redis->SET('user_name_2', 'huangz'); $redis->SET('user_level_2', 10); // jack
$redis->LPUSH('user_id', 59230);//(integer) 3
$redis->SET('user_name_59230','jack'); $redis->SET('user_level_59230', 3); //hacker
$redis->LPUSH('user_id', 222); //(integer) 4
$redis->SET('user_name_222', 'hacker'); $redis->SET('user_level_222', 9999);
如果希望按level從大到小排序user_id,可以使用以下命令
<?php
$redis_sort_option=array('BY'=>'user_level_*', 'SORT'=>'DESC' ); var_dump($redis->SORT('user_id',$redis_sort_option)); //array(4) { [0]=> string(3) "222" [1]=> string(1) "1" [2]=> string(1) "2" [3]=> string(5) "59230" } //--------------------------- //1) "222" # hacker //2) "1" # admin //3) "2" # huangz //4) "59230" # jack
但是有時候只是返回相應的id沒有什么用,你可能更希望排序后返回id對應的用戶名,這樣更友好一點,使用GET選項可以做到這一點
<?php
$redis_sort_option=array('BY'=>'user_level_*', 'SORT'=>'DESC', 'GET'=>'user_name_*' ); var_dump($redis->SORT('user_id', $redis_sort_option)); //array(4) { [0]=> string(6) "hacker" [1]=> string(5) "admin" [2]=> string(6) "huangz" [3]=> string(4) "jack" } //--------------------------- //1) "hacker" //2) "admin" //3) "huangz" //4) "jack"
可以多次地、有序地使用GET操作來獲取更多外部key。
比如你不但希望獲取用戶名,還希望連用戶的密碼也一並列出,可以使用以下命令:
<?php // 先添加一些測試數據
$redis->SET('user_password_222', "hey,im in"); $redis->SET('user_password_1', "a_long_long_password"); $redis->SET('user_password_2', "nobodyknows"); $redis->SET('user_password_59230', "jack201022"); // 獲取name和password
$redis_sort_option=array('BY'=>'user_level_*', 'SORT'=>'DESC', 'GET'=>array('user_name_*','user_password_*') ); var_dump($redis->SORT('user_id',$redis_sort_option));//array(8) { [0]=> string(6) "hacker" [1]=> string(9) "hey,im in" [2]=> string(5) "admin" [3]=> string(20) "a_long_long_password" [4]=> string(6)
"huangz" [5]=> string(11) "nobodyknows" [6]=> string(4) "jack" [7]=> string(10) "jack201022" } //------------------------------------ //1) "hacker" // 用戶名 //2) "hey,im in" // 密碼 //3) "jack" //4) "jack201022" //5) "huangz" //6) "nobodyknows" //7) "admin" //8) "a_long_long_password"
注意GET操作是有序的,GET user_name_* GET user_password_* 和 GET user_password_* GET user_name_*返回的結果位置不同
<?php //獲取name和password 注意GET操作是有序的 $redis_sort_option=array('BY'=>'user_level_*', 'SORT'=>'DESC', 'GET'=>array('user_password_*','user_name_*') ); var_dump($redis->SORT('user_id',$redis_sort_option));// array(8) { [0]=> string(9) "hey,im in" [1]=> string(6) "hacker" [2]=> string(20) "a_long_long_password" [3]=> string(5) "admin" [4]=> string(11) "nobodyknows"
[5]=> string(6) "huangz" [6]=> string(10) "jack201022" [7]=> string(4) "jack" }
GET還有一個特殊的規則——"GET #",用於獲取被排序對象(我們這里的例子是user_id)的當前元素。
比如你希望user_id按level排序,還要列出id、name和password,可以使用以下命令:
<?php $redis_sort_option=array('BY'=>'user_level_*', 'SORT'=>'DESC', 'GET'=>array('//','user_password_*','user_name_*') ); var_dump($redis->SORT('user_id',$redis_sort_option));//array(12) { [0]=> string(3) "222" [1]=> string(9) "hey,im in" [2]=> string(6) "hacker" [3]=> string(1) "1" [4]=> string(20) "a_long_long_password"
[5]=> string(5) "admin" [6]=> string(1) "2" [7]=> string(11) "nobodyknows" [8]=> string(6) "huangz" [9]=> string(5) "59230" [10]=> string(10) "jack201022" [11]=> string(4) "jack" } //-------------------------------------------------------------- //1) "222" // id //2) "hacker" // name //3) "hey,im in" // password //4) "1" //5) "admin" //6) "a_long_long_password" //7) "2" //8) "huangz" //9) "nobodyknows" //10) "59230" //11) "jack" //12) "jack201022"
只獲取對象而不排序
BY修飾符可以將一個不存在的key當作權重,讓SORT跳過排序操作。
該方法用於你希望獲取外部對象而又不希望引起排序開銷時使用。
<?php // 確保fake_key不存在
$redis->EXISTS('fake_key');//(integer) 0 // 以fake_key作BY參數,不排序,只GET name 和 GET password
$redis_sort_option=array('BY'=>'fake_key', 'SORT'=>'DESC', 'GET'=>array('//','user_name_*','user_password_*') ); var_dump($redis->SORT('user_id',$redis_sort_option));//array(12) { [0]=> string(3) "222" [1]=> string(6) "hacker" [2]=> string(9) "hey,im in" [3]=> string(5) "59230" [4]=> string(4) "jack" [5]=> string(10)
"jack201022" [6]=> string(1) "2" [7]=> string(6) "huangz" [8]=> string(11) "nobodyknows" [9]=> string(1) "1" [10]=> string(5) "admin" [11]=> string(20) "a_long_long_password" } //---------------------------------------------- //1) "222" // id //2) "hacker" // user_name //3) "hey,im in" // password //4) "59230" //5) "jack" //6) "jack201022" //7) "2" //8) "huangz" //9) "nobodyknows" //10) "1" //11) "admin" //12) "a_long_long_password"
保存排序結果
默認情況下,SORT操作只是簡單地返回排序結果,如果你希望保存排序結果,可以給STORE選項指定一個key作為參數,排序結果將以列表的形式被保存到這個key上。(若指定key已存在,則覆蓋。)
<?php $redis->EXISTS('user_info_sorted_by_level'); // 確保指定key不存在 //(integer) 0
$redis_sort_option=array('BY'=>'user_level_*', 'GET'=>array('//','user_name_*','user_password_*'), 'STORE'=>'user_info_sorted_by_level' ); var_dump($redis->SORT('user_id',$redis_sort_option)); //int(12)
var_dump($redis->LRANGE('user_info_sorted_by_level', 0 ,11)); // 查看排序結果 //array(12) { [0]=> string(5) "59230" [1]=> string(4) "jack" [2]=> string(10) "jack201022" [3]=> string(1) "2" [4]=> string(6)
"huangz" [5]=> string(11) "nobodyknows" [6]=> string(3) "222" [7]=> string(6) "hacker" [8]=> string(9) "hey,im in" [9]=> string(1) "1" [10]=> string(5) "admin" [11]=> string(20) "a_long_long_password" } //----------------------------------------------------------------- //1) "59230" //2) "jack" //3) "jack201022" //4) "2" //5) "huangz" //6) "nobodyknows" //7) "222" //8) "hacker" //9) "hey,im in" //10) "1" //11) "admin" //12) "a_long_long_password"
一個有趣的用法是將SORT結果保存,用EXPIRE為結果集設置生存時間,這樣結果集就成了SORT操作的一個緩存。
這樣就不必頻繁地調用SORT操作了,只有當結果集過期時,才需要再調用一次SORT操作。
有時候為了正確實現這一用法,你可能需要加鎖以避免多個客戶端同時進行緩存重建(也就是多個客戶端,同一時間進行SORT操作,並保存為結果集),具體參見SETNX命令。
在GET和BY中使用哈希表
可以使用哈希表特有的語法,在SORT命令中進行GET和BY操作。
<?php // 假設現在我們的用戶表新增了一個serial項來為作為每個用戶的序列號 // 序列號以哈希表的形式保存在serial哈希域內。
$redis_hash_testdata_array=array(1=>'23131283', 2=>'23810573', 222=>'502342349', 59230=>'2435829758' ); $redis->HMSET('serial',$redis_hash_testdata_array); // 我們希望以比較serial中的大小來作為排序user_id的方式
$redis_sort_option=array('BY'=>'*->serial'); var_dump($redis->SORT('user_id', $redis_sort_option)); //array(4) { [0]=> string(3) "222" [1]=> string(5) "59230" [2]=> string(1) "2" [3]=> string(1) "1" } //---------------------------------------- //1) "222" //2) "59230" //3) "2" //4) "1"
符號"->"用於分割哈希表的關鍵字(key name)和索引域(hash field),格式為"key->field"。
除此之外,哈希表的BY和GET操作和上面介紹的其他數據結構(列表、集合、有序集合)沒有什么不同。
SET
將字符串值value關聯到key。如果key已經持有其他值,SET就覆寫舊值,無視類型,總是返回OK(TRUE),因為SET不可能失敗。
<?php //①對字符串類型的key進行SET
$redis->SET('key', 'val');//bool(true) //②對非字符串類型的key進行SET
$redis->LPUSH('key_obj', "val1"); //建立一個列表 #(integer) 1 //int(1)
$redis->TYPE('key_obj');//list //int(3)
$redis->SET('key', "val_obj"); //覆蓋列表類型 #OK //bool(true)
$redis->TYPE('key');//string //int(1)
SETNX
將key的值設為value,當且僅當key不存在。若給定的key已經存在,則SETNX不做任何動作。設置成功,返回1。設置失敗,返回0。
<?php $redis->exists('key'); // key不存在 //bool(false);
$redis->setnx('key', "val"); // key設置成功 //bool(true)
$redis->setnx('key', "val1"); // key設置失敗 //bool(false)
echo $redis->get('key'); // 沒有被覆蓋 //"val"
SETEX
將值value關聯到key,並將key的生存時間設為seconds(以秒為單位)。如果key已經存在,SETEX命令將覆寫舊值。設置成功時返回OK.
<?php $redis->setex('key', 10, 'val'); //表示存儲有效期為10秒
舉例: //①key不存在
$redis->setex('key', 60,val);//bool(true)
echo $redis->get('key'); //值 //"val"
sleep(4); echo $redis->ttl('key'); //剩余生存時間 //int(56) //②key已經存在,key被覆寫
$redis->set('key', "val1"); //bool(true);
$redis->setex('key', 3000,"val2"); //bool(true);
echo $redis->get('key'); //"val2"
SETRANGE
用value參數覆寫給定key所儲存的字符串值,從偏移量offset開始。不存在的key當作空白字符串處理。
SETRANGE命令會確保字符串足夠長以便將value設置在指定的偏移量上,如果給定key原來儲存的字符串長度比偏移量小(比如字符串只有5個字符長,但你設置的offset是10),那么原字符和偏移量之間的空白將用零比特(zerobytes,"\x00")來填充。
警告
當生成一個很長的字符串時,Redis需要分配內存空間,該操作有時候可能會造成服務器阻塞(block)。在2010年的Macbook Pro上,設置偏移量為536870911(512MB內存分配),耗費約300毫秒, 設置偏移量為134217728(128MB內存分配),耗費約80毫秒,設置偏移量33554432(32MB內存分配),耗費約30毫秒,設置偏移量為8388608(8MB內存分配),耗費約8毫秒。 注意若首次內存分配成功之后,再對同一個key調用SETRANGE操作,無須再重新內存。
<?php
//①對非空字符串進行SETRANGE
$redis->SET('key', "hello world"); $redis->SETRANGE('key', 6, "Redis"); //int(11)
$redis->GET('key');//"hello Redis" //②對空字符串/不存在的key進行SETRANGE
$redis->EXISTS('empty_string');//bool(false)
$redis->SETRANGE('empty_string', 5 ,"Redis!"); //對不存在的key使用SETRANGE //int(11)
var_dump($redis->GET('empty_string')); //空白處被"\x00"填充 #"\x00\x00\x00\x00\x00Redis!" //return string(11) "Redis!"
MSET
同時設置一個或多個key-value對。當發現同名的key存在時,MSET會用新值覆蓋舊值,如果你不希望覆蓋同名key,請使用MSETNX命令。總是返回OK(因為MSET不可能失敗)
<?php $array_mset=['key1'=>'val1', 'key2'=>'val2']; $redis->MSET($array_mset); //bool(true) // MSET覆蓋舊值的例子 但是經過測試覆蓋不了
var_dump($redis->SET('google', "google.cn")); //bool(true)
var_dump($redis->MSET('google',"google.hk")); //bool(false)
echo $redis->GET('google'); //google.cn 與redis手冊的示例結果不符
MSETNX
同時設置一個或多個key-value對,當且僅當key不存在。即使只有一個key已存在,MSETNX也會拒絕所有傳入key的設置操作(原子性),當所有key都成功設置,返回1。如果所有key都設置失敗(最少有一個key已經存在),那么返回0。
<?php //①對不存在的key進行MSETNX
$array_mset=array('rmdbs'=>'MySQL', 'nosql'=>'MongoDB', 'key-value-store'=>'redis' ); $redis->MSETNX($array_mset);//bool(true) //②對已存在的key進行MSETNX
$array_mset=array('rmdbs'=>'Sqlite', 'language'=>'python' ); var_dump($redis->MSETNX($array_mset)); // rmdbs鍵已經存在,操作失敗 //bool(false)
var_dump($redis->EXISTS('language')); // 因為操作是原子性的,language沒有被設置 bool(false)
echo $redis->GET('rmdbs'); // rmdbs沒有被修改 //"MySQL"
$array_mset_keys=array( 'rmdbs', 'nosql', 'key-value-store'); print_r($redis->MGET($array_mset_keys)); //Array ( [0] => MySQL [1] => MongoDB [2] => redis )
APPEND
連接到或者設定字符串。如果key已經存在並且是一個字符串,APPEND命令將value追加到key原來的值之后。如果key不存在,APPEND就簡單地將給定key設為value,就像執行SET key value一樣。
<?php //①對不存在的key執行APPEND
$redis->exists('key'); // 確保key不存在 //bool(false)
$redis->append('key',"val"); // 對不存在的key進行APPEND,等同於SET key "val" //int(3) // 字符長度 //②對字符串進行APPEND
$redis->append('key', " append_val "); echo $redis->get('key'); // 查看整個字符串 //"val append_val" //strlen 獲取字符串長度,當 key不存在時,返回0。
$redis->set('key', "value"); echo $redis->strlen('key'); //int(5)
echo $redis->strlen('not_exists_key'); // 不存在的key長度視為0 //int(0)
GET
返回key所關聯的字符串值。如果key不存在,返回nil。
<?php var_dump($redis->GET('not_exists_key')); //return bool(false)
$redis->SET('exists_key', "val"); //return bool(true)
var_dump($redis->GET('exists_key')); //return string(7) "val"
MGET
返回所有(一個或多個)給定key的值。如果某個指定key不存在,那么返回特殊值nil。因此,該命令永不失敗。一個包含所有給定key的值的列表。
<?php $redis_mget_key_array=array('exists_key','not_exists_key'); var_dump($redis->MGET($redis_mget_key_array)); //當MGET中有不存在key的情況 //array(2) { [0]=> string(3) "val" [1]=> bool(false) }
GETRANGE
返回key中字符串值的子字符串,字符串的截取范圍由start和end兩個偏移量決定(包括start和end在內)。負數偏移量表示從字符串最后開始計數,-1表示最后一個字符,-2表示倒數第二個,以此類推。
<?php
$redis->SET('key', "hello, my friend"); echo $redis->GETRANGE('key', 0, 4); //返回索引0-4的字符,包括4。 //"hello" echo $redis->GETRANGE('key', -1 ,-5); //不支持回繞操作 //"" echo $redis->GETRANGE('key', -3 ,-1); //負數索引 //"end" echo $redis->GETRANGE('key', 0, -1); //從第一個到最后一個 //"hello, my friend" echo $redis->GETRANGE('key', 0, 1008611); //值域范圍不超過實際字符串,超過部分自動被符略 //"hello, my friend"
GETSET
將給定key的值設為value,並返回key的舊值。當key沒有舊值時,返回nil。
<?php var_dump($redis->EXISTS('key'));//return bool(false);
var_dump($redis->GETSET('key','old_val')); //因為key之前不存在,沒有舊值,返回nil //bool(false)
var_dump($redis->GETSET('key','new_val')); //key被更新,舊值被返回 //string(7) "old_val"
STRLEN
返回key所儲存的字符串值的長度。當key儲存的不是字符串值時,返回一個錯誤。字符串值的長度,當 key不存在時,返回0。
<?php $redis->SET('key', "Hello world"); echo $redis->STRLEN('key'); //int(11)
echo $redis->STRLEN('not_exists_key'); //不存在的key長度視為int(0)
INCR
將key中儲存的數字值增一。如果key不存在,以0為key的初始值,然后執行INCR操作。
<?php $redis->SET('page_view', 20); var_dump($redis->INCR('page_view')); //int(21)
var_dump($redis->GET('page_view')); // 數字值在Redis中以字符串的形式保存 //string(2) "21
INCRBY
將key所儲存的值加上增量increment。如果key不存在,以0為key的初始值,然后執行INCRBY命令。
<?php //①key存在且是數字值
$redis->SET('num', 50); //設置num為50
$redis->INCRBY('num', 20); //給num加上20
var_dump($redis->GET('num')); //string(2) "70" //②key不存在
$redis->INCRBY('not_exists_key',20); //20
var_dump($redis->GET('not_exists_key')); //string(20) //③key不是數字值
$redis->SET('book', "long long ago..."); var_dump($redis->INCRBY('book', 200)); // bool(false)
DECR
將key中儲存的數字值減一。如果key不存在,以0為key的初始值,然后執行DECR操作。
<?php //①對存在的數字值key進行DECR
$redis->SET('num', 10); $redis->DECR('num'); //int(9)
echo $redis->GET('num'); //string(1) "9" //②對不存在的key值進行DECR
$redis->DECR('not_exists_key'); //int(-1)
echo $redis->GET('not_exists_key'); //string(2) "-1"
DECRBY
將key所儲存的值減去減量decrement。如果key不存在,以0為key的初始值,然后執行DECRBY操作。
<?php //①對存在的數值key進行DECRBY
$redis->SET('num', 100); var_dump($redis->DECRBY('num', 20)); //int(80)
var_dump($redis->GET('num')); //string(2) "80" //②對不存在的key進行DECRBY
var_dump($redis->DECRBY('not_exists', 10)); //int(-10)
var_dump($redis->GET('not_exists')); //string(3) "-10"