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)