Redis基础教程四

一.事务

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值