redis 在 php 中的應用(string篇)


  本文為我閱讀了 redis參考手冊 之后結合 博友的博客 編寫,注意 php_redis 和 redis-cli 的區別(主要是返回值類型和參數用法)

目錄:

string(字符串)
SET SETNX SETEX SETRANGE MSET MSETNX APPEND
GET MGET GETRANGE GETSET STRLEN INCR INCRBY
INCRBYFLOAT DECR DECRBY SETBIT GETBIT    

string(字符串)

1、SET

Redis SET 命令用於設置給定 key 的值。如果 key 已經存儲其他值, SET 就覆寫舊值,且無視類型。

語法:

redis 127.0.0.1:6379> SET KEY_NAME VALUE

返回值: 設置成功時返回 OK 。當seconds參數不合法時,返回一個錯誤。

可用版本:>= 2.0.0

時間復雜度:O(1)

具體實例:

<?php $redis = new redis(); $redis -> connect('127.0.0.1',6379); $redis -> flushAll(); // This first case: 最字符串類型的 key 進行 set
$redis -> set('favorite_fruit','apple'); var_dump($redis -> get('favorite_fruit'));       // string apple // This second case: 最非字符串類型的 key 進行 set
$redis -> lPush('pats','dog'); $redis -> type('pats');                // list
$redis -> set('pats','cat');           // 不管類型為什么,都可以完成覆蓋
var_dump($redis -> get('pats'));       // string cat

2、SETNX

Redis Setnx(SET if Not eXists) 命令在指定的 key 不存在時,為 key 設置指定的值

語法:

redis 127.0.0.1:6379> SETNX KEY_NAME VALUE

返回值: 設置成功,返回 1 。 設置失敗,返回 0 。

可用版本: >= 1.0.0

時間復雜度:O(1)

具體實例:

<?php $redis = new redis(); $redis -> connect('127.0.0.1',6379); $redis -> flushAll(); $redis -> setnx('job','programmer'); $redis -> setnx('job','code-farmer'); var_dump($redis -> get('job'));       // string programmer ,沒有被覆蓋

3、SETEX

Redis Setex 命令為指定的 key 設置值及其過期時間。如果 key 已經存在, SETEX 命令將會替換舊的值。

語法:

redis 127.0.0.1:6379> SETEX KEY_NAME TIMEOUT VALUE

該命令類似於一下 2 個命令:

$redis -> set('key','value');       // 設置值
$redis -> expire('key','seconds');  // 設置生存時間

不同之處在於SETEX 是一個原子性操作,設置值和生存時間同時完成,該命令在redis用做緩存是非常有用。

返回值: 設置成功時返回OKseconds參數不合法時,返回一個錯誤。。

可用版本: >= 2.0.0

時間復雜度:O(1)

具體實例:

<?php $redis = new redis(); $redis -> connect('127.0.0.1',6379); $redis -> flushAll(); // This first case: key 不存在
$redis -> setex('mykey',20,'redis'); echo $redis -> get('mykey');           // redis
sleep(2); var_dump($redis -> ttl('mykey'));      // 18 // This second case: key 已存在,覆蓋
$redis -> set('job','programmer'); $redis -> setex('job',10,'code-farmer'); echo $redis -> get('job');              // code
sleep(2); var_dump($redis -> ttl('job'));         // 8

4、SETRANGE

Redis Setrange 命令用指定的字符串覆蓋給定 key 所儲存的字符串值,覆蓋的位置從偏移量 offset 開始。

語法:

redis 127.0.0.1:6379> SETRANGE KEY_NAME OFFSET VALUE

返回值: 被修改后的字符串長度。

可用版本: >= 2.2.0

時間復雜度:對小(small)的字符串,平攤復雜度O(1)。(關於什么字符串是”小”的,請參考APPEND命令)否則為O(M),M為value參數的長度。

具體實例:

<?php $redis = new redis(); $redis -> connect('127.0.0.1',6379); $redis -> flushAll(); // This first case: 對非空字符串進行 SETRANGE
$redis -> set('key1','Hello world'); $redis -> setRange('key1',6,'redis'); var_dump($redis -> get('key1'));           // Hello redis // This second case: 對空字符串進行 SETRANGE
if(! $redis -> exists('fake_key')) { $redis -> setRange('fake_key',5,'redis'); var_dump($redis -> get('fake_key'));  // string '�����redis' (length=10) ,空白處被 � 填充了。
}

5、MSET

Redis Mset 命令用於同時設置一個或多個 key-value 對。

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

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

語法:

