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