1. 程式人生 > >PHP 操作redis 詳細講解

PHP 操作redis 詳細講解

將值value關聯到key,並將key的生存時間設為seconds(以秒為單位)。

如果key 已經存在,SETEX命令將覆寫舊值。

這個命令類似於以下兩個命令:

$redis->SET('key', 'value');
$redis->EXPIRE('key','seconds'); # 設定生存時間

不同之處是,SETEX是一個原子性(atomic)操作,關聯值和設定生存時間兩個動作會在同一時間內完成,該命令在Redis用作快取時,非常實用。

時間複雜度:
O(1)
返回值:
設定成功時返回OK。 當seconds引數不合法時,返回一個錯誤。
複製程式碼 複製程式碼 複製程式碼
# 情況1:key不存在$redis->SETEX('cache_user_id', 60,10086);//bool(true)echo $redis->GET('cache_user_id');  # 值 //"10086"
sleep(4);
echo $redis->TTL('cache_user_id'); # 剩餘生存時間 //int(56)
# 情況2:key已經存在,key被覆寫$redis->SET('cd', "timeless"); //bool(true);$redis->SETEX('cd', 3000,"goodbye my love"); //bool(true);
echo $redis->GET('cd');//"goodbye my love"
複製程式碼 複製程式碼 複製程式碼

SETRANGE

SETRANGE key offset value

value引數覆寫(Overwrite)給定key所儲存的字串值,從偏移量offset開始。

不存在的key當作空白字串處理。

SETRANGE命令會確保字串足夠長以便將value設定在指定的偏移量上,如果給定key原來儲存的字串長度比偏移量小(比如字串只有5個字元長,但你設定的offset10),那麼原字元和偏移量之間的空白將用零位元(zerobytes,"\x00")來填充。

注意你能使用的最大偏移量是2^29-1(536870911),因為Redis的字串被限制在512兆(megabytes)內。如果你需要使用比這更大的空間,你得使用多個key

時間複雜度:
對小(small)的字串,平攤複雜度O(1)。(關於什麼字串是”小”的,請參考APPEND命令) 否則為O(M),M為value引數的長度。
返回值:
被SETRANGE修改之後,字串的長度。

 警告

 當生成一個很長的字串時,Redis需要分配記憶體空 間,該操作有時候可能會造成伺服器阻塞(block)。在2010年的Macbook Pro上,設定偏移量為536870911(512MB記憶體分配),耗費約300毫秒, 設定偏移量為134217728(128MB記憶體分配),耗費約80毫秒,設定偏移量33554432(32MB記憶體分配),耗費約30毫秒,設定偏移量 為8388608(8MB記憶體分配),耗費約8毫秒。 注意若首次記憶體分配成功之後,再對同一個key呼叫SETRANGE操作,無須再重新記憶體。

模式

因為有了SETRANGE和GETRANGE命令,你可以將Redis字串用作具有O(1)隨機訪問時間的線性陣列。這在很多真實用例中都是非常快速且高效的儲存方式。

複製程式碼 複製程式碼 複製程式碼
# 情況1:對非空字串進行SETRANGE$redis->SET('greeting', "hello world");
$redis->SETRANGE('greeting', 6, "Redis"); //int(11)$redis->GET('greeting');//"hello Redis"
# 情況2:對空字串/不存在的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 
MSET key value [key value ...]

同時設定一個或多個key-value對。

當發現同名的key存在時,MSET會用新值覆蓋舊值,如果你不希望覆蓋同名key,請使用MSETNX命令。

MSET是一個原子性(atomic)操作,所有給定key都在同一時間內被設定,某些給定key被更新而另一些給定key沒有改變的情況,不可能發生。

時間複雜度:
O(N),N為要設定的key數量。
返回值:
總是返回OK(因為MSET不可能失敗)
複製程式碼 複製程式碼 複製程式碼
#MSETecho '<br><br>MSET<br>';
$redis->select(0);
$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('google',"google.hk")); //bool(false)echo $redis->GET('google'); //google.cn 與redis手冊的示例結果不符
複製程式碼 複製程式碼 複製程式碼

MSETNX

MSETNX key value [key value ...]

同時設定一個或多個key-value對,當且僅當key不存在。

即使只有一個key已存在,MSETNX也會拒絕所有傳入key的設定操作

MSETNX是原子性的,因此它可以用作設定多個不同key表示不同欄位(field)的唯一性邏輯物件(unique logic object),所有欄位要麼全被設定,要麼全不被設定。

時間複雜度:
O(N),N為要設定的key的數量。
返回值:
當所有key都成功設定,返回1。 如果所有key都設定失敗(最少有一個key已經存在),那麼返回0
複製程式碼 複製程式碼 複製程式碼
# 情況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 )
複製程式碼 複製程式碼 複製程式碼

APPEND

APPEND key value

如果key已經存在並且是一個字串,APPEND命令將value追加到key原來的值之後。