redis 127.0.0.1:6379> MSET key1 value1 key2 value2 .. keyN valueN 

返回值: 總是返回OK(因為MSET不可能失敗)

可用版本: >= 1.0.1

時間復雜度:O(N),為要設置的 key 數量。

具體實例:

<?php $redis = new redis(); $redis -> connect('127.0.0.1',6379); $redis -> flushAll(); // This first case: 沒有舊值存在,同時設置多個值
$array_mset = array( 'year' => 2017,
    'month' => 5,
    'date' => 10,
    'time' => '11:04' ); $redis -> mset($array_mset); var_dump($redis -> keys('*')); // array (size=4) // 0 => string 'time' (length=4) // 1 => string 'date' (length=4) // 2 => string 'month' (length=5) // 3 => string 'year' (length=4) // This second case: 有舊值存在,完成覆蓋。
$redis -> set('favorite_fruit','apple'); $array_mset = array('favorite_fruit'=>'banana'); $redis -> mset($array_mset); var_dump($redis -> get('favorite_fruit'));          // banana

6、MSETNX

Redis Msetnx 命令用於所有給定 key 都不存在時,同時設置一個或多個 key-value 對。

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

(2)MSETNX是原子性的,所有字段要么全被設置,要么全不被設置。

語法:

redis 127.0.0.1:6379> MSETNX key1 value1 key2 value2 .. keyN valueN 

返回值: 當所有 key 都成功設置,返回 1 。 如果所有給定 key 都設置失敗(至少有一個 key 已經存在),那么返回 0 

可用版本: >= 1.0.1

時間復雜度:O(N),為要設置的key的數量。

具體實例:

<?php $redis = new redis(); $redis -> connect('127.0.0.1',6379); $redis -> flushAll(); // This first case: 沒有舊值存在,同時設置多個值
$array_mset = array( 'year' => 2017,
    'month' => 5,
    'date' => 10,
    'time' => '14:59' ); $redis -> msetnx($array_mset); var_dump($redis -> keys('*')); // array (size=4) // 0 => string 'time' (length=4) // 1 => string 'date' (length=4) // 2 => string 'month' (length=5) // 3 => string 'year' (length=4) // This second case: 有舊值存在,無法完成覆蓋。
$redis -> set('favorite_fruit','apple'); $array_mset = array('favorite_fruit'=>'banana'); var_dump($redis -> msetnx($array_mset));            // boolean false
var_dump($redis -> get('favorite_fruit'));          // apple , favorite_fruit的值並沒有發生改變

7、APPEND

  Redis Append 命令用於為指定的 key 追加值

  (1)如果 key 已經存在並且是一個字符串, APPEND 命令將 value 追加到 key 原來的值的末尾。

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

語法:

redis 127.0.0.1:6379> APPEND KEY_NAME NEW_VALUE

返回值: 追加指定值之后, key 中字符串的長度

可用版本: >= 2.0.0

時間復雜度:平攤復雜度O(1)

具體實例:

<?php $redis = new redis(); $redis -> connect('127.0.0.1',6379); $redis -> flushAll(); // This first case: 對已存在的字符串 append ,追加到字符串末尾
$redis -> set('favorite_fruit','cherry '); $redis -> append('favorite_fruit','is very delicious'); var_dump($redis -> get('favorite_fruit'));   // string 'cherry is very delicious' // This second case: 對不存在的字符串 append , 相當於 set 的功能
$redis -> del('job');                    // 確保一個不存在的 key
$redis -> append('job','PHPer'); var_dump($redis -> get('job'));          // string 'PHPer'

8、GET

  Redis Get 命令用於獲取指定 key 的值。如果 key 不存在,返回 nil 。如果key 儲存的值不是字符串類型,返回一個錯誤

語法:

redis 127.0.0.1:6379> GET KEY_NAME

返回值: 返回 key 的值,如果 key 不存在時,返回 nil。 如果 key 不是字符串類型,那么返回一個錯誤。

可用版本: >= 1.0.0

時間復雜度:O(1)

具體實例:

<?php $redis = new redis(); $redis -> connect('127.0.0.1',6379); $redis -> flushAll(); // This first case: key 存在且是字符串類型
$redis -> set('favorite_fruit','cherry'); var_dump($redis -> get('favorite_fruit'));   // string 'cherry' // This second case: key 不存在
$redis -> del('fake_key');                  // 確保一個不存在的 key
var_dump($redis -> get('fake_key'));        // boolean false // This third case: key 不在但不是字符串類型
$redis -> lPush('job','programmer');        // list 類型
var_dump($redis -> get('job'));             // boolean false

9、MGET

  Redis Mget 命令返回所有(一個或多個)給定 key 的值。 如果給定的 key 里面,有某個 key 不存在,那么這個 key 返回特殊值 nil 。

語法:

redis 127.0.0.1:6379> MGET KEY1 KEY2 .. KEYN

返回值:一個包含所有給定 key 的值的列表。

可用版本: >= 1.0.0

時間復雜度:O(1)

具體實例:

<?php $redis = new redis(); $redis -> connect('127.0.0.1',6379); $redis -> flushAll(); // This first case: 給定的 key 都存在
$array_mset = array( 'year' => 2017,
    'month' => 5,
    'day' => 10,
    'time' => '15:31' ); $redis -> mset($array_mset); $array_mget = array('year','month','day','time'); var_dump($redis -> mget($array_mget)); // array (size=4) // 0 => string '2017' (length=4) // 1 => string '5' (length=1) // 2 => string '10' (length=2) // 3 => string '15:31' (length=5) // This second case:給定的 key 中有 key 不存在的情況
$array_mget = array('year','month','fake_key'); var_dump($redis -> mget($array_mget)); // array (size=3) // 0 => string '2017' (length=4) // 1 => string '5' (length=1) // 2 => boolean false

10、GETRANGE

  Redis Mget 命令返回所有(一個或多個)給定 key 的值。 如果給定的 key 里面,有某個 key 不存在,那么這個 key 返回特殊值 nil 

語法:

redis 127.0.0.1:6379> GETRANGE KEY_NAME start end

返回值:截取得到的子字符串。

可用版本: >= 2.4.0(在<=2.0的版本里,GETRANGE被叫作SUBSTR。)

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

具體實例:

<?php $redis = new redis(); $redis -> connect('127.0.0.1',6379); $redis -> flushAll(); $redis -> set('mykey','hello world'); echo $redis -> getRange('mykey',0,-1) . '</br>';    // 從開頭到結束, hello world
echo $redis -> getRange('mykey',0,4) . '</br>';     // 從 0 到 4 , hello
echo $redis -> getRange('mykey',-5,-1) . '</br>';   // 從 -5 到 -1 , world
var_dump($redis -> getRange('mykey',-1,-5)). '</br> ';  // 從 -1 到 -5 , "" ,不支持回繞操作
echo $redis -> getRange('mykey',0,100). '</br> ';   // 從 0 到 100 , hello world ,若范圍超過了字符串的長度,超過部分自動被忽略

11、GETSET

  Redis Getset 命令用於設置指定 key 的值,並返回 key 舊的值。

語法:

redis 127.0.0.1:6379> GETSET KEY_NAME VALUE

返回值:返回給定 key 的舊值。

(1)當 key 沒有舊值時,即 key 不存在時,返回 nil 。

(3)當 key 存在但不是字符串類型時,返回一個錯誤。

可用版本: >= 1.0.0

時間復雜度:O(1)

具體實例:

<?php $redis = new redis(); $redis -> connect('127.0.0.1',6379); $redis -> flushAll(); // This first case: key 值存在且為字符串類型
$redis -> set('favorite_fruit','cherry'); var_dump($redis -> getSet('favorite_fruit','pineapple'));    // cherry // This second case: key 值存在但不為字符串類型
$redis -> lPush('job','programmer'); var_dump($redis -> getSet('job','code-farmer'));    // boolean false // This third case: key 值不存在
$redis -> del('fake_key'); var_dump($redis -> getSet('fake_key','not-exists'));    // boolean false

12、STRLEN

  Redis Strlen 命令用於獲取指定 key 所儲存的字符串值的長度。當 key 儲存的不是字符串值時,返回一個錯誤。

語法:

redis 127.0.0.1:6379> STRLEN KEY_NAME

返回值:字符串值的長度。 當 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','cherry'); var_dump($redis -> strlen('favorite_fruit'));    // int 6 // This second case: key 值不存在
$redis -> del('fake_key'); var_dump($redis -> strlen('fake_key'));    // int 0

13、INCR

  Redis Incr 命令將 key 中儲存的數字值增一。

  (1)如果 key 不存在,那么 key 的值會先被初始化為 0 ,然后再執行 INCR 操作。

  (2)如果值包含錯誤的類型,或字符串類型的值不能表示為數字,那么返回一個錯誤。

  (3)本操作的值限制在 64 位(bit)有符號數字表示之內。

語法:

redis 127.0.0.1:6379> INCR KEY_NAME 

返回值:執行 INCR 命令之后 key 的值。

可用版本:>= 1.0.0

時間復雜度:O(1)

具體實例:

<?php $redis = new redis(); $redis -> connect('127.0.0.1',6379); $redis -> flushAll(); // This first case: key 值存在且為數字
$redis -> set('number',10); var_dump($redis -> incr('number'));    // int 11
var_dump($redis -> get('number'));     // string '11' , 其值在 redis 中是以字符串的形式保存的 // This second case: key 值不存在
$redis -> del('fake_key'); var_dump($redis -> incr('fake_key'));    // int 1 // This third case: key 值存但不為數字
$redis -> set('favorite_fruit','cherry'); var_dump($redis -> incr('favorite_fruit'));    // boolean false // This fourth case: key 值存但為其它的類型
$redis -> lPush('job',20); var_dump($redis -> incr('job'));    // boolean false

14、INCRBY

  Redis Incrby 命令將 key 中儲存的數字加上指定的增量值。

  (1)如果 key 不存在,那么 key 的值會先被初始化為 0 ,然后再執行 INCRBY 命令。

  (2)如果值包含錯誤的類型,或字符串類型的值不能表示為數字,那么返回一個錯誤。

  (3)本操作的值限制在 64 位(bit)有符號數字表示之內。

語法:

redis 127.0.0.1:6379> INCRBY KEY_NAME INCR_AMOUNT

返回值:加上指定的增量值之后, key 的值。

可用版本:>= 1.0.0

時間復雜度:O(1)

具體實例:

<?php $redis = new redis(); $redis -> connect('127.0.0.1',6379); $redis -> flushAll(); // This first case: key 值存在且為數字
$redis -> set('number',10); var_dump($redis -> incrBy('number',5));    // int 15
var_dump($redis -> get('number'));     // string '15' , 其值在 redis 中是以字符串的形式保存的 // This second case: key 值不存在
$redis -> del('fake_key'); var_dump($redis -> incrBy('fake_key','5'));    // int 5 // This third case: key 值存但不為數字
$redis -> set('favorite_fruit','cherry'); var_dump($redis -> incrBy('favorite_fruit',5));    // boolean false // This fourth case: key 值存但為其它的類型
$redis -> lPush('job',20); var_dump($redis -> incrBy('job',5));    // boolean false

15、INCRBYFLOAT

  Redis Incrbyfloat 命令為 key 中所儲存的值加上指定的浮點數增量值。

語法:

redis 127.0.0.1:6379> INCRBYFLOAT KEY_NAME INCR_AMOUNT

返回值:執行命令之后 key 的值。

可用版本:>= 2.6.0

具體實例:

<?php $redis = new redis(); $redis -> connect('127.0.0.1',6379); $redis -> flushAll(); // This first case: key 值存在且為數字
$redis -> set('number',10.2); var_dump($redis -> incrByFloat('number',0.3));    // float 10.5
var_dump($redis -> get('number'));     // string '10.5' , 其值在 redis 中是以字符串的形式保存的 // This second case: key 值不存在
$redis -> del('fake_key'); var_dump($redis -> incrByFloat('fake_key',0.3));    // float 0.3 // This third case: key 值存但不為數字
$redis -> set('favorite_fruit','cherry'); var_dump($redis -> incrByFloat('favorite_fruit',0.3));    // boolean false // This fourth case: key 值存但為其它的類型
$redis -> lPush('job',20.2); var_dump($redis -> decrBy('job',0.3));    // boolean false

16、DECR

  Redis Decr 命令將 key 中儲存的數字值減一。

  (1)如果 key 不存在,那么 key 的值會先被初始化為 0 ,然后再執行 DECR 操作。

  (2)如果值包含錯誤的類型,或字符串類型的值不能表示為數字,那么返回一個錯誤。

  (3)本操作的值限制在 64 位(bit)有符號數字表示之內。

語法:

redis 127.0.0.1:6379> DECR KEY_NAME 

返回值:執行命令之后 key 的值。

可用版本:>= 1.0.0

時間復雜度:O(1)

具體實例:

<?php $redis = new redis(); $redis -> connect('127.0.0.1',6379); $redis -> flushAll(); // This first case: key 值存在且為數字
$redis -> set('number',10); var_dump($redis -> decr('number'));    // int 9
var_dump($redis -> get('number'));     // string '9' , 其值在 redis 中是以字符串的形式保存的 // This second case: key 值不存在
$redis -> del('fake_key'); var_dump($redis -> decr('fake_key'));    // int -1 // This third case: key 值存但不為數字
$redis -> set('favorite_fruit','cherry'); var_dump($redis -> decr('favorite_fruit'));    // boolean false // This fourth case: key 值存但為其它的類型
$redis -> lPush('job',20); var_dump($redis -> decr('job'));    // boolean false

