PHP下的Redis使用与总结

关于redis的介绍这里就不写了,百科就能查到,Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

一、利用PHP自带的libredis扩展库进行连接操作 例一:

$libredis = Libredis ();
$connection = $libredis->get_connection ( "127.0.0.1" );
// set a key
$batch = $libredis->create_batch ();
$batch->set ( 'hello', 'world' );
$batch->execute ( $connection );
// now fetch the key
$batch = $libredis->create_batch ();
$batch->get ( 'hello' );
$batch->execute ( $connection );
while ( $batch->next_reply ( $reply_type, $reply_value, $reply_length ) ) {
    echo $reply_value, PHP_EOL;
}

例二:

$libredis = Libredis ();
$connection1 = $libredis->get_connection ( "127.0.0.1:6379" );
$connection2 = $libredis->get_connection ( "127.0.0.1:6380" );
$batch1 = $libredis->create_batch ();
$batch1->set ( 'hello', 'world' ); // add a 'set' command to batch1
$batch2 = $libredis->create_batch ();
$batch2->set ( 'hello2', 'world2' );
$executor = $libredis->create_executor ();
$executor->add ( $connection1, $batch1 ); // associate connection1 with batch1
$executor->add ( $connection2, $batch2 ); // associate connection2 with batch2
                                       // execute all batches against their corresponding connections in parallel, with a
                                       // 500 ms timeout on the whole operation.
$executor->execute ( 500 );

二、远程连接redis并给redis加锁

用法:redis-cli [OPTIONS] [cmd [arg [arg ...]]] -h <主机ip>,默认是127.0.0.1 -p <端口>,默认是6379 -a <密码>,如果redis加锁,需要传递密码 --help,显示帮助信息

通过对rendis-cli用法介绍,在192.168.99.44上连接192.168.99.39应该很简单:

[root@hkshadow001 ~]# redis-cli -h 192.168.99.39 -p 6379 
redis 192.168.1.103:6379> 

在192.168.99.44上对192.168.99.39设置个个string值 user.1.name=hkshadow

redis 192.168.1.103:6379> set user.1.name hkshadow 
OK 

看到ok,表明设置成功了。然后直接在192.168.99.39上登陆,看能不能获取到这个值。

[root@hkshadow001 ~]# redis-cli 
redis 127.0.0.1:6379> get user.1.name 
"hkshadow" 

查看链接的用户这里显示的是hkshadow,说明192.168.99.44已经链接上了192.168.99.36,一般在内网进行redis链接相对是安全的,但在外网时需要加一个验证才是比较安全的,在这里设置一个账号验证。

[root@hkshadow001 ~]# vim /etc/redis/6379.conf 

找到# requirepass foobared,去掉前面的注释"#",并把foobared 替换为你自己的密码:"hi,redis"。 保存配置文件之后,重启redis服务。

[root@hkshadow001 ~]# /etc/init.d/redis_6379 stop  
Stopping ...  
Waiting for Redis to shutdown ...  
Redis stopped  
[root@hkshadow001 ~]# /etc/init.d/redis_6379 start  
Starting Redis server... 

这时候再使用192.168.99.44连接192.168.99.39并获取user.1.name的值,看看发生什么。

[root@linuxidc001 ~]# redis-cli -h 192.168.1.103 -p 6379  
redis 192.168.1.103:6379> get user.1.name  
(error) ERR operation not permitted  
redis 192.168.1.103:6379> 

报错了,因为刚刚增加了一个验证信息,需要以下操作。

redis 192.168.99.39:6379> quit  
[root@linuxidc001 ~]# redis-cli -h 192.168.1.103 -p 6379 -a "hi,redis"  //这里的之前配置里改的值
redis 192.168.99.39:6379> get user.1.name  
"hkshadow" 

三、redis-cli的使用

TYPE key — 用来获取某key的类型 KEYS pattern — 匹配所有符合模式的key,比如KEYS * 就列出所有的key了,当然,复杂度O(n) RANDOMKEY - 返回随机的一个key RENAME oldkey newkey — 改变key的名字 SELECT: ./redis-cli select 6

表示切换到数据库6

SET: ./redis-cli -n 0 set nid 123456789 
# 表示向数据库0中插入字符串key为nid,value值为123456789  
GET: ./redis-cli -n 0 get nid 或者 ./redis-cli get nid 
# 表示获取数据库为0,key为nid的字符串,在不指定数据编号的情况下,默认连接的是0数据库,所以可以省略-n参数 
GETSET: ./redis-cli getset nid 987654321 
# 表示返回指定key的原始值,并指定一个新值给他 
MGET: ./redis-cli mget nid uid … 
# 表示获取多个key的值 
SETNX: ./redis-cli setnx nnid 888888 
# 表示当一个指定的key不存在时,设置这个key指定的value,如果存在,则设置不成功 
SETEX: ./redis-cli setex nid 5 666666 
# 表示设置一个key指定的value保存5秒后失效,设置key/value的有效期 
MSET: ./redis-cli mset nid0001 "0001" nid0002 "0002" nid0003 "0003"
# 表示多键值对的数据保存 
INCR: ./redis-cli incr count 
# 表示对给定key的value进行递增(+1)的操作,当然value必须是一个integer 
INCRBY: ./redis-cli incrby count 5 
# 表示对给定key的value进行指定步长的递增操作 
DECR: ./redis-cli decr count 
# 表示对给定key的value进行递减(-1)的操作 
DECRBY: ./redis-cli decrby count 7 
# 表示对给定key的value进行指定步长的递减操作 
APPEND: ./redis-cli append content "bad"   或者  ./redis-cli append content "good"
# 表示追加一个value到指定的key中,如果key不存在,则新建key 
SUBSTR: ./redis-cli substr content 0 4 
# 表示返回指定key的value的部分字符串

