一.事务
1.redis事务是一组命令集合,也同命令一样是最小执行单位,事务原理是先将一个事务的命令发给redis,然后再让redis依次执行这些命令。事务在执行的期间不会主动中断 —— 服务器在执行完事务中的所有命令之后, 才会继续处理其他客户端的其他命令。如:
redis> multi
OK
redis> sadd name1 123
QUEUED
redis> sadd name2 234
QUEUED
redis> exec
1)(integer)1
2)(integer)1
上面首先使用multi告诉redis,下面的命令是属于同一个事务,先暂存起来不要执行,所以返回QUEUED表示命令已经进入等待执行的事务队列,当执行exec,就执行事务队列的命令。
2.错误处理
当一个事务中的某个命令执行出错,redis会怎么处理呢?
当遇到的是语法错误时:
redis> multi
redis> set key value // 命令1
redis> set key // 命令2 这里语法错误
redis> exec
上面事务 会执行失败,因为命令2发生语法错误,最终导致命令1也不执行。
当遇到的是运行时错误时:
redis> multi
redis> set key 1
redis> sadd key 2 //这里发生运行错误,key是string类型的不能作为集合操作。
redis> set key 3
redis> exec
redis事务没有关系型数据库的回滚功能。所以上面的命令3依然会正确执行。
二.WATCH命令
WATCH 命令用于在事务开始之前监视任意数量的键: 当调用 EXEC 命令执行事务时, 如果任意一个被监视的键已经被其他客户端(注意这里是其它客户端)修改了, 那么整个事务不再执行, 直接返回失败。
下面给出个执行失败的例子:
redis> WATCH name
OK
redis> MULTI
OK
redis> SET name peter
QUEUED
redis> EXEC
(nil)
以下执行序列展示了上面的例子是如何失败的:
时间 客户端 A 客户端 B
T1 WATCH name
T2 MULTI
T3 SET name peter
T4 SET name john
T5 EXEC
在时间 T4 ,客户端 B 修改了 name 键的值, 当客户端 A 在 T5 执行 EXEC 时,Redis 会发现 name 这个被监视的键已经被修改, 因此客户端 A 的事务不会被执行,而是直接返回失败。
三.生存时间
1.redis中可以用expire来设置键的生存时间,超时后redis自动删除键。返回1表示设置成功,0表示键不存在或者设置失败
redis> set name 111
redis> expire name 900 // 900 秒
2.ttl 查看键的神剩余时间(单位:秒),当键不存在了返回-1
redis> ttl name
3.persist 取消键的生成时间设置(将键变成永久的),成功返回1否则0
四.任务队列
一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式。利用redis这两种场景的消息队列都能够实现。
生产者消费者模式:生产者生产消息放到队列里,多个消费者同时监听队列,谁先抢到消息谁就会从队列中取走消息;即对于每个消息只能被最多一个消费者拥有。
发布者订阅者模式:订阅者可以订阅一个或若干频道(channel),而发布者可以向指定的频道发送消息,所有订阅此频道的订阅者都会收到此消息。
1.生产者消费者
brpop(blpop)命令 接受两个参数,第一个是键名,第二个是超时时间(秒)。当超过了任然没有获得新元素就会返回nil。若把时间设为0,则永久等待,直到队列中有数据了。
我们来打开两个redis客户端来模仿下:
redis A> brpop queue 0 //如果queue有数据就会立马返回否则会一直阻塞,直到另一个客户端向列表queue加入数据。
redis B> lpush queue aaa //向列表中添加数据 , 此时会唤醒redisA客户端并且pop掉了列表中的数据 aaa 。
redis B> llen queue // 结果为 0
2.发布/订阅模式
publish : 发布者发布消息。
redis> publish channel1 hello //向channel1频道发布 hello,返回值是接收到hello的订阅者数量。
subscribe : 订阅,可同时订阅多个频道。
下面看个实例:
redis A> subscribe channel1 // 订阅channel1 通道,然后就一直阻塞到这里。
redis B> publish channel1 helloword //会导致redisA返回一个helloword字符串,然后redisA继续阻塞,监听下个。
今天先到这,持续更新…
老生常谈:深圳有爱好音乐的会打鼓(吉他,键盘,贝斯等)的程序员和其它职业可以一起交流加入我们乐队一起嗨。我的QQ:657455400