17、DECRBY

  Redis Decrby 命令將 key 所儲存的值減去指定的減量值。

  (1)如果 key 不存在,那么 key 的值會先被初始化為 0 ,然后再執行 DECRBY 操作。

  (2)如果值包含錯誤的類型,或字符串類型的值不能表示為數字,那么返回一個錯誤。

  (3)本操作的值限制在 64 位(bit)有符號數字表示之內。

語法:

redis 127.0.0.1:6379> DECRBY KEY_NAME DECREMENT_AMOUNT

返回值:減去指定減量值之后, key 的值。

可用版本:>= 1.0.0

時間復雜度:O(1)

具體實例:

<?php $redis = new redis(); $redis -> connect('127.0.0.1',6379); $redis -> flushAll(); // This first case: key 值存在且為數字
$redis -> set('number',10); var_dump($redis -> decrBy('number',5));    // int 5
var_dump($redis -> get('number'));     // string '5' , 其值在 redis 中是以字符串的形式保存的 // This second case: key 值不存在
$redis -> del('fake_key'); var_dump($redis -> decrBy('fake_key',5));    // int -5 // This third case: key 值存但不為數字
$redis -> set('favorite_fruit','cherry'); var_dump($redis -> decrBy('favorite_fruit',5));    // boolean false // This fourth case: key 值存但為其它的類型
$redis -> lPush('job',20); var_dump($redis -> decrBy('job',5));    // boolean false

18、SETBIT

  Redis Setbit 命令用於對 key 所儲存的字符串值,設置或清除指定偏移量上的位(bit)。

  (1)位的設置或清除取決於value參數,可以是0也可以是1

  (2)當key不存在時,自動生成一個新的字符串值。

  (3)字符串會增長(grown)以確保它可以將value保存在指定的偏移量上當字符串值增長時,空白位置以0填充。

  (4)offset參數必須大於或等於0,小於2^32(bit映射被限制在512MB內)。

語法:

redis 127.0.0.1:6379> Setbit KEY_NAME OFFSET

返回值:指定偏移量原來儲存的位。

可用版本:>= 2.2.0

時間復雜度:O(1)

具體實例:

<?php $redis = new redis(); $redis -> connect('127.0.0.1',6379); $redis -> flushAll(); $bit = 67; echo decbin($bit);          // 1000011 , 轉為二進制數
var_dump($redis ->setBit('bit_val',0,0));   // int 0 ,原來的空位都為 0
var_dump($redis ->setBit('bit_val',1,1));   // int 0
var_dump($redis ->setBit('bit_val',2,0));   // int 0
var_dump($redis ->setBit('bit_val',3,0));   // int 0
var_dump($redis ->setBit('bit_val',4,0));   // int 0
var_dump($redis ->setBit('bit_val',5,0));   // int 0
var_dump($redis ->setBit('bit_val',6,1));   // int 0
var_dump($redis ->setBit('bit_val',7,1));   // int 0

var_dump($redis -> get('bit_val'));         // string 大寫字母 'C',其 ASCII 值為67 ,二進制為 0100 0011
var_dump($redis ->getBit('bit_val','6'));   // int 1
var_dump($redis ->getBit('bit_val','8'));   // int 0 , offset 比字符串的長度大,返回0
var_dump($redis ->getBit('bit_not_exist','1'));   // int 0 , key 不存在,返回0

var_dump($redis ->setBit('bit_val',5,1));   // int 0 ,將原來的第 5 位改為 1
var_dump($redis ->setBit('bit_val',6,0));   // int 1 ,由於第 6 位被設置過為 1 ,現在返回原來位的值 1 ,但是第 6 位現在的值已經為 0 了

var_dump($redis -> get('bit_val'));         // string 大寫字母 'E',其 ASCII 值為69 ,二進制為 0100 0101

19、GETBIT

  Redis Getbit 命令用於對 key 所儲存的字符串值,獲取指定偏移量上的位(bit)。

語法:

redis 127.0.0.1:6379> GETBIT KEY_NAME OFFSET

返回值:字符串值指定偏移量上的位(bit)。當偏移量 OFFSET 比字符串值的長度大,或者 key 不存在時,返回 0

可用版本:>= 2.2.0

時間復雜度:O(1)

具體實例:

參見 setbit

下一篇:redis 在php中的應用(Hash篇)

 如有轉載,請注明出處:http://www.cnblogs.com/chrdai/p/6832373.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM