redis 在 php 中的应用(string篇)

Posted Chrdai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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内)。

语法: