redis 實際測試,第一部分

redis 實際測試(由於功能太多,我就挑幾個重要的吧)

這個哥哥的博客非常好https://www.cnblogs.com/chrdai/p/6825684.html
官網地址http://redisdoc.com/index.html

key操作

del操作

# 情況1: 刪除單個key
$redis->set('myname','ikodota');
echo $redis->get('myname').'<br>'; # 返回:ikodota

$redis->del('myname');# 返回 TRUE(1)
var_dump($redis->get('myname')); # 返回 bool(false)

情況2: 刪除一個不存在的key

if(!$redis->exists('fake_key')) # 不存在
var_dump($redis->del('fake_key')); # 返回 int(0)

情況3: 同時刪除多個key

$array_mset=array('first_key'=>'first_val','second_key'=>'second_val','third_key'=>'third_val');
$redis->mset($array_mset); #用MSET一次儲存多個值
$array_mget=array('first_key','second_key','third_key');
var_dump($redis->mget($array_mget)); #一次返回多個值 //array(3) { [0]=> string(9) "first_val" [1]=> string(10) "second_val" [2]=> string(9) "third_val" }

$redis->del($array_mget); #同時刪除多個key
var_dump($redis->mget($array_mget)); #返回 array(3) { [0]=> bool(false) [1]=> bool(false) [2]=> bool(false) }

keys 讀取內容

警告 :KEYS的速度非常快,但在一個大的數據庫中使用它仍然可能造成性能問題,如果你需要從一個數據集中查找特定的key,你最好還是用集合(Set)。

$array_mset_keys=array('one'=>'1','two'=>'2','three '=>'3','four'=>'4');
$redis->mset($array_mset_keys); #用MSET一次儲存多個值
var_dump($redis->keys('*o*')); //array(3) { [0]=> string(4) "four" [1]=> string(3) "two" [2]=> string(3) "one" }
var_dump($redis->keys('t??')); //array(1) { [0]=> string(3) "two" }
var_dump($redis->keys('t[w]*')); //array(1) { [0]=> string(3) "two" }
print_r($redis->keys('*')); //Array ( [0] => four [1] => three [2] => two [3] => one )

randomkey 隨機讀取

# 情況1:數據庫不爲空
$array_mset_randomkey=array('fruit'=>'apple','drink'=>'beer','food'=>'cookis');
$redis->mset($array_mset_randomkey);
echo $redis->randomkey(); 
print_r($redis->keys('*')); # 查看數據庫內所有key,證明RANDOMKEY並不刪除key//Array ( [0] => food [1] => drink [2] => fruit )

# 情況2:數據庫爲空
$redis->flushdb();  # 刪除當前數據庫所有key
var_dump($redis-> randomkey()); //bool(false)

ttl 過期時間

情況1:帶TTL的key

$redis->flushdb();
$redis->set('name','ikodota'); # 設置一個key
$redis->expire('name',30);  # 設置生存時間爲30秒 //return (integer) 1
echo $redis->get('name'); //return ikodota
echo $redis->ttl('name'); //(integer) 25

echo $redis->ttl('name');  # 30秒過去,name過期 //(integer) -1
var_dump($redis->get('name')); # 過期的key將被刪除 //return bool(false);

情況2:不帶TTL的key

$redis->set('site','wikipedia.org');//OK
var_dump($redis->ttl('site'));//int(-1)

情況3:不存在的key

$redis->EXISTS('not_exists_key');//int(0)
var_dump($redis->TTL('not_exists_key'));//int(-1)

exists 判斷是否存在

$redis->set('db',"redis"); //bool(true) 
var_dump($redis->exists('db'));  # key存在 //bool(true) 
$redis->del('db');   # 刪除key //int(1)
var_dump($redis->exists('db'))  # key不存在 //bool(false)

字符串操作

添加設置過期時間

$redis->setex('key', 3600, 'value')

SET 添加覆蓋

# 情況1:對字符串類型的key進行SET
$redis->SET('apple', 'www.apple.com');#OK  //bool(true)
$redis->GET('apple');//"www.apple.com"

# 情況2:對非字符串類型的key進行SET
$redis->LPUSH('greet_list', "hello");  # 建立一個列表 #(integer) 1 //int(1)
$redis->TYPE('greet_list');#list //int(3)

$redis->SET('greet_list', "yooooooooooooooooo");   # 覆蓋列表類型 #OK //bool(true)
$redis->TYPE('greet_list');#string //int(1)