如果key不存在,APPEND就簡單地將給定key設為value,就像執行SET key value一樣。

時間複雜度:
平攤複雜度O(1)
返回值:
追加value之後,key中字串的長度。
複製程式碼 複製程式碼 複製程式碼
# 情況1:對不存在的key執行APPEND
$redis->EXISTS('myphone'); # 確保myphone不存在 //bool(false)$redis->APPEND('myphone',"nokia"); # 對不存在的key進行APPEND,等同於SET myphone "nokia" //int(5) # 字元長度
# 情況2:對字串進行APPEND$redis->APPEND('myphone', " - 1110");# 長度從5個字元增加到12個字元 //int(12)
echo $redis->GET('myphone'); # 檢視整個字串 //"nokia - 1110"
複製程式碼 複製程式碼 複製程式碼

GET

GET key

返回key所關聯的字串值。

如果key不存在則返回特殊值nil

假如key儲存的值不是字串型別,返回一個錯誤,因為GET只能用於處理字串值。

時間複雜度:
O(1)
返回值:
key的值。 如果key不存在,返回nil
//GETvar_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

MGET key [key ...]

返回所有(一個或多個)給定key的值。

如果某個指定key不存在,那麼返回特殊值nil。因此,該命令永不失敗。

時間複雜度:
O(1)
返回值:
一個包含所有給定key的值的列表。
複製程式碼 複製程式碼 複製程式碼
//MGETecho '<br><br>MGET<br>';
$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) }
複製程式碼 複製程式碼 複製程式碼

GETRANGE

GETRANGE key start end

返回key中字串值的子字串,字串的擷取範圍由startend兩個偏移量決定(包括startend在內)。

負數偏移量表示從字串最後開始計數,-1表示最後一個字元,-2表示倒數第二個,以此類推。

GETRANGE通過保證子字串的值域(range)不超過實際字串的值域來處理超出範圍的值域請求。

時間複雜度:
O(N),N為要返回的字串的長度。 複雜度最終由返回值長度決定,但因為從已有字串中建立子字串的操作非常廉價(cheap),所以對於長度不大的字串,該操作的複雜度也可看作O(1)。
返回值:
擷取得出的子字串。

註解:在<=2.0的版本里,GETRANGE被叫作SUBSTR。

複製程式碼 複製程式碼 複製程式碼
//GETRANGEecho '<br><br>GETRANGE<br>';
$redis->SET('greeting', "hello, my friend");
echo $redis->GETRANGE('greeting', 0, 4).'<br>'; # 返回索引0-4的字元,包括4。 //"hello"echo $redis->GETRANGE('greeting', -1 ,-5).'<br>'; # 不支援迴繞操作 //""echo $redis->GETRANGE('greeting', -3 ,-1).'<br>'; # 負數索引 //"end"echo $redis->GETRANGE('greeting', 0, -1).'<br>'; # 從第一個到最後一個 //"hello, my friend"echo $redis->GETRANGE('greeting', 0, 1008611).'<br>'; # 值域範圍不超過實際字串,超過部分自動被符略 //"hello, my friend"
複製程式碼 複製程式碼 複製程式碼

GETSET

GETSET key value

將給定key的值設為value,並返回key的舊值。

key存在但不是字串型別時,返回一個錯誤。

時間複雜度:
O(1)
返回值:
返回給定key的舊值(old value)。 當key沒有舊值時,返回nil
複製程式碼 複製程式碼
//GETSETecho '<br><br>GETSET<br>';
var_dump($redis->EXISTS('mail'));//return bool(false);var_dump($redis->GETSET('mail','[email protected]')); # 因為mail之前不存在,沒有舊值,返回nil ,#(nil) //bool(false)
var_dump($redis->GETSET('mail','[email protected]')); # mail被更新,舊值被返回 //string(14) "[email protected]"
複製程式碼 複製程式碼

設計模式

GETSET可以和INCR組合使用,實現一個有原子性(atomic)復位操作的計數器(counter)。

相關推薦

PHP 操作redis 詳細講解

將值value關聯到key,並將key的生存時間設為seconds(以秒為單位)。 如果key 已經存在,SETEX命令將覆寫舊值。 這個命令類似於以下兩個命令: $redis->SET('key', 'value');$redis->EXPIRE('key','seco

PHP 操作redis 詳細講解轉的

將值value關聯到key,並將key的生存時間設為seconds(以秒為單位)。 如果key 已經存在,SETEX命令將覆寫舊值。 這個命令類似於以下兩個命令: $redis->SET('key', 'value');$redis->EXPIRE('key','seconds');

php 操作Redis發送短信

contents push chan message ring span pconnect new tms 循環查詢redis隊列裏面的數據 然後提交數據後將反饋信息再寫入另一個 redis list裏面 代碼 <?php /** * System N

PHP操作redis

HA con cores stirng apache2.4 trim 其余 script 版本 Redis是一個開源的使用ANSI C語言編寫、支持網絡、可基於內存亦可持久化的日誌型、Key-Value數據庫,並提供多種語言的API。 Redis支持的數據類型有 Stir

PHP 操作 Redis 的手冊

ins true 刪除元素 hello set集合 安全 name 二進制 關聯數組 轉:https://www.cnblogs.com/jackluo/p/5708024.html String 類型操作 string是redis最基本的類型,而且string類型是二進制

php操作redis cluster集群

技術分享 數據 ron req github master 分配 key locate php要操作redis cluster集群有兩種方式: 1、使用phpredis擴展,這是個c擴展,性能更高,但是phpredis2.x擴展不行,需升級phpredis到3.0,但這個方

PHP操作Redis(一) PHP連接Redis,含Redis密碼驗證、指定某一Redis數據庫

自己 mysq iss rds 沖突 清除數據 syntax nbsp 就是 臺服務器上都快開啟200個redis實例了,看著就崩潰了。這麽做無非就是想讓不同類型的數據屬於不同的應用程序而彼此分開。 那麽,redis有沒有什麽方法使不同的應用程序數據彼此分開同時又存儲在相

php操作redis phpredis擴展

哈哈哈 1.7 size nat 關聯 .cn sql 創建 mem phpredis是redis的php的一個擴展,效率是相當高有鏈表排序功能,對創建內存級的模塊業務關系很有用;//連接本地的 Redis 服務 https://www.cnblogs.com/yesha

PHP操作Redis常用技巧總結

一、Redis連線與認證 1 2 3 4

php操作redis工具類

config.php <?php // //redis配置 define('HOST','localhost'); define('PORT', '6379'); define('OVERTIME', '0'); ?> Redistool.php <?php inclu

redis的資料型別List,其原生命令和php操作Redis List函式介紹

List型別介紹 List是簡單的字串列表,按照插入順序排序,可以從列表的兩頭新增資料,一個列表最多可以包含2^32-1個元素(超過40億個元素) List原生命令 命令 命令描述 例項 LPUSH key value1 [va

PHP操作Redis資料庫常用方法

redis Redis支援的資料型別有 Stirng(字串), List(列表), Hash(字典), Set(集合), Sorted Set(有序集合); redis版本是Redis 2.6.12 系統是在Windows+Apache2.4+php5.6 連線: //例項化

PHP操作資料庫詳細(PDO)

    PHP 5.1 釋出時將附帶一個全新的資料庫連線層,即 PHP Data Objects (PDO)。雖然 PHP 一直都擁有很好的資料庫連線,但 PDO 讓 PHP的資料庫操作 達到一個新的高度。PDO可支援基本的MySQL、Microsoft SQL Server、Oracle

PHP操作Redis常用技巧總結【轉】

一、Redis連線與認證 1 //連線引數:ip、埠、連線超時時間,連線成功返回true,否則返回false 2 $ret = $redis->connect('127.0.0.1', 6379, 30); 3 //密碼認證:成功返回true,否則返回false 4 $ret = $redis-

linux下安裝nginx+php+mysql環境詳細講解

linux環境:centos 7.0 64位 nginx:nginx-1.8.0.tar.gz php: php-7.1.1.tar.gz mysql: mysql-5.6.21.tar.gz libxml2:libxml2-2.9.1.tar.gz openss

php操作redis和memcache過期時間

php-redis 設定過期時間setTimeOut 命令列expireredis過期時間redis術語裡面,把設定了expire time的key 叫做:volatile keys。 意思就是不穩定的key。沒有設定過期時間的也就是永久儲存 set:set('key','value')將值 valu

PHP 操作redis

//使用autoload載入相關庫,這邊重點就是為了require $file; spl_autoload_register(function($class) { $file = __DIR__.'/lib/Predis/'.$class.'.php'; if (file_exi

redis的資料型別Set,其原生命令和php操作Redis Set函式介紹

sRandMember(key,[count])函式 * 說明:從集合key中隨機取出一個或count個成員,但是不移除key中的成員 * 引數:key(集合的名稱),count(可選項,隨機取出成員的個數) * 返回值:沒有count引數,返回key中的一個成員(string);存在count,則返回隨機取

30個php操作redis常用方法程式碼例子

redis的操作很多的,以前看到一個比較全的部落格,但是現在找不到了。查個東西搜半天,下面整理一下php處理redis的例子,個人覺得常用一些例子。下面的例子都是基於php-redis這個擴充套件的。 1,connect 描述:例項連線到一個Redi

php操作redis cluster叢集成功例項

java操作redis cluster叢集可使用jredis php要操作redis cluster叢集有兩種方式: 1、使用phpredis擴充套件,這是個c擴充套件,效能更高,但是phpredis2.x擴充套件不行,需升級phpredis到3.0,但這個方案參考資料很少