事务
redis中的事务(transaction)是一组命令的集合。
事务同命令一样都是redis的最小执行单位。
事务的原理:先将属于一个事务的命令发送给redis,然后再让redis依次执行这些命令。
例如:
MULTI
SADD ...
...
EXEC
WATCH
可以监控一个或多个键,一旦其中一个键被修改(或删除),之后的事务就不会执行。监控一直持续到EXEC命令(事务中的命令是在EXEC之后才执行的,所以在MULTI命令之后可以修改WATCH监控的键值)
过期时间
EXPIRE命令,设置一个键的过期时间,到时间后redis会自动删除它。EXPIRE key seconds 单位是秒。
TTL命令,一个键还有多久被删除,返回值是键的剩余时间(单位是秒);当键不存在时返回-2;没有为键设置国过期时间(即永久存在,这是建立一个键后的默认情况),返回-1。
redis>SET foo bar
ok
redis>EXPIRE foo 20
(integer)1
redis>TTL foo
(integer)15
redis>TTL foo
(integer)7
redis>TTL foo
(integer)-2
PERSIST命令,取消键的过期时间设置(即将键恢复成永久的)。如果过期时间被成功清楚则返回1,否则返回0(因为键不存在或键本来就是永久的)。使用SET或GETSET命令为键复赋值也会同时清除键的过期时间。
redis>SET foo bar
ok
redis>EXPIRE foo 20
(integer)1
redis>PERSIST foo
(integer)1
redis>TTL foo
(integer)-1
PEXPIRE命令,更精确的控制键的过期时间,单位毫秒。
PEXPIRE key 1000 等价于 EXPIRE key 1
PTTL命令,以毫秒为单位返回键的剩余时间。
如果使用WATCH命令监测了一个拥有过期时间的键,该键时间到期后自动删除,并不会被WATCH命令认为该键被改变。
EXPIREAT命令,使用Unix时间作为第二个参数表示键的过期时刻。
缓存
修改配置文件的maxmemory参数,限制redis最大可用内存大小(单位是字节),当超出这个限制时,redis会依据maxmemory-policy参数指定的策略来删除不需要的键直到redis占用的内存小于指定内存。
redis支持的淘汰键的规则如下:
volatile-lru 使用LRU算法删除一个键 (只对设置了过期时间的键)
allkey-lru 使用LRU算法删除一个键
volatile-random 随机删除一个键 (只对设置了过期时间的键)
allkeys-random 随机删除一个键
volatile-ttl 删除过期时间一个最近的键
noeviction 不删除键,只返回错误
排序
SORT命令,可以对列表类型、集合类型、有序集合类型键进行排序。对有序集合类型排序时h会忽略元素的分数,只针对元素自身的值进行排序。例如:
reis>ZADD myzset 50 2 40 3 20 1 60 5
(integer)4
redis>SORT myzset
1)"1"
2)"2"
3)"3"
4)"5"
SORT命令的 ALPHA参数 实现字典顺序排列非数字元素。
SORT命令的 DESC命令降序排列。
limit offset count,跳过前offset个元素并获取之后的count个元素。
BY参数,语法为BY参考键,可以是字符串类型键或者散列类型键的某个字段(表示为 键名->字段名)。如果提供了BY参数,SORT命令将不再依据元素自身的值进行排序,而是对每个元素使用元素的值替换参考键中的第一个"*"并取其值,然后依据该值对元素排序。
参考键还可以是字符串类型,
redis>LPUSH sortbyist 2 1 3
(integer)3
reis>SET itemscore:1 50
ok
reis>SET itemscore:2 100
ok
reis>SET itemscore:3 -10
ok
redis>SORT sortbyist BY itemscore:* DESC
1)"2"
2)"1"
3)"3"
当参考键名不包含"*"时(即常量键名,与元素值无关),SORT命令将不会执行排序操作。如果几个元素额参考键值相同,则会再比较元素本身的值排序。
redis>LPUSH sortbyist 4
(integer)4
reis>SET itemscore:4 50
ok
redis>SORT sortbyist BY itemscore:* DESC
1)"2"
2)"4"
3)"1"
4)"3"
示例中元素"4"的参考键值itemscore:4的值和元素"1"的参考键itemscore:1的值都是50,所以SORT命令会再比较"4"和"1"本身的大小来决定二者的顺序。
当某个元素的参考键不存在时,默认参考键的值为0:
redis>LPUSH sortbyist 5
(integer)4
redis>SORT sortbyist BY itemscore:* DESC
1)"2"
2)"4"
3)"1"
4)"5"
5)"3"
注意:参考键虽然支持散列类型,但是"*"只能在"->"符号前面(即键名部分)才有用,在"->"后(即字段名部分)会被当成字段名本身而不会作为占位符被元素的值替换,即常量键名。
GET参数,使SORT命令的返回结果不再是元素自身的值,而是GET参数中指定的键值。支持字符串和散列类型的键,并使用"*"作为占位符。一个SORT命令中可以有多个GET参数。GET # 会返回元素本身的值。
STORE参数,保存排序结果。
性能优化
SORT命令的时间复杂度是O(n+mlog(m)),其中n表示要排序的列表中的元素个数,m表示要返回的元素个数,redis在排序前会建立一个长度为n^4的容器来存储排序的元素。
1.尽可能减少待排序键中元素的数量(使N尽可能小)
2.使用limit参数只获取需要的数据(使M尽可能小)
3.如果要排序的数据数量较大,尽可能使用STORE参数将结果缓存。
消息通知
BRPOP命令与RPOP命令相似,唯一的区别是当列表中没有元素时BRPOP命令会一直阻塞,直到有新元素加入。BRPOP命令接受两个参数,第一个是键名,第二个是超时时间,单位是秒。当超过了此时间仍然没有获得新元素的话 会返回nil。超时时间为"0",表示不限制等待的时间,即如果没有新元素 加入列表 就会永远阻塞下去。
BRPOP命令可以同时接受多个键,BRPOP key [key ...] timeout
“发布/订阅”模式
发布者和订阅者,订阅者可以订阅一个或若干个频道(channel),而发布者可以向指定频道发送消息,所有订阅此频道的订阅者都会收到此消息。
PUBLISH channel message
SUBSCRIBE channel [channel ...]
UNSUBSCRIBE channel [channel ...]
按照规则订阅
除了使用SUBSCRIBE命令订阅指定名称的频道外,还可以使用PSUBSCRIBE 命令订阅指定的规则。PUNSUBSCRIBE 退订。