php redis使用 常用方法 | Windows环境下安装Redis | Windows下php安装redis扩展(详解版)
redis可视化工具:http://www.treesoft.cn/dms.html
#php redis使用 常用方法
https://www.cnblogs.com/mg007/p/10431079.html
基本: $redis = new Redis();//创建对象
$redis->connect('127.0.0.1',6379);//建立连接
$redis->delete('test');//删除
$redis->exists('test');//判断是否存在
$rs = redis->getMultiple(array('name','name1','name2'));//读取多个值并返回 数组 字符串: $redis->set('test','123');//写
$redis->setnx('test','123');//不存在时写
$rs = redis->get('test');//读 rs 123
$redis->incr('test');//加1 test 123=>124
$redis->decr('test');//减1 test 124=>123 列表: $redis->lpush('test','111');//在列表首添加一个元素
$redis->rpush('test','222');//在列表尾添加一个元素
$redis->lpop('test');//删除列表第一个元素
$redis->rpop('test');//删除列表最后一个元素
$redis->lsize('test');//统计列表元素数量
$redis->llen('test');//统计列表元素数量
$redis->lset('test',1,'111');//设置列表数据 1索引 111设置的值 索引不存在返回false
$redis->lget('test',2);//读取列表数据 2索引
$redis->lrange('test',0,20);//读取列表数据 0开始索引 20读取数量
$redis->lgetrange('test',0,20);//读取列表数据 0开始索引 20读取数量
$redis->lremove('test','a',2);//删除值为a的列表元素 2个数 即从头部开始删除2个为a的元素 集合: $redis->sadd('test','111');//添加一个元素
$redis->smembers('test');//读取集合
$redis->sgetmembers('test');//读取集合
$redis->sort('test');//读取集合
$redis->sremove('test','111');//删除集合中指定元素
$redis->smove('a','b','111');//将a集合值111的元素移动到b集合中去
$redis->scontains('test', '111');//判断集合中是否存在指定值
$redis->ssize('test');//获取集合元素数量
$redis->spop('test');//随机移除一个元素并返回
$redis->sinter("test","test1");//获取集合交集
$redis->sinterstore('new',"test","test1");//获取集合交集并创建给新集合new
$redis->sunion("test","test1");//获取集合并集
$redis->sinterstore('new',"test","test1");//获取集合并集并创建给新集合new
$redis->sdiff("test","test1");//获取集合差集
$redis->sdiffstore('new',"test","test1");//获取集合差集并创建给新集合new
https://www.cnblogs.com/wt645631686/p/8336499.html
Key相关操作 TYPE 类型检测,字符串返回string,列表返回 list,set表返回set/zset,hash表返回hash,key不存在返回0 复制代码
<?php
echo $redis->type('not_exists_key'); //none /int(0) $redis->set('str_key',"str_val"); //构建一个字符串
echo $redis->type('str_key'); //string / int(1) $redis->sadd('s_key',"s_val1"); //构建一个集合
echo $redis->TYPE('s_key'); //set /int(2) $redis->lpush('list_key',"list_val1"); //构建一个列表
echo $redis->type('list_key'); //list / int(3) $redis->zadd('z_key',1,'z_val1'); //构建一个zset (sorted set) // int(1)
$redis->zadd('z_key',2,'z_val2');
$redis->zadd('z_key',3,'z_val3');
echo $redis->zrange('z_key',0,-1); // array(3) { [0]=> string(3) "z_val1" [1]=> string(3) "z_val2" [2]=> string(3) "z_val3" }
echo $redis->type('z_key'); //zset / int(4) $redis->hset('website','baidu','www.baidu.com'); //一个新域
echo $redis->hget('website','baidu'); //string(8) "www.baidu.com"
echo $redis->type('website'); //hash /int(5)
复制代码
DEL 移除给定的一个或多个key,如果key不存在,则忽略该命令。 复制代码
<?php
//①删除单个key
$redis->set('key','val');
$redis->del('key'); //返回 TRUE(1)
var_dump($redis->get('key')); //返回 bool(false) //②删除一个不存在的key
if(!$redis->exists('no_exists_key')) //不存在
var_dump($redis->del('no_exists_key')); //返回 int(0) //③同时删除多个key
$array_mset=['key1'=>'val1','key2'=>'val2','key3'=>'val3'];
$redis->mset($array_mset); //用MSET一次储存多个值
$array_mget=array('key1','key2','key3');
var_dump($redis->mget($array_mget)); //一次返回多个值 //array(3) { [0]=> string(4) "val1" [1]=> string(4) "val2" [2]=> string(4) "val3" } $redis->del($array_mget); //同时删除多个key
var_dump($redis->mget($array_mget)); //返回 array(3) { [0]=> bool(false) [1]=> bool(false) [2]=> bool(false) }
复制代码
RANDOMKEY 从当前数据库中随机返回(不删除)一个key。当数据库不为空时,返回一个key,当数据库为空时,返回nil。 复制代码
<?php
//①数据库不为空
echo $redis->randomkey(); //返回随机key
//②数据库为空
var_dump($redis-> randomkey()); //bool(false)
复制代码
EXPIRE 为给定key设置生存时间,当key过期时,它会被自动删除。 <?php
$redis->expire('key', 30); //设置有效期为30秒;第二参数不传递,则取消expire行为
EXPIREAT EXPIREAT的作用和EXPIRE一样,都用于为key设置生存时间。不同在于EXPIREAT命令接受的时间参数是UNIX时间戳。 <?php
$redis->set('key','val');
echo $redis->expireat('key',strtotime('2018-01-23 18:00')); //设定过期时间为2018-01-23 18:00
echo $redis->ttl('key'); //倒计时剩余秒数
TTL 返回给定key的剩余生存时间,单位秒。当 key 不存在时,返回 -2,当 key 存在但没有设置剩余生存时间时,返回 -1 。 复制代码
<?php
//①设置过期时间的key
$redis->set('key','val');
$redis->expire('key',30); //设置生存时间为30秒 //return (integer) 1
echo $redis->get('key'); //return val
echo $redis->ttl('key'); //(integer) 25 ,不断输出,会不断缩减过期时间 echo $redis->ttl('key'); //30秒过去,name过期 //(integer) -2
var_dump($redis->get('key')); //过期的key将被删除 //return bool(false); //②没有设置过期时间的key
$redis->set('key','val');
var_dump($redis->ttl('key')); //int(-1) //③不存在的key
$redis->exists('not_exists_key');//int(0)
var_dump($redis->ttl('not_exists_key'));//int(-2)
复制代码
EXISTS 检查给定key是否存在,若key存在,返回1,否则返回0。 <?php
var_dump($redis->exists('key')); //key存在 返回bool(true) ,否则false
RENAME 对key进行改名,当key和newkey相同或者key不存在时,返回一个错误;当newkey已经存在时,RENAME命令将覆盖旧值。 复制代码
<?php
//①key存在且newkey不存在
$redis->set('key',"val");
var_dump($redis->rename('key','new_key')); //bool(true)
var_dump($redis->exists('key')); //key不复存在 //bool(false)
var_dump($redis->exists('new_key')); //new_key取而代之 //bool(true) //②当key不存在时,返回错误 ,返回false;
var_dump($redis->rename('not_exists_key','new_key')); //bool(false) //③new_key已存在时,RENAME会覆盖旧new_key
$redis->set('key',"val");
$redis->set('key2',"val2");
var_dump($redis->rename('key','key2')); //bool(true)
var_dump($redis->get('key')); //(nil) bool(false)
var_dump($redis->get('key2')); //string(6) "val"
复制代码
RENAMENX 当且仅当new_key不存在时,将key改为new_key。出错的情况和RENAME一样(key不存在时报错)。修改成功时,返回1。如果newkey已经存在,返回0。 复制代码
<?php
//① new_key不存在,成功
$redis->set('key',"val");
$redis->exists('new_key'); //int(0)
var_dump($redis->renamenx('key','new_key')); // bool(true) //②new_key存在时,失败
$redis->set('key1',"val1");
$redis->set('key2',"val2");
var_dump($redis->renamenx('key1', 'key2'));// bool(false)
复制代码
SORT 参数:
array(
'by' => 'pattern', //匹配模式
'limit' => array(0, 1),
'get' => 'pattern'
'sort' => 'asc' or 'desc',
'alpha' => TRUE,
'store' => 'external-key'
) 返回或保存给定列表、集合、有序集合key中经过排序的元素。 ①一般排序 复制代码
<?php
$redis->lpush('test', 1);
$redis->lpush('test', 10);
$redis->lpush('test', 8);
print_r($redis->sort('test')); //结果:Array ( [0] => 1 [1] => 8 [2] => 10 )
复制代码
②字母排序 复制代码
<?php
$redis->lpush('website', "www.reddit.com");
$redis->lpush('website', "www.slashdot.com");
$redis->lpush('website', "www.infoq.com");
//默认排序
var_dump($redis->SORT('website'));//array(3) { [0]=> string(13) "www.infoq.com" [1]=> string(16) "www.slashdot.com" [2]=> string(14) "www.reddit.com" } //按字符排序 ALPHA=true
var_dump($redis->SORT('website', array('ALPHA'=>TRUE))); //array(3) { [0]=> string(13) "www.infoq.com" [1]=> string(14) "www.reddit.com" [2]=> string(16) "www.slashdot.com" }
复制代码
③排序取部分数据 复制代码
<?php
$redis->lpush('test', 1);
$redis->lpush('test', 10);
$redis->lpush('test', 8);
print_r($redis->sort('test')); //结果:Array ( [0] => 1 [1] => 8 [2] => 10 )
复制代码
④使用外部key进行排序
有时候你会希望使用外部的key作为权重来比较元素,代替默认的对比方法。 假设现在有用户(user)数据如下: 复制代码
id name level
-------------------------------
1 admin 9999
2 huangz 10
59230 jack 3
222 hacker 9999
复制代码
id数据保存在key名为user_id的列表中。
name数据保存在key名为user_name_{id}的列表中
level数据保存在user_level_{id}的key中。 复制代码
<?php
//先将要使用的数据加入到数据库中 //admin
$redis->LPUSH('user_id', 1);//(integer) 1
$redis->SET('user_name_1', 'admin');
$redis->SET('user_level_1',9999); //huangz
$redis->LPUSH('user_id', 2);//(integer) 2
$redis->SET('user_name_2', 'huangz');
$redis->SET('user_level_2', 10); // jack
$redis->LPUSH('user_id', 59230);//(integer) 3
$redis->SET('user_name_59230','jack');
$redis->SET('user_level_59230', 3); //hacker
$redis->LPUSH('user_id', 222); //(integer) 4
$redis->SET('user_name_222', 'hacker');
$redis->SET('user_level_222', 9999);
复制代码
如果希望按level从大到小排序user_id,可以使用以下命令 复制代码
<?php
$redis_sort_option=array('BY'=>'user_level_*',
'SORT'=>'DESC'
);
var_dump($redis->SORT('user_id',$redis_sort_option)); //array(4) { [0]=> string(3) "222" [1]=> string(1) "1" [2]=> string(1) "2" [3]=> string(5) "59230" } //---------------------------
//1) "222" # hacker
//2) "1" # admin
//3) "2" # huangz
//4) "59230" # jack
复制代码
但是有时候只是返回相应的id没有什么用,你可能更希望排序后返回id对应的用户名,这样更友好一点,使用GET选项可以做到这一点 复制代码
<?php
$redis_sort_option=array('BY'=>'user_level_*',
'SORT'=>'DESC',
'GET'=>'user_name_*'
);
var_dump($redis->SORT('user_id', $redis_sort_option)); //array(4) { [0]=> string(6) "hacker" [1]=> string(5) "admin" [2]=> string(6) "huangz" [3]=> string(4) "jack" }
//---------------------------
//1) "hacker"
//2) "admin"
//3) "huangz"
//4) "jack"
复制代码
可以多次地、有序地使用GET操作来获取更多外部key。
比如你不但希望获取用户名,还希望连用户的密码也一并列出,可以使用以下命令: 复制代码
<?php
// 先添加一些测试数据
$redis->SET('user_password_222', "hey,im in");
$redis->SET('user_password_1', "a_long_long_password");
$redis->SET('user_password_2', "nobodyknows");
$redis->SET('user_password_59230', "jack201022"); // 获取name和password
$redis_sort_option=array('BY'=>'user_level_*',
'SORT'=>'DESC',
'GET'=>array('user_name_*','user_password_*')
);
var_dump($redis->SORT('user_id',$redis_sort_option));//array(8) { [0]=> string(6) "hacker" [1]=> string(9) "hey,im in" [2]=> string(5) "admin" [3]=> string(20) "a_long_long_password" [4]=> string(6)
"huangz" [5]=> string(11) "nobodyknows" [6]=> string(4) "jack" [7]=> string(10) "jack201022" } //------------------------------------
//1) "hacker" // 用户名
//2) "hey,im in" // 密码
//3) "jack"
//4) "jack201022"
//5) "huangz"
//6) "nobodyknows"
//7) "admin"
//8) "a_long_long_password"
复制代码
注意GET操作是有序的,GET user_name_* GET user_password_* 和 GET user_password_* GET user_name_*返回的结果位置不同 复制代码
<?php
//获取name和password 注意GET操作是有序的
$redis_sort_option=array('BY'=>'user_level_*',
'SORT'=>'DESC',
'GET'=>array('user_password_*','user_name_*')
);
var_dump($redis->SORT('user_id',$redis_sort_option));// array(8) { [0]=> string(9) "hey,im in" [1]=> string(6) "hacker" [2]=> string(20) "a_long_long_password" [3]=> string(5) "admin" [4]=> string(11) "nobodyknows"
[5]=> string(6) "huangz" [6]=> string(10) "jack201022" [7]=> string(4) "jack" }
复制代码
GET还有一个特殊的规则——"GET #",用于获取被排序对象(我们这里的例子是user_id)的当前元素。
比如你希望user_id按level排序,还要列出id、name和password,可以使用以下命令: 复制代码
<?php
$redis_sort_option=array('BY'=>'user_level_*',
'SORT'=>'DESC',
'GET'=>array('//','user_password_*','user_name_*')
);
var_dump($redis->SORT('user_id',$redis_sort_option));//array(12) { [0]=> string(3) "222" [1]=> string(9) "hey,im in" [2]=> string(6) "hacker" [3]=> string(1) "1" [4]=> string(20) "a_long_long_password"
[5]=> string(5) "admin" [6]=> string(1) "2" [7]=> string(11) "nobodyknows" [8]=> string(6) "huangz" [9]=> string(5) "59230" [10]=> string(10) "jack201022" [11]=> string(4) "jack" } //--------------------------------------------------------------
//1) "222" // id
//2) "hacker" // name
//3) "hey,im in" // password
//4) "1"
//5) "admin"
//6) "a_long_long_password"
//7) "2"
//8) "huangz"
//9) "nobodyknows"
//10) "59230"
//11) "jack"
//12) "jack201022"
复制代码
只获取对象而不排序
BY修饰符可以将一个不存在的key当作权重,让SORT跳过排序操作。
该方法用于你希望获取外部对象而又不希望引起排序开销时使用。 复制代码
<?php
// 确保fake_key不存在
$redis->EXISTS('fake_key');//(integer) 0 // 以fake_key作BY参数,不排序,只GET name 和 GET password
$redis_sort_option=array('BY'=>'fake_key',
'SORT'=>'DESC',
'GET'=>array('//','user_name_*','user_password_*')
);
var_dump($redis->SORT('user_id',$redis_sort_option));//array(12) { [0]=> string(3) "222" [1]=> string(6) "hacker" [2]=> string(9) "hey,im in" [3]=> string(5) "59230" [4]=> string(4) "jack" [5]=> string(10)
"jack201022" [6]=> string(1) "2" [7]=> string(6) "huangz" [8]=> string(11) "nobodyknows" [9]=> string(1) "1" [10]=> string(5) "admin" [11]=> string(20) "a_long_long_password" } //----------------------------------------------
//1) "222" // id
//2) "hacker" // user_name
//3) "hey,im in" // password
//4) "59230"
//5) "jack"
//6) "jack201022"
//7) "2"
//8) "huangz"
//9) "nobodyknows"
//10) "1"
//11) "admin"
//12) "a_long_long_password"
复制代码
保存排序结果 默认情况下,SORT操作只是简单地返回排序结果,如果你希望保存排序结果,可以给STORE选项指定一个key作为参数,排序结果将以列表的形式被保存到这个key上。(若指定key已存在,则覆盖。) 复制代码
<?php
$redis->EXISTS('user_info_sorted_by_level'); // 确保指定key不存在 //(integer) 0
$redis_sort_option=array('BY'=>'user_level_*',
'GET'=>array('//','user_name_*','user_password_*'),
'STORE'=>'user_info_sorted_by_level'
); var_dump($redis->SORT('user_id',$redis_sort_option)); //int(12)
var_dump($redis->LRANGE('user_info_sorted_by_level', 0 ,11)); // 查看排序结果 //array(12) { [0]=> string(5) "59230" [1]=> string(4) "jack" [2]=> string(10) "jack201022" [3]=> string(1) "2" [4]=> string(6)
"huangz" [5]=> string(11) "nobodyknows" [6]=> string(3) "222" [7]=> string(6) "hacker" [8]=> string(9) "hey,im in" [9]=> string(1) "1" [10]=> string(5) "admin" [11]=> string(20) "a_long_long_password" } //-----------------------------------------------------------------
//1) "59230"
//2) "jack"
//3) "jack201022"
//4) "2"
//5) "huangz"
//6) "nobodyknows"
//7) "222"
//8) "hacker"
//9) "hey,im in"
//10) "1"
//11) "admin"
//12) "a_long_long_password"
复制代码
一个有趣的用法是将SORT结果保存,用EXPIRE为结果集设置生存时间,这样结果集就成了SORT操作的一个缓存。
这样就不必频繁地调用SORT操作了,只有当结果集过期时,才需要再调用一次SORT操作。
有时候为了正确实现这一用法,你可能需要加锁以避免多个客户端同时进行缓存重建(也就是多个客户端,同一时间进行SORT操作,并保存为结果集),具体参见SETNX命令。
在GET和BY中使用哈希表
可以使用哈希表特有的语法,在SORT命令中进行GET和BY操作。 复制代码
<?php
// 假设现在我们的用户表新增了一个serial项来为作为每个用户的序列号
// 序列号以哈希表的形式保存在serial哈希域内。 $redis_hash_testdata_array=array(1=>'23131283',
2=>'23810573',
222=>'502342349',
59230=>'2435829758'
); $redis->HMSET('serial',$redis_hash_testdata_array); // 我们希望以比较serial中的大小来作为排序user_id的方式
$redis_sort_option=array('BY'=>'*->serial');
var_dump($redis->SORT('user_id', $redis_sort_option)); //array(4) { [0]=> string(3) "222" [1]=> string(5) "59230" [2]=> string(1) "2" [3]=> string(1) "1" } //----------------------------------------
//1) "222"
//2) "59230"
//3) "2"
//4) "1"
复制代码
符号"->"用于分割哈希表的关键字(key name)和索引域(hash field),格式为"key->field"。
除此之外,哈希表的BY和GET操作和上面介绍的其他数据结构(列表、集合、有序集合)没有什么不同。 SET 将字符串值value关联到key。如果key已经持有其他值,SET就覆写旧值,无视类型,总是返回OK(TRUE),因为SET不可能失败。 复制代码
<?php
//①对字符串类型的key进行SET
$redis->SET('key', 'val');//bool(true) //②对非字符串类型的key进行SET
$redis->LPUSH('key_obj', "val1"); //建立一个列表 #(integer) 1 //int(1)
$redis->TYPE('key_obj');//list //int(3) $redis->SET('key', "val_obj"); //覆盖列表类型 #OK //bool(true)
$redis->TYPE('key');//string //int(1)
复制代码
SETNX 将key的值设为value,当且仅当key不存在。若给定的key已经存在,则SETNX不做任何动作。设置成功,返回1。设置失败,返回0。 复制代码
<?php
$redis->exists('key'); // key不存在 //bool(false);
$redis->setnx('key', "val"); // key设置成功 //bool(true)
$redis->setnx('key', "val1"); // key设置失败 //bool(false)
echo $redis->get('key'); // 没有被覆盖 //"val"
复制代码
SETEX 将值value关联到key,并将key的生存时间设为seconds(以秒为单位)。如果key已经存在,SETEX命令将覆写旧值。设置成功时返回OK. 复制代码
<?php
$redis->setex('key', 10, 'val'); //表示存储有效期为10秒
举例:
//①key不存在
$redis->setex('key', 60,val);//bool(true)
echo $redis->get('key'); //值 //"val"
sleep(4);
echo $redis->ttl('key'); //剩余生存时间 //int(56) //②key已经存在,key被覆写
$redis->set('key', "val1"); //bool(true);
$redis->setex('key', 3000,"val2"); //bool(true);
echo $redis->get('key'); //"val2"
复制代码
SETRANGE 用value参数覆写给定key所储存的字符串值,从偏移量offset开始。不存在的key当作空白字符串处理。
SETRANGE命令会确保字符串足够长以便将value设置在指定的偏移量上,如果给定key原来储存的字符串长度比偏移量小(比如字符串只有5个字符长,但你设置的offset是10),那么原字符和偏移量之间的空白将用零比特(zerobytes,"\x00")来填充。 警告 当生成一个很长的字符串时,Redis需要分配内存空间,该操作有时候可能会造成服务器阻塞(block)。在2010年的Macbook Pro上,设置偏移量为536870911(512MB内存分配),耗费约300毫秒, 设置偏移量为134217728(128MB内存分配),耗费约80毫秒,设置偏移量33554432(32MB内存分配),耗费约30毫秒,设置偏移量为8388608(8MB内存分配),耗费约8毫秒。 注意若首次内存分配成功之后,再对同一个key调用SETRANGE操作,无须再重新内存。 复制代码
<?php
//①对非空字符串进行SETRANGE
$redis->SET('key', "hello world");
$redis->SETRANGE('key', 6, "Redis"); //int(11)
$redis->GET('key');//"hello Redis" //②对空字符串/不存在的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 同时设置一个或多个key-value对。当发现同名的key存在时,MSET会用新值覆盖旧值,如果你不希望覆盖同名key,请使用MSETNX命令。总是返回OK(因为MSET不可能失败) 复制代码
<?php
$array_mset=['key1'=>'val1', 'key2'=>'val2'];
$redis->MSET($array_mset); //bool(true) // 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 同时设置一个或多个key-value对,当且仅当key不存在。即使只有一个key已存在,MSETNX也会拒绝所有传入key的设置操作(原子性),当所有key都成功设置,返回1。如果所有key都设置失败(最少有一个key已经存在),那么返回0。 复制代码
<?php
//①对不存在的key进行MSETNX
$array_mset=array('rmdbs'=>'MySQL',
'nosql'=>'MongoDB',
'key-value-store'=>'redis'
);
$redis->MSETNX($array_mset);//bool(true) //②对已存在的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 连接到或者设定字符串。如果key已经存在并且是一个字符串,APPEND命令将value追加到key原来的值之后。如果key不存在,APPEND就简单地将给定key设为value,就像执行SET key value一样。 复制代码
<?php
//①对不存在的key执行APPEND
$redis->exists('key'); // 确保key不存在 //bool(false)
$redis->append('key',"val"); // 对不存在的key进行APPEND,等同于SET key "val" //int(3) // 字符长度 //②对字符串进行APPEND
$redis->append('key', " append_val ");
echo $redis->get('key'); // 查看整个字符串 //"val append_val" //strlen 获取字符串长度,当 key不存在时,返回0。
$redis->set('key', "value");
echo $redis->strlen('key'); //int(5)
echo $redis->strlen('not_exists_key'); // 不存在的key长度视为0 //int(0)
复制代码
GET 返回key所关联的字符串值。如果key不存在,返回nil。 <?php
var_dump($redis->GET('not_exists_key')); //return bool(false)
$redis->SET('exists_key', "val"); //return bool(true)
var_dump($redis->GET('exists_key')); //return string(7) "val"
MGET
返回所有(一个或多个)给定key的值。如果某个指定key不存在,那么返回特殊值nil。因此,该命令永不失败。一个包含所有给定key的值的列表。 <?php
$redis_mget_key_array=array('exists_key','not_exists_key');
var_dump($redis->MGET($redis_mget_key_array)); //当MGET中有不存在key的情况 //array(2) { [0]=> string(3) "val" [1]=> bool(false) }
GETRANGE
返回key中字符串值的子字符串,字符串的截取范围由start和end两个偏移量决定(包括start和end在内)。负数偏移量表示从字符串最后开始计数,-1表示最后一个字符,-2表示倒数第二个,以此类推。 复制代码
<?php
$redis->SET('key', "hello, my friend");
echo $redis->GETRANGE('key', 0, 4); //返回索引0-4的字符,包括4。 //"hello"
echo $redis->GETRANGE('key', -1 ,-5); //不支持回绕操作 //""
echo $redis->GETRANGE('key', -3 ,-1); //负数索引 //"end"
echo $redis->GETRANGE('key', 0, -1); //从第一个到最后一个 //"hello, my friend"
echo $redis->GETRANGE('key', 0, 1008611); //值域范围不超过实际字符串,超过部分自动被符略 //"hello, my friend"
复制代码
GETSET 将给定key的值设为value,并返回key的旧值。当key没有旧值时,返回nil。 <?php
var_dump($redis->EXISTS('key'));//return bool(false);
var_dump($redis->GETSET('key','old_val')); //因为key之前不存在,没有旧值,返回nil //bool(false)
var_dump($redis->GETSET('key','new_val')); //key被更新,旧值被返回 //string(7) "old_val"
STRLEN
返回key所储存的字符串值的长度。当key储存的不是字符串值时,返回一个错误。字符串值的长度,当 key不存在时,返回0。 <?php
$redis->SET('key', "Hello world");
echo $redis->STRLEN('key'); //int(11)
echo $redis->STRLEN('not_exists_key'); //不存在的key长度视为int(0)
INCR
将key中储存的数字值增一。如果key不存在,以0为key的初始值,然后执行INCR操作。 <?php
$redis->SET('page_view', 20);
var_dump($redis->INCR('page_view')); //int(21)
var_dump($redis->GET('page_view')); // 数字值在Redis中以字符串的形式保存 //string(2) "21
INCRBY
将key所储存的值加上增量increment。如果key不存在,以0为key的初始值,然后执行INCRBY命令。 复制代码
<?php
//①key存在且是数字值
$redis->SET('num', 50); //设置num为50
$redis->INCRBY('num', 20); //给num加上20
var_dump($redis->GET('num')); //string(2) "70" //②key不存在
$redis->INCRBY('not_exists_key',20); //20
var_dump($redis->GET('not_exists_key')); //string(20) //③key不是数字值
$redis->SET('book', "long long ago...");
var_dump($redis->INCRBY('book', 200)); // bool(false)
复制代码
DECR 将key中储存的数字值减一。如果key不存在,以0为key的初始值,然后执行DECR操作。 复制代码
<?php
//①对存在的数字值key进行DECR
$redis->SET('num', 10);
$redis->DECR('num'); //int(9)
echo $redis->GET('num'); //string(1) "9" //②对不存在的key值进行DECR
$redis->DECR('not_exists_key'); //int(-1)
echo $redis->GET('not_exists_key'); //string(2) "-1"
复制代码
DECRBY
将key所储存的值减去减量decrement。如果key不存在,以0为key的初始值,然后执行DECRBY操作。 复制代码
<?php
//①对存在的数值key进行DECRBY
$redis->SET('num', 100);
var_dump($redis->DECRBY('num', 20)); //int(80)
var_dump($redis->GET('num')); //string(2) "80" //②对不存在的key进行DECRBY
var_dump($redis->DECRBY('not_exists', 10)); //int(-10)
var_dump($redis->GET('not_exists')); //string(3) "-10"
测试例子:
<?php $redis = new Redis();//创建对象
$redis->connect('127.0.0.1',6379);//建立连接
// $redis->lpush('test','333');//在列表首添加一个元素
// $redis->rpush('test','444');//在列表尾添加一个元素
$arr = array(
'name' => 'cui',
'sex' => 'man',
'age' => 35,
'address' => '山东省'
);
$rs = $redis->lset('test',6,'aaa');
// $rs = $redis->lget('test',1);
// $rs = $redis->lrange('test',0,10);
// $rs = $redis->lremove('test','444',3);
// $rs = $redis->hset('hash1','sex','man');
// $redis->hset('website','baidu','www.baidu.com');
// $redis->hset('website',8001,json_encode($arr));
#Windows环境下安装Redis
https://www.cnblogs.com/skmobi/p/11696620.html
一.Redis临时服务
1.打开cmd,进入到刚才解压到的目录,启动临时服务:redis-server.exe redis.windows.conf (备注:通过这个命令,会创建Redis临时服务,不会在window Service列表出现Redis服务名称和状态,此窗口关闭,服务会自动关闭。)
2.打开另一个cmd窗口,客户端调用:redis-cli.exe -h 127.0.0.1 -p 6379
二.Redis自定义windows服务安装
1.进入Redis安装包目录,安装服务:redis-server.exe --service-install redis.windows.conf --service-name redisserver1 --loglevel verbose
win+r -> services.msc,可以看到服务安装成功
安装服务:redis-server.exe --service-install redis.windows.conf --service-name redisserver1 --loglevel verbose
启动服务:redis-server.exe --service-start --service-name redisserver1
停止服务:redis-server.exe --service-stop --service-name redisserver1
卸载服务:redis-server.exe --service-uninstall--service-name redisserver1
三. 主从服务器
将d盘下新建一个文件夹叫redis2,把redis文件夹的东西拷贝到redis2文件夹下,将redis-windows.conf配置文件中的ip 和端口号改一下,然后按照上面的步骤按照一个服务即可
使用redis桌面管理器(下载地址:https://redisdesktop.com/),看到两个redis库
设置密码把 #requirepass foobared 的#号去掉改为自己的密码即可
设置好保存后,若要使设置起作用,需要重启redis服务
端口号和ip同理
重启后需要输入密码
#Windows下php安装redis扩展(详解版)
https://www.cnblogs.com/emmmmmm/p/10005726.html
首先确定电脑已经安装好了redis并且能使用,没有安装的伙计:http://www.runoob.com/redis/redis-install.html
1.使phpinfo()函数查看PHP的版本信息,决定扩展文件版本(版本一定要对上,一定)。
2.需要php_redis.dll文件
php_redis-2.2.5-5.6-nts-vc11-x86.zip(一定要保证版本的正确性)
(这里注意php版本、php是nts还是ts 、php是x64以及x86 *这些必须一致*)
php_redis.dll 下载地址:https://pecl.php.net/package/redis
3.下载完成后:
双击打开php_redis-2.2.7-5.6-nts-vc11-x86.zip文件。其中的php_redis.dll是我们需要用到的
4.解压缩后,将php_redis.dll拷贝至php的ext目录下
5.修改php.ini在该文件中加入:
extension=php_redis.dll
6.重启Apache后,使用phpinfo查看扩展是否成功安装
注意: 如果没有:请重新检查版本以及文件放置位置
redis扩展不需要安装 php_igbinary.dll,百度的文章有的会把这个也写进去,亲测没有php_igbinary.dll,redis也可以启动
php_igbinary : 在序列化和反序列化的效率上高于其自带的
如果需要下载地址:http://windows.php.net/downloads/pecl/releases/igbinary/1.2.1/
同样根据版本下载:安装方法同上,下载压缩包把php_igbinary.dll文件拷贝到php的ext文件夹下,在php.ini中加上
extension=php_igbinary.dll,放在extension=php_redis.dll的前面
php redis使用 常用方法 | Windows环境下安装Redis | Windows下php安装redis扩展(详解版)的更多相关文章
- centos7.2环境nginx+mysql+php-fpm+svn配置walle自动化部署系统详解
centos7.2环境nginx+mysql+php-fpm+svn配置walle自动化部署系统详解 操作系统:centos 7.2 x86_64 安装walle系统服务端 1.以下安装,均在宿主机( ...
- Mac OS X10.9安装的Python2.7升级Python3.4步骤详解
Mac OS X10.9安装的Python2.7升级Python3.4步骤详解 Mac OS X10.9默认带了Python2.7,不过现在Python3.4.0出来了,如果想使用最新版本,赶紧升级下 ...
- (转)Linux下PS1、PS2、PS3、PS4使用详解
Linux下PS1.PS2.PS3.PS4使用详解 原文:http://www.linuxidc.com/Linux/2016-10/136597.htm 1.PS1——默认提示符 如下所示,可以通过 ...
- 基于windows环境的Flask网站搭建(mysql + conda + redis)
1下载mysql-installer-community-5.7.24.0.msi (https://dev.mysql.com/downloads/windows/installer/8.0.htm ...
- windows下安装redis3.2.100单机和集群详解
下载redis 下载地址:https://github.com/MicrosoftArchive/redis/releases 我下载的是3.2.100版本的Redis-x64-3.2.100.zip ...
- 【码上开心】Windows环境mysql数据库使用(一) 安装Mysql数据库
[下载MySql] https://dev.mysql.com/downloads/mysql/ 如下图,选择版本,本教程仅演示ZIP压缩包下载配置. 2.[解压到指定目录] 3.[配置环境变量] 4 ...
- python commands包不支持windows环境与如何在windows下使用的简易方法
commands模块不支持windows环境,让我们来看看. >>> import commands >>> print commands.getoutput('d ...
- Git学习系列之Windows上安装Git之后的一些配置(图文详解)
不多说,直接上干货! 前面博客 Git学习系列之Windows上安装Git详细步骤(图文详解) 第一次使用Git时,需要对Git进行一些配置,以方便使用Git. 不过,这种配置工作只需要进行一次便可, ...
- Android开发最强模拟器Genymotion的安装及使用教程。附注释图详解
前沿 呵呵,笔者第一次在公开的博客网站写心得,想让自己的Android开发生涯留下点足迹,并且为自己做点笔记,如果该文章能帮到广大的Android小白朋友最好了(其实我也是一小白,(●'◡'●)) ...
- 反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑) C#中缓存的使用 C#操作redis WPF 控件库——可拖动选项卡的TabControl 【Bootstrap系列】详解Bootstrap-table AutoFac event 和delegate的分别 常见的异步方式async 和 await C# Task用法 c#源码的执行过程
反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑) 背景介绍: 为了平衡社区成员的贡献和索取,一起帮引入了帮帮币.当用户积分(帮帮点)达到一定数额之后,就会“掉落”一定数量的“帮帮 ...
随机推荐
- GmSSL3.0密码算法库
GmSSL3.0密码算法库 一.开发背景 GmSSL 3.0版本具有更快.更小.更安全的特点,相比于GmSSL 2.0我们主要从以下方向进行改进: 采用CMake替代目前基于Perl的构建系统 支持L ...
- python 多进程和异步io的有机结合 Error in atexit._run_exitfuncs
众所周知,python的多线程开发在GIL(全局器解释锁)下饱受诟病,在单核模式下搞多线程对效率的提升相当有限.于是大家的共识就是搞io密集的程序,建议采用多线程,计算密集型的程序就搞多进程.近期的一 ...
- EF Core级联保存时DbUpdateConcurrencyException报错异常
出现改报错异常的原因是,EF Core不支持级联更新时添加新的子项!!! 如果主体子项添加一个新内容,EF Core则认为这个内容原本已经存在了(实际是你新增的),只不过并发冲突中被其他进程删除掉了, ...
- SAP BW/4HANA 听课笔记
BW/4HANA听课笔记 1.本地SQL,BW/4HANA对象和HANA VIEW互相访问: 2.高级分析功能数据分析预测: 3.InfoOjbect:Characteristics(维度),Key ...
- 前端如何给bearer token传值
Bearer token是一种常见的身份验证机制,通常用于Web API和其他Web服务.在前端中,Bearer token通常是通过HTTP头(HTTP header)发送的,具体来说是通过&quo ...
- Software_programming_automation_selenium
10:52:37 Table 获取 tr list 注意会无法正常遍历获取. 修正后正常 1 public SelectionCriteriaPage checkSpecifyTag(int coun ...
- GUI程序设计——班级信息收集系
import pymysql import wx class MyFrame(wx.Frame): def __init__(self,parent,id): wx.Frame.__init__(se ...
- div里元素横向排列 居中对齐
<div> <img src="//s.weituibao.com/1582958061265/mlogo.png" alt=&quo ...
- Mybatisplus-Generator代码生成器-简单示例
简单示例 import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotatio ...
- python安装及简单爬虫(爬取导师信息)
1.下载: 解释器(我下的是3.8.2版本):https://www.python.org/downloads/ pycharm(我下的是2019.3.3版本):https://www.jetbrai ...