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 |
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
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 ,没有被覆盖
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用做缓存是非常有用。
返回值: 设置成功时返回OK。当seconds参数不合法时,返回一个错误。。
可用版本: >= 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
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) ,空白处被 � 填充了。
}
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),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
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),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的值并没有发生改变
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\'
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
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
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 ,若范围超过了字符串的长度,超过部分自动被忽略
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
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
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
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
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
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
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
Redis Setbit 命令用于对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。
(1)位的设置或清除取决于value参数,可以是0也可以是1。
(2)当key不存在时,自动生成一个新的字符串值。
(3)字符串会增长(grown)以确保它可以将value保存在指定的偏移量上。当字符串值增长时,空白位置以0填充。
(4)offset参数必须大于或等于0,小于2^32(bit映射被限制在512MB内)。
语法:
以上是关于redis 在 php 中的应用(string篇)的主要内容,如果未能解决你的问题,请参考以下文章