setnx 當key不存在時候添加

$redis->EXISTS('job');  # job不存在 //bool(false);
$redis->SETNX('job', "programmer");  # job設置成功 //bool(true)
$redis->SETNX('job', "code-farmer");  # job設置失敗 //bool(false)
echo $redis->GET('job');  # 沒有被覆蓋 //"programmer"

mset 一次性設置多個值

$redis->flushdb();
$array_mset=array('date'=>'2012.3.5','time'=>'9.09a.m.','weather'=>'sunny' );
$redis->MSET($array_mset); //bool(true)
var_dump($redis->KEYS('*'));   # 確保指定的三個key-value對被插入 //array(3) { [0]=> string(4) "time" [1]=> string(7) "weather" [2]=> string(4) "date" }
# MSET覆蓋舊值的例子 但是經過測試覆蓋不了
var_dump($redis->set('google', "google.cn"));   //bool(true)
var_dump($redis->mset(array('google',"google.hk"))); //bool(true)
echo $redis->get('google'); //google.cn  與redis手冊的示例結果不符

msetnx 當key不存在時候添加,原子性,不成功就全部不成功

# 情況1:對不存在的key進行MSETNX
$array_mset=array('rmdbs'=>'MySQL','nosql'=>'MongoDB','key-value-store'=>'redis' );
$redis->MSETNX($array_mset);//bool(true)

# 情況2:對已存在的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 )

get 獲取值

var_dump($redis->GET('fake_key')); #(nil) //return bool(false)
$redis->SET('animate', "anohana"); //return bool(true)
var_dump($redis->GET('animate')); //return string(7) "anohana"

mget 一次獲取多個值,不存在的值,返回false

$redis_mget_data_array=array('name'=>'ikodota','blog'=>'cnblogs.com/ikodota');
$redis->MSET($redis_mget_data_array);#用MSET一次儲存多個值 

$redis_mget_key_array=array('name','blog');
var_dump($redis->MGET($redis_mget_key_array)); //array(2) { [0]=> string(7) "ikodota" [1]=> string(19) "cnblogs.com/ikodota" }

$redis->EXISTS('fake_key'); //bool(false)

$redis_mget_key_array=array('name','fake_key');
var_dump($redis->MGET($redis_mget_key_array));  # 當MGET中有不存在key的情況   //array(2) { [0]=> string(7) "ikodota" [1]=> bool(false) }

strlen 返回字符串長度

$redis->SET('mykey', "Hello world");
echo $redis->STRLEN('mykey'); //int(11)
echo $redis->STRLEN('nonexisting'); # 不存在的key長度視爲0  //int(0)

incr 自增 incrby 自增多個

$redis->SET('page_view', 20);
var_dump($redis->INCR('page_view')); //int(21) 
var_dump($redis->GET('page_view'));    # 數字值在Redis中以字符串的形式保存 //string(2) "21

# 情況1:key存在且是數字值
$redis->SET('rank', 50);  # 設置rank爲50
$redis->INCRBY('rank', 20);  # 給rank加上20
var_dump($redis->GET('rank')); #"70"   //string(2) "70"

# 情況2:key不存在
$redis->EXISTS('counter'); //bool(false)
$redis->INCRBY('counter'); #int 30  //bool(false)
var_dump($redis->GET('counter')); #30 //經測試 與手冊上結果不一樣,不能直接從bool型轉爲int型。 return bool(false) 

# 情況3:key不是數字值
$redis->SET('book', "long long ago...");
var_dump($redis->INCRBY('book', 200)); #(error) ERR value is not an integer or out of range   // bool(false)

decr 自減 decrby 自減多個

和上面的一樣

哈希表(Hash) 儲存多個值,

hset 一次只能存一個

var_dump($redis->hSet('google', "google.cn18881",'77711'));
重複執行兩次就 提示失效了

hsetnx 當不存在時候就執行,key 和 hash 同時不存在纔不執行

// This first case: hash 值不存在 ,key 也不存在 , 設置成功
$redis -> hSetNx('myhash','favorite_fruit','cherry');
var_dump($redis -> hGet('myhash','favorite_fruit'));    // string 'cherry'

// This second case: hash 值不存在, key 存在 ,設置成功
if(! $redis -> exists('test_hash')) {
    var_dump($redis->hSetNx('test_hash', 'favorite_fruit', 'apple'));  // boolean true
    var_dump($redis->hGet('test_hash', 'favorite_fruit'));    // string 'apple'
}

// This third case: hash 值存在, key 不存在 ,設置成功
if($redis -> exists('myhash'))
{
    var_dump($redis -> hSetNx('myhash','job','programmer'));  // boolean true
    var_dump($redis -> hGet('myhash','job'));    // string 'programmer'
}

// This fourth case: hash 值存在, key 也存在 ,設置不成功
if($redis -> exists('myhash'))
{
    var_dump($redis -> hSetNx('myhash','favorite_fruit','pineapple'));  // boolean false
    var_dump($redis -> hGet('myhash','favorite_fruit'));    // string 'cherry'
}
//總之:只要 hash 不存在就可以設置成功,只有 hash 和 key 同時存在纔會設置失敗。

hmset 一次多存幾個,如果有重複的就替換了

$array_hmset = array('pats' => 'dog','fruit' => 'cherry','job' => 'programmer');
$redis -> hMset('myhash',$array_hmset);
$array_hmget = array('pats','fruit','job');
var_dump($redis -> hMget('myhash',$array_hmget));

hget 獲取值

// This first case: hash 表存在 , key 也存在,獲取數據成功
$redis -> hSet('myhash','job','programmer');
var_dump($redis -> hGet('myhash','job'));       // programmer

// This second case: hash表存在, key 不存在
var_dump($redis -> hGet('myhash','pats'));      // boolean false

// This third case: hash 表不存在
var_dump($redis -> hGet('hash_not_exists','job'));      // boolean false

// 總之 :只有 hash 表和 key 同時存在的時候纔可以返回數據

下面我就簡寫了,太多了

hmset 獲取多個值

$array_hmset = array('pats' => 'dog','fruit' => 'cherry','job' => 'programmer');
$redis -> hMset('myhash',$array_hmset);
$array_hmget = array('pats','job');
var_dump($redis -> hMGet('myhash',$array_hmget));

hgetall 查看某個所有哈希值

$array_hmset = array('pats' => 'dog','fruit' => 'cherry','job' => 'programmer');
$redis -> hMset('myhash',$array_hmset);
var_dump($redis -> hGetAll('myhash'));

hdel 刪除一個或多個哈希值,返回刪除的數量

$redis -> hSet('myhash','job','programmer');
var_dump($redis -> hdel('myhash','job'));            // int 1 成功刪除
var_dump($redis -> hdel('myhash','not_exists'));     // int 0 刪除一個不存

hLen 哈希字段的數量

$array_hmset = array('pats' => 'dog','fruit' => 'cherry','job' => 'programmer');
$redis -> hMset('myhash',$array_hmset);
var_dump($redis -> hLen('myhash'));            // int 3
var_dump($redis -> hLen('hash_not_exists'));   // int 0 , 不存在的 hash 表返回 0

hExist 查詢字段是否存在

$array_hmset = array('pats' => 'dog','fruit' => 'cherry','job' => 'programmer');
$redis -> hMset('myhash',$array_hmset);
var_dump($redis -> hExists('myhash','fruit'));      // true
var_dump($redis -> hExists('myhash','fake_key'));   // false , key 不存在

hincrby 字段自增可以是負值

$array_hmset = array('number' => 10,'fruit' => 'cherry');
$redis -> hMset('myhash',$array_hmset);
var_dump($redis -> hIncrBy('myhash','number',5));           // int 15,   正數相當於增
var_dump($redis -> hIncrBy('myhash','number',-5));          // int 5,    負數相當於減
var_dump($redis -> hIncrBy('myhash','number_not_exist',2)); // int 2,    不存在的 key 初始化爲 0
var_dump($redis -> hIncrBy('myhash','fruit',5));            // boolean false , 字符串會出現錯誤

hkeys 獲取哈希所有的key

$array_hmset = array('number' => 10,'fruit' => 'cherry','pats' => 'dog');
$redis -> hMset('myhash',$array_hmset);
var_dump($redis -> hKeys('myhash'));
var_dump($redis -> hKeys('hash_not_exists')); //array (size=0) empty

hvals 獲取哈希所有的 值

$array_hmset = array('number' => 10,'fruit' => 'cherry','pats' => 'dog');
$redis -> hMset('myhash',$array_hmset);
var_dump($redis -> hVals('myhash'));
var_dump($redis -> hVals('hash_not_exists'));   //array (size=0) empty
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章