过期
EXPIRE和TTL
EXPIRE可以设定一个key的销毁时间(不需要关心value的类型):
set resource:lock "demo"
expire resource:lock 120 //设置resource:lock这个key在120秒之后被回收
EXPIREAT key unixtimestamp:设置一个key在一个指定的unix时间销毁
PERSIST key:去掉key的过期限制;
TTL可以用来查看一个key还有多少时间回收;
如果TTL返回-2代表一个KEY不存在(已经回收);
如果TTL返回-1代表一个KEY不会过期(直接用set设置的key)
如果使用set重新设置了一个KEY值,那么TTL值也会被重置;
发布和订阅
1,redis提供了一个订阅和发布消息的功能,在这个功能中,redis扮演了一个消息路由服务的功能;
2,redis的发布订阅功能是在各个客户端之间的发布/订阅;
3,常用命令:
1, SUBSCRIBE channel [channel ...] :订阅一个频道;
subscribe warnings errors =>订阅warnings和errors两个频道;
2, PUBLISH channel message :向频道中发布一条消息:
subscribe warnings 'something wrong?';
3, UNSUBSCRIBE [channel [channel ...]] :取消订阅频道,如果直接是UNSUBSCRIBE命令,则取消所有消息订阅;
4,订阅/发布的常见使用场景:
redis的订阅/发布的性能非常高,可以达到15000/秒次;非常适合用于完成实施通讯/高效的消息队列等场景;
排序
redis中提供了sort命令,可以对list,set,sortedset进行复杂的排序功能,排序的结果是一个list;
SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC|DESC] [ALPHA] [STORE destination]
几个sort的例子:
rpush nlist 2 1 4 7 2 4 6
1,SORT mylist:对mylist进行排序(从小到大);1 2 2 4 4 6 7
2,SORT mylist DESC:从大到小;7 6 4 4 2 2 1
3,SORT mylist LIMIT 0 3 :从小到大排序并截取0~3位数据;1 2 2
复杂的sort:
lpush area_users 1
set user:name:1 sky
set user:level:1 36
lpush area_users 2
set user:name:2 leo
set user:level:2 40
lpush area_users 3
set user:name:3 loo
set user:level:3 20
sort area_users:按照user的id排序;
sort area_users by user:level:*:按照user:level:id 的值去排序area_users的值;
sort area_users by user:level:* get user:name:* desc:按照user:level:id的值降序排序,并按照排序的内容去得到user:name:*中的值;
lpush wolfcode:shop:bugs 1 2 3
hset bug:1 priority 2
hset bug:1 details "this is first bug! priority is 2."
hset bug:2 priority 3
hset bug:2 details "this is second bug! priority is 3."
hset bug:3 priority 1
hset bug:3 details "this is third bug! priority is 1."
在get中,如果get的key对应的value是一个hashes
可以使用->获取hashes中的特定fields:
sort wolfcode:shop:bugs by bug:->priority get bug:->details:按照bug:中的priority字段排序watch:leto的值,并且按照排序完成的值去bug:中的hashes得到details字段值;
scan
scan 命令用于遍历 key,使用增量的方式,性能较高;
scan 的原理:在扫描之前,设置一个游标值(从0开始),并可以设置筛选 key 的模式和增量的数量(即一次要看多少条数据);遍历的结果返回一个 list ,list 第一个值代表的是下一次要进行迭代的开始的游标值(注意,这个值不是下标,就是一个用来表示内部位置的值),我们就可以使用这个游标值进行下一次增量遍历,第二个值是一个 list,表示这一次遍历得到的 key 值;
scan 0 count 3 =>
"2"
"user:level:2"
"user:name:2"
"user:name:3"
scan 2 count 3 =>
"9"
"server:version"
"user:level:3"
"area_users"
"user:name:1"
注意,如果在遍历的时候,不使用 match,那么count 一般能够控制住返回的数量,如果使用了match,结果数量不定;默认count为10;(可能返回的内容会多于count);
scan 0 match user:level:* count 3
事务
redis可以把一组操作包装在一个事务块中,让这些语句的执行具有原子性;
MULTI:代表一个事务块的开始;
EXEC :执行一个事务块中的语句,并将连接状态恢复到正常;