Redis基础教程四

来源:互联网 发布:ipad软件下载专区 编辑:程序博客网 时间:2024/04/28 08:54

一.事务

1.redis事务是一组命令集合,也同命令一样是最小执行单位,事务原理是先将一个事务的命令发给redis,然后再让redis依次执行这些命令。事务在执行的期间不会主动中断 —— 服务器在执行完事务中的所有命令之后, 才会继续处理其他客户端的其他命令。如:redis> multiOKredis> sadd name1 123QUEUEDredis> sadd name2 234QUEUEDredis> exec1)(integer)12)(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 nameOKredis> MULTIOKredis> SET name peterQUEUEDredis> EXEC(nil)以下执行序列展示了上面的例子是如何失败的:时间  客户端 A   客户端 BT1  WATCH name   T2  MULTI    T3  SET name peter   T4      SET name johnT5  EXEC在时间 T4 ,客户端 B 修改了 name 键的值, 当客户端 A 在 T5 执行 EXEC 时,Redis 会发现 name 这个被监视的键已经被修改, 因此客户端 A 的事务不会被执行,而是直接返回失败。

三.生存时间

1.redis中可以用expire来设置键的生存时间,超时后redis自动删除键。返回1表示设置成功,0表示键不存在或者设置失败redis> set name 111redis> expire name 900  // 900 秒2.ttl 查看键的神剩余时间(单位:秒),当键不存在了返回-1redis> 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

0 0
原创粉丝点击