列表操作,精华

RPUSH key string — 将某个值加入到一个key列表末尾 LPUSH key string — 将某个值加入到一个key列表头部 LLEN key — 列表长度 LRANGE key start end — 返回列表中某个范围的值,相当于mysql里面的分页查询那样 LTRIM key start end — 只保留列表中某个范围的值 LINDEX key index — 获取列表中特定索引号的值,要注意是O(n)复杂度 LSET key index value — 设置列表中某个位置的值 RPOP key

集合操作

SADD key member — 增加元素 SREM key member — 删除元素 SCARD key — 返回集合大小 SISMEMBER key member — 判断某个值是否在集合中 SINTER key1 key2 ... keyN — 获取多个集合的交集元素 SMEMBERS key — 列出集合的所有元素

四、删除redis所有KEY Redis 中有删除单个 Key 的指令 DEL,但好像没有批量删除 Key 的指令,不过我们可以借助 Linux 的 xargs 指令来完成这个动作。

redis-cli keys "*" | xargs redis-cli del
//如果redis-cli没有设置成系统变量,需要指定redis-cli的完整路径
//如:/opt/redis/redis-cli keys "*" | xargs /opt/redis/redis-cli del

如果要指定 Redis 数据库访问密码,使用下面的命令:

redis-cli -a password keys "*" | xargs redis-cli -a password del

如果要访问 Redis 中特定的数据库,使用下面的命令:

//下面的命令指定数据序号为0,即默认数据库
redis-cli -n 0 keys "*" | xargs redis-cli -n 0 del

删除所有Key,可以使用Redis的flushdb和flushall命令

//删除当前数据库中的所有Key
flushdb
//删除所有数据库中的key
flushall

注:keys 指令可以进行模糊匹配,但如果 Key 含空格,就匹配不到了,暂时还没发现好的解决办法。

五、redis-cli 命令总结 Redis提供了丰富的命令(command)对数据库和各种数据类型进行操作,这些command可以在Linux终端使用。 在编程时,比如使用Redis 的Java语言包,这些命令都有对应的方法。下面将Redis提供的命令做一总结。

1、连接操作相关的命令 quit:关闭连接(connection) auth:简单密码认证

2、对value操作的命令 exists(key):确认一个key是否存在 del(key):删除一个key type(key):返回值的类型 keys(pattern):返回满足给定pattern的所有key randomkey:随机返回key空间的一个key rename(oldname, newname):将key由oldname重命名为newname,若newname存在则删除newname表示的key dbsize:返回当前数据库中key的数目 expire:设定一个key的活动时间(s) ttl:获得一个key的活动时间 select(index):按索引查询 move(key, dbindex):将当前数据库中的key转移到有dbindex索引的数据库 flushdb:删除当前选择数据库中的所有key flushall:删除所有数据库中的所有key

3、对String操作的命令 set(key, value):给数据库中名称为key的string赋予值value get(key):返回数据库中名称为key的string的value getset(key, value):给名称为key的string赋予上一次的value mget(key1, key2,…, key N):返回库中多个string(它们的名称为key1,key2…)的value setnx(key, value):如果不存在名称为key的string,则向库中添加string,名称为key,值为value setex(key, time, value):向库中添加string(名称为key,值为value)同时,设定过期时间time mset(key1, value1, key2, value2,…key N, value N):同时给多个string赋值,名称为key i的string赋值value i msetnx(key1, value1, key2, value2,…key N, value N):如果所有名称为key i的string都不存在,则向库中添加string, 名称key i赋值为value i incr(key):名称为key的string增1操作 incrby(key, integer):名称为key的string增加integer decr(key):名称为key的string减1操作 decrby(key, integer):名称为key的string减少integer append(key, value):名称为key的string的值附加value substr(key, start, end):返回名称为key的string的value的子串

4、对List操作的命令 rpush(key, value):在名称为key的list尾添加一个值为value的元素 lpush(key, value):在名称为key的list头添加一个值为value的 元素 llen(key):返回名称为key的list的长度 lrange(key, start, end):返回名称为key的list中start至end之间的元素(下标从0开始,下同) ltrim(key, start, end):截取名称为key的list,保留start至end之间的元素 lindex(key, index):返回名称为key的list中index位置的元素 lset(key, index, value):给名称为key的list中index位置的元素赋值为value lrem(key, count, value):删除count个名称为key的list中值为value的元素。 count为0,删除所有值为value的元素,count>0从头至尾删除count个值为value的元素,count<0从尾到头删除|count|个值为value的元素。 lpop(key):返回并删除名称为key的list中的首元素 rpop(key):返回并删除名称为key的list中的尾元素 blpop(key1, key2,… key N, timeout):lpop命令的block版本。 即当timeout为0时,若遇到名称为key i的list不存在或该list为空,则命令结束。 如果timeout>0,则遇到上述情况时,等待timeout秒,如果问题没有解决,则对keyi+1开始的list执行pop操作。 brpop(key1, key2,… key N, timeout):rpop的block版本。参考上一命令。 rpoplpush(srckey, dstkey):返回并删除名称为srckey的list的尾元素,并将该元素添加到名称为dstkey的list的头部

5、对Set操作的命令 sadd(key, member):向名称为key的set中添加元素member srem(key, member) :删除名称为key的set中的元素member spop(key) :随机返回并删除名称为key的set中一个元素 smove(srckey, dstkey, member) :将member元素从名称为srckey的集合移到名称为dstkey的集合 scard(key) :返回名称为key的set的基数 sismember(key, member) :测试member是否是名称为key的set的元素 sinter(key1, key2,…key N) :求交集 sinterstore(dstkey, key1, key2,…key N) :求交集并将交集保存到dstkey的集合 sunion(key1, key2,…key N) :求并集 sunionstore(dstkey, key1, key2,…key N) :求并集并将并集保存到dstkey的集合 sdiff(key1, key2,…key N) :求差集 sdiffstore(dstkey, key1, key2,…key N) :求差集并将差集保存到dstkey的集合 smembers(key) :返回名称为key的set的所有元素 srandmember(key) :随机返回名称为key的set的一个元素

6、对zset(sorted set)操作的命令 zadd(key, score, member):向名称为key的zset中添加元素member,score用于排序。如果该元素已经存在,则根据score更新该元素的顺序。 zrem(key, member) :删除名称为key的zset中的元素member zincrby(key, increment, member) :如果在名称为key的zset中已经存在元素member,则该元素的score增加increment; 否则向集合中添加该元素,其score的值为increment zrank(key, member) :返回名称为key的zset(元素已按score从小到大排序)中member元素的rank(即index,从0开始), 若没有member元素,返回“nil” zrevrank(key, member) :返回名称为key的zset(元素已按score从大到小排序)中member元素的rank(即index,从0开始), 若没有member元素,返回“nil” zrange(key, start, end):返回名称为key的zset(元素已按score从小到大排序)中的index从start到end的所有元素 zrevrange(key, start, end):返回名称为key的zset(元素已按score从大到小排序)中的index从start到end的所有元素 zrangebyscore(key, min, max):返回名称为key的zset中score >= min且score <= max的所有元素 zcard(key):返回名称为key的zset的基数 zscore(key, element):返回名称为key的zset中元素element的 score zremrangebyrank(key, min, max):删除名称为key的zset中rank >= min且rank <= max的所有元素 zremrangebyscore(key, min, max) :删除名称为key的zset中score >= min且score <= max的所有元素 zunionstore / zinterstore(dstkeyN, key1,…,keyN, WEIGHTS w1,…wN, AGGREGATE SUM|MIN|MAX):对N个zset求并集和交集, 并将最后的集合保存在dstkeyN中。对于集合中每一个元素的score,在进行AGGREGATE运算前,都要乘以对于的WEIGHT参数。 如果没有提供WEIGHT,默认为1。默认的AGGREGATE是SUM,即结果集合中元素的score是所有集合对应元素进行SUM运算的值,而MIN和MAX是指, 结果集合中元素的score是所有集合对应元素中最小值和最大值。

7、对Hash操作的命令 hset(key, field, value):向名称为key的hash中添加元素field<—>value hget(key, field):返回名称为key的hash中field对应的value hmget(key, field1, …,field N):返回名称为key的hash中field i对应的value hmset(key, field1, value1,…,field N, value N):向名称为key的hash中添加元素field i<—>value i hincrby(key, field, integer):将名称为key的hash中field的value增加integer hexists(key, field):名称为key的hash中是否存在键为field的域 hdel(key, field):删除名称为key的hash中键为field的域 hlen(key):返回名称为key的hash中元素个数 hkeys(key):返回名称为key的hash中所有键 hvals(key):返回名称为key的hash中所有键对应的value hgetall(key):返回名称为key的hash中所有的键(field)及其对应的value

8、持久化 save:将数据同步保存到磁盘 bgsave:将数据异步保存到磁盘 lastsave:返回上次成功将数据保存到磁盘的Unix时戳 shundown:将数据同步保存到磁盘,然后关闭服务

9、远程服务控制 info:提供服务器的信息和统计 monitor:实时转储收到的请求 slaveof:改变复制策略设置 config:在运行时配置Redis服务器

redis操作手册下载:php-redis中文帮助手册

相关文章: Redis几个认识误区

Leave a Reply

(will not be published)