Redis入门指南之进阶

事务

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  退订。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值