Redis自学笔记:4.4进阶-消息通知
4.4消息通知
4.4.1任务队列
传递任务的队列.与任务队列进行交互的实体有两类,一类是生产者,一类是消费者.
生产者将需要处理的任务放入任务队列中,二消费者不断从任务队列中读入任务
信息并执行.
优点:
- 松耦合
生产者和消费者无需知道彼此实现的细节 - 易于扩展
消费者可以有多个,而且可以分布在不同服务器
4.4.2使用redis实现任务队列
3.4.2节中的lpush和rpop|lpop命令可以实现队列概念,伪代码:
# 无线循环读取任务队列的内容
loop
$task = rpop queue
if $task
# 如果任务队列中有任务则执行
execute
else
# 如果没有则等待1秒避免频繁请求数据
wait 1 second
缺点:当任务队列中没有任务时,消费者美妙都会调用一次rpop
brpop|blpop命令和rpop|lpop命令相似,唯一区别是当列表没有元素时
brpop|blpop命令会一直阻塞住连接,直到新元素加入.伪代码如下:
loop
# 如果队列中没有新任务,brpop命令会一直阻塞
$task = brpop queue,0
#返回值是一个数组,数组第二个元素使我们需要的任务
execute($task[1])
brpop|blpop命令接收两个参数,第一个是键名,第二个是超时间,单位是秒.
当超时了没有获得新元素就会返回nil.当获得第一个元素后brpop|blpop
命令就会返回两个值,分别是键名和元素值.
客户端1:
127.0.0.1:6379> lpush lfoo 1 2
2
127.0.0.1:6379> brpop lfoo 0
lfoo
1
127.0.0.1:6379> brpop lfoo 0
lfoo
2
127.0.0.1:6379> brpop lfoo 0
lfoo
新开客户的0
(61.54s)
客户端2:
127.0.0.1:6379> lpush lfoo 新开客户的0
1
4.4.3优先级队列
brpop|blpop命令可以同时接收多个键,其完整的命令格式为
blpop|blpop key [key ...] timeout
如blpop queue:1 queue:2 0
意义是同时检测多个键.如果所有键都没有元素则阻塞.如果其中一个键有元素则会
从该键中弹出元素.
如果多个键都有元素则从左到右的顺序取键中的第一个元素.
127.0.0.1:6379> lpush lfoo lfoo_1 lfoo_2
2
127.0.0.1:6379> lpush lbar lbar_1 lbar_2
2
127.0.0.1:6379> brpop lfoo lbar 0
lfoo
lfoo_1
127.0.0.1:6379> brpop lfoo lbar 0
lfoo
lfoo_2
127.0.0.1:6379> brpop lfoo lbar 0
lbar
lbar_1
127.0.0.1:6379> brpop lfoo lbar 0
lbar
lbar_2
借此特性可以实现区分优先级的任务队列.我们分别使用queue:confirmation.email
和queue:notification.email两个键存储发送确认邮件和通知邮件两种任务,
然后消费者的代码为:
loop
$task =
brpop queue:confirmation.email,
queue:notification.email,
0
execute($task[1])
这样一旦发送邮件的任务被加入到que:confirmation.email队列中,无论
queue:notification.email还有多少任务,消费者都会优先完成发送确认邮件
的任务
4.4.4"发布/订阅"模式
该模式中包含两种角色,分别是发布者和订阅者.订阅者可以订阅一个或多个频道,而发
步者可以向指定的频道发送消息,所有订阅此频道的订阅者都会收到此消息.
发布者发布消息的命令是 publish,用法是
publish channel message
- 返回值是接收这条消息的订阅者数量.
订阅频道的命令是 subscribe,可以同时订阅多个频道,用法是
subscribe channel [channel ...]
客户端1:
127.0.0.1:6379> subscribe channel_1 channel_2
subscribe
channel_1
1
subscribe
channel_2
2
message
channel_1
早上好
message
channel_2
中午好
客户端2:
127.0.0.1:6379> publish channel_1 早上好
1
127.0.0.1:6379> publish channel_2 中午好
1
进入订阅状态后客户端可能收到3中类型回复:
- subscriba.表示订阅成功的反馈信息.第二个值是订阅成功的频道名称,
第三个值是当前客户端订阅频道数量. - message.表示接收到道的消息.第二个值表示产生消息的频道名称.第三
个值是消息内容. - unsubscriba.表示成功取消订阅某个频道.第二个值是对应的频道名称,
第三个值是当前客户端订阅的频道数量,当此值为0时客户端会退出订阅
状态,之后就可以执行其他非"发布/订阅"模式的命令了.
4.4.5按照规则订阅
psubscribe命令订阅指定的规则.规则支持glob风格通配符格式(3.1节).
客户端1:
127.0.0.1:6379> psubscribe channel_?*
psubscribe
channel_?*
1
pmessage
channel_?*
channel_1
早上好
pmessage
channel_?*
channel_2
中午好
pmessage
channel_?*
channel_3
下午好
客户端2:
127.0.0.1:6379> publish channel_1 早上好
1
127.0.0.1:6379> publish channel_2 中午好
1
127.0.0.1:6379> publish channel_3 下午好
1
- 使用psubscribe命令可以重复订阅一个频道.但是收到的消息类型可能不同.
punsubscribe命令可以退订指定规则.
4.5管道
远程客户端和redis服务端使用TCP协议连接.
redis的底层通信协议对管道提供了支持.通过管道可以一次性发送多条命令并在执行
完后一次性将结果返回,当一组命令中每条命令都不依赖于之前命令的执行结果时,
就可以将这组命令一起通过管道发出.管道通过减少客户端与redis的通信次数来
实现降低往返时延累计值的目的.
4.6节省空间
4.6.1精简键名和键值
精简键名和键值是最直观的减少内存占用的方式.
- 不能单纯为了节约空间使用不易理解的键名.这样不易维护,还容易造成命名冲突.
4.6.2内部编码优化
redis为每种数据提供了两种内部编码方式.
查看一个键的内部编码方式: object encoding key
127.0.0.1:6379> object encoding book
ziplist
表4-2每个数据类型可能采用两种内部编码方式之一来存储
| 数据类型 | 内部编码方式 | object encoding命令结果 |
|---|---|---|
| 字符串 | REDIS_ENCODING_RAW | raw |
| - | REDIS_ENCODING_INT | int |
| - | REDIS_ENCODING_EMBSTR | embstr |
| 散列类型 | REDIS_ENCODING_HT | hashtable |
| - | REDIS_ENCODING_ZIPLIST | ziplist |
| 列表类型 | REDIS_ENCODING_LINKEDLIST | linkedlist |
| - | REDIS_ENCODING_ZIPLIST | ziplist |
| 集合类型 | REDIS_ENCODING_HT | hashtable |
| - | REDIS_ENCODING_INTSET | intset |
| 有序集合类型 | REDIS_ENCODING_SKIPLIST | skiplist |
| - | REDIS_ENCODING_ZIPLIST | ziplist |
Redis自学笔记:4.4进阶-消息通知的更多相关文章
- Redis自学笔记:4.1进阶-事务
第4章:进阶 4.1事务 4.1.1概述 redis中的事务是一组命令的集合 事务同命令一样都是redis的最小执行单位,一个事务中的命令要么都执行, 要么都不执行 事务的原理是先将一个事务的命令发送 ...
- Redis自学笔记:4.3进阶-排序
4.3排序 4.3.1有序集合的集合操作 有序集合没有zinter和zunion命令,使用其他命令实现方法: multi zinterstore tempKey ... zrange tempKey ...
- Redis自学笔记:4.2进阶-过期时间
4.2过期时间 **4.2.1命令介绍* 在redis中使用 expire 命令设置一个键的过期时间后redis会自动删除它. expire key seconds (seconds单位是秒,必须是整 ...
- Redis系列二之事务及消息通知
一.事务 Redis中的事务是一组命令的集合.一个事务中的命令要么都执行,要么都不执行. 1.事务简介 事务的原理是先将一个事务的命令发送给Redis,然后再让Redis依次执行这些命令.下面看一个示 ...
- Redis自学笔记:1.简介
博主教材:李子骅.人民邮电出版社.<redis入门指南> 博主操作系统系统:虚拟机Ubuntu16.04 博主redis版本:3.0.6 第1章:简介 redis是一个开源的.高性能的.基 ...
- odoo开发笔记--字段追踪,消息通知机制
odoo有着强大的消息记录.通知机制: 实际开发中,常常会有客户的需求,页面上form视图中的某些字段不允许反复修改, 假如有的用户修改了,恶意搞坏,往往容易给公司利益造成损失,或破坏,那么如何有效的 ...
- Redis自学笔记:5.实践
第5章实践 5.3 python与redis 5.3.1安装 pip install redis 5.3.2使用方法 自己补充内容:Ubuntu下redis开启远程连接 打开redis配置:sudo ...
- Redis自学笔记:3.6入门-有序集合类型
3.6有序集合类型 3.6.1介绍 在集合类型基础上,为集合中每个元素都关联了一个分数,故可以获得 分数最高(最低)的前N个元素,可以获得指定范围内的元素等 有序集合中每个元素不同,但它们的分数却可以 ...
- Redis自学笔记:3.5入门-集合类型
3.5集合类型 3.5.1介绍 在集合中的每个元素都是不同的,且没有顺序 表3-4集合类型和列表类型的对比 - 集合类型 列表类型 存储内容 至多232-1个字符串 至多232-1个字符串 有序性 否 ...
随机推荐
- 使用Flink实现索引数据到Elasticsearch
使用Flink实现索引数据到Elasticsearch 2018-07-28 23:16:36 Yanjun 使用Flink处理数据时,可以基于Flink提供的批式处理(Batch Proce ...
- 2019南昌邀请赛网络预选赛 J.Distance on the tree(树链剖分)
传送门 题意: 给出一棵树,每条边都有权值: 给出 m 次询问,每次询问有三个参数 u,v,w ,求节点 u 与节点 v 之间权值 ≤ w 的路径个数: 题解: 昨天再打比赛的时候,中途,凯少和我说, ...
- G1 垃圾收集器入门
最近在复习Java GC,因为G1比较新,JDK1.7才正式引入,比较艰难的找到一篇写的很棒的文章,粘过来mark下.总结这篇文章和其他的资料,G1可以基本稳定在0.5s到1s左右的延迟,但是并不能保 ...
- 第二节:比较DateTime和DateTimeOffset两种时间类型并介绍Quartz.Net中用到的几类时间形式(定点、四舍五入、倍数、递增)
一. 时间的类型 1. 背景 这里为什么要介绍时间类型呢,明明是定时调度篇,原因是在定时任务中,任务什么时间开始执行,什么时间结束执行,要用到各种各样的时间模式,虽然这不能算是一个复杂的问题,但在正式 ...
- Python面向对象进阶和socket网络编程-day08
写在前面 上课第八天,打卡: 为什么坚持?想一想当初: 一.面向对象进阶 - 1.反射补充 - 通过字符串去操作一个对象的属性,称之为反射: - 示例1: class Chinese: def __i ...
- SqlServer 语法
四. Ranking 排序与排名是我们最为常用的统计方式,比如对班级的学生根据成员进行排名,或者按照成绩高低把学生划分成若干梯队:比如最好成绩的10名学生属于第一梯队,后10名又 ...
- @ReponseBody返回的json中文乱码-遁地龙卷风
我在mvc配置文件中加上下面这个配置就好了 <mvc:annotation-driven></mvc:annotation-driven>,需要在开头引用如下命名空间xmlns ...
- DeepLearning.ai学习笔记(五)序列模型 -- week2 序列模型和注意力机制
一.基础模型 假设要翻译下面这句话: "简将要在9月访问中国" 正确的翻译结果应该是: "Jane is visiting China in September" ...
- 关于sniff函数的一个小坑
最近在用scapy模块写一个关于WiFi的脚本时用到sniff函数,其中遇到了一个小坑,记录如下: sniff函数是在指定网卡上每次嗅探到一个数据包后然后将它传给prn指定的函数.
- [dts]Device Tree机制【转】
转自:https://www.cnblogs.com/aaronLinux/p/5496559.html 转自:http://blog.csdn.net/machiner1/article/detai ...