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
- Redis基础教程四
- redis基础教程
- Redis基础教程
- Redis基础教程一
- Redis基础教程二
- Redis基础教程三
- redis基础教程学习笔记
- Redis入门基础教程
- HTML 基础教程(四)
- git基础教程四
- Ant 基础教程(四)
- Axure8.0基础教程 四
- 学习java基础教程收获四
- GT-Grid 1.0 基础教程(四)
- python基础教程学习笔记四
- PLSQL 基础教程 四 分组查询
- 《SQL基础教程》笔记(四)
- 四、 基础教程-图表主要组成
- [FAQ17700]cct2.0 常见问题总结
- java提高篇(二)-----理解java的三大特性之继承
- EF 配置 (Sql Server, MySql)
- 23条前端性能优化,看懂就够了!
- GitHub尝鲜(一)
- Redis基础教程四
- 数字三角形问题(动态规划)
- Material Design学习之 Camera
- Visual Studio原生开发的10个调试技巧
- [FAQ07639][Camera Tuning]MT6589 CCT问题总结以及新issue反馈时需提供的信息
- 如何通过最大用户并发数来确定系统最大用户数
- Redis客户端连接异常:Could not get resource from the pool 解决办法
- SAP crm webui 搜索问题:BSP_DLC_DELETE_PERSONALIZATION 清除个性化设置
- linux使用技巧积累