科技新闻

基于redis的延迟消息队列设计

怎甘沉沦 提交于 2020-03-28 02:55:12
介绍 延迟队列,顾名思义它是一种带有延迟功能的消息队列。 那么,是在什么场景下我才需要这样的队列呢? 很多时候我们会有延时处理一个任务的需求,比如说: 2个小时后给用户发送短信。 15分钟后关闭网络连接。 2分钟后再次尝试回调。 下面我们来分别探讨一下几种实现方案: 1、Java中的DelayQueue Java中的DelayQueue位于java.util.concurrent包下,本质是由PriorityQueue和BlockingQueue实现的阻塞优先级队列。 见《 延时队列:Java中的DelayQueue 》 2、使用Redis实现 前文我们看到,可以通过优先级队列来实现延迟队列的功能。Redis提供了很多数据结构,其中的zset是一种有序的数据结构;我们可以通过Redis中的zset来实现一个延迟队列。 基本的方法就是使用时间戳作为元素的score存入zset。 redis> ZADD delayqueue <future_timestamp> "messsage" 获取所有已经“就绪”的message,并且删除message。 redis> MULTI redis> ZRANGEBYSCORE delayqueue 0 <current_timestamp> redis> ZREMRANGEBYSCORE delayqueue 0 <current

websocket 快速上手

对着背影说爱祢 提交于 2020-03-27 23:05:10
我知道的框架 (框架我以前很排斥,现在觉得优秀的轮子,我们不要重造了) http://socketo.me/docs http://websocketd.com/ 本文用websocketd 来快速了解webscoket 为啥需要websocket 简单的说,如果网站需要集体通知在线客户一条消息(早期论坛的消息),后端服务器(php,java等等)可以集体推送给客户。 复杂的应用当数在线聊天室。 websocketd 支持windows,linux,mac 运行 下载websocketd 下载以后 MAC 版本下载看到这些文件 CHANGES LICENSE README.md websocketd 为websocket建立服务端 官方的例子 新建一个test.sh test.sh 内容 #!/bin/bash Count from 1 to 10 with a sleep for ((COUNT = 1; COUNT <= 10; COUNT++)); do echo $COUNT sleep 0.5 done 本地启动 ./websocketd --port=8080 bash ./test.sh Fri, 27 Mar 2020 09:24:40 +0800 | INFO | server | | Serving using application : /bin/bash .

Redis存储方式及缓存淘汰策略

故事扮演 提交于 2020-03-27 20:44:54
一. Redis Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件 。 中文官方地址: http://www.redis.cn/ Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合) String (字符串) string 是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value 。 string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如 jpg 图片或者序列化的对象。 string 类型是 Redis 最基本的数据类型, string 类型的值最大能存储 512MB 。 Hash (哈希) Redis hash 是一个键值 (key=>value) 对集合。 Redis hash 是一个 string 类型的 field 和 value 的映射表, hash 特别适合用于存储对象。 List (列表) Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边) Set (集合) Redis 的 Set 是 string 类型的无序集合。 集合是通过哈希表实现的,所以添加,删除

No.014-Python-学习之路-Day11-RabbitMQ

孤人 提交于 2020-03-27 15:35:20
RabbitMQ消息队列 RabbitMQ is the most widely deployed open source message broker. RabbitMQ消息队列与threading Queue及Process Queue 1.threading Queue: 仅可实现在同一进程内的线程之间的交互; 2.进程Queue:父进程与子进程进行交互,或者同属于同一父进程下多个子进程间的交互; 3.那如何实现两个相互独立的Python进程通信呢?如果是java进程与Python进程的交互呢?->使用RabbitMQ RabbitMQ的安装-win-详细戳 这里 安装erlang->加ERLANG_HOME的用户变量->PATH中添加->%ERLANG_HOME%\bin->cmd下运行erl出现版本即成功 安装RabbitMQ->进Rabbitmq的cmd->rabbitmq-plugins.bat enable rabbitmq_management->启动rabbitmq-server.bat->登录 http://localhost:15672/ RabbitMQ在Python上的clients-详细戳 这里 实现最简单的队列通信 applications Produce Messages: Exchanges Route and Filter Messages

jmeter-脚本制作

末鹿安然 提交于 2020-03-27 14:48:38
HTTP请求 默认端口号 HTTP默认端口号:80 HTTPS默认端口:443 数据来源 通过网络抓包软件(Fiddler、Charles等)、接口文档数据 脚本制作+结果 录制脚本 badbod 录制脚本 jmeter录制 5.1 添加代理服务器————>浏览器设置代理————>进行正常操作,操作完成一轮停止录制,就可以得到录制的脚本 5.2 录制脚本的优化:先回放录制的脚本,可以正常运行;删除一些人为不需要的脚本后再次回放,可以正常运行;添加默认的HTTP消息头管理、cookie管理这些; 手写脚本优化 6.1 添加消息头管理器 6.2 添加HTTP请求默认值:把域名、IP放到默认值里,在取样器里就可以不再写这些信息;这样多个请求可以共用一个ip/端口;更换环境也更方便 6.3 自定义变量:添加一个‘用户定义的变量’ 在请求中,把参数值换成变量 6.4 用户参数:前置处理器——>用户参数 **用户参数和用户定义变量的区别: 来源: https://www.cnblogs.com/qhy-petrel/p/12576872.html

redis server学习001

雨燕双飞 提交于 2020-03-27 13:32:23
redis server学习001 一、简介: redis是使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 非关系型数据库,并提供多种语言的API。 经常会用作缓存,消息中间件的操作。 二、特点: 速度快,因为数据存在内存中 支持丰富数据类型,支持字符串,哈希表,列表,集合,有序集合 支持事务,操作都是原子性 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除 三、python3连接redis server 1、 一般连接redis情况 from redis import Redis # 实例化redis对象 r = Redis(host='localhost', port=6379, db=0, password='123456') r.set('name1', 'zhangsan1') # b'zhangsan' name1 = r.get('name1') print(name1) 这种情况连接数据库,对数据的存取都是字节类型,存取时还得转码一下,一般不推荐这种方法 2、 连接池连接redis import redis pool = redis.ConnectionPool(host='127.0.0.1', port=6379, password='123456', decode_responses=True) #

js实现HTML标题栏中新消息提示效果

陌路散爱 提交于 2020-03-27 13:13:56
js页面新消息提示 多加了一个变量isusing,默认值为false,判断是否是newMessageRemind.show()是否已运行,如果运行,不提示,否则提示。 点击document时取消提示。 <!DOCTYPE html> <html> <head> <title>js页面新消息提示</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head> <body> <input id="test" type="button" value="确定" /> <script> var isusing = false; var newMessageRemind={ _step: 0, _title: document.title, _timer: null, //显示新消息提示 show:function(){ var temps = newMessageRemind._title.replace("【   】", "").replace("【新消息】", ""); newMessageRemind._timer = setTimeout(function() { newMessageRemind.show(); newMessageRemind._step++; if

Jms Topic和Queue的比较

时光总嘲笑我的痴心妄想 提交于 2020-03-27 10:16:53
Jms规范里的两种message传输方式Topic和Queue,两者的对比如下表():   Topic Queue 概要 Publish Subscribe messaging 发布订阅消息 Point-to-Point 点对点 有无状态 topic数据默认不落地,是无状态的。   Queue数据默认会在mq服务器上以文件形式保存,比如Active MQ一般保存在$AMQ_HOME/data/kr-store/data下面。也可以配置成DB存储。 完整性保障 并不保证publisher发布的每条数据,Subscriber都能接受到。 Queue保证每条数据都能被receiver接收。 消息是否会丢失 一般来说publisher发布消息到某一个topic时,只有正在监听该topic地址的sub能够接收到消息;如果没有sub在监听,该topic就丢失了。 Sender发送消息到目标Queue,receiver可以异步接收这个Queue上的消息。Queue上的消息如果暂时没有receiver来取,也不会丢失。 消息发布接收策略 一对多的消息发布接收策略,监听同一个topic地址的多个sub都能收到publisher发送的消息。Sub接收完通知mq服务器 一对一的消息发布接收策略,一个sender发送的消息,只能有一个receiver接收。receiver接收完后,通知mq服务器已接收

php使用redis的有序集合zset实现延迟队列

落花浮王杯 提交于 2020-03-27 09:56:31
3 月,跳不动了?>>> 延迟队列就是个带延迟功能的消息队列,相对于普通队列,它可以在指定时间消费掉消息。 延迟队列的应用场景: 1、新用户注册,10分钟后发送邮件或站内信。 2、用户下单后,30分钟未支付,订单自动作废。 我们通过redis的有序集合zset来实现简单的延迟队列,将消息数据序列化,作为zset的value,把消息处理时间作为score,每次通过zRangeByScore获取一条消息进行处理。 <?php class DelayQueue { protected $prefix = 'delay_queue:' ; protected $redis = null ; protected $key = '' ; public function __construct ( $queue , $config = []) { $this -> key = $this -> prefix . $queue ; $this -> redis = new Redis (); $this -> redis -> connect ( $config [ 'host' ], $config [ 'port' ], $config [ 'timeout' ]); $this -> redis -> auth ( $config [ 'auth' ]); } public function