使用Node.js和Redis实现push服务--转载
出处:http://blog.csdn.net/unityoxb/article/details/8532028
push服务是一项很有用处的技术,它能改善交互,提升用户体验。要实现这项服务通常有两种途径,轮询和长连接。轮询就是客户端每隔一段时间就问服务器拿新数据,实现起来很简单但是服务器压力很大,而且大部分请求因为没有新数据都显得很浪费。长连接则是服务器将一个请求挂起,不输出任何内容,直到有新数据产生后才会完成这个请求,浏览器收到响应后则马上再发一个又让服务器挂住,如此反复。这么做的好处是能节省很多无用的请求,但是它不能使用传统的服务端软件,比如apache和php-fpm,客户端多了的话很容易把所有进程占光,这样服务器就没法响应新的请求了。
Node.js让这一切变得简单,它是基于事件和非阻塞I/O的服务器技术,能使用极少的资源响应大量并发的请求,非常适合长连接的要求。但是这样做还存在两个问题。首先你的服务端通常是用另外一套语言和框架做的,有成熟的代码和业务逻辑,为了实现这个push功能,难道又要用javascript来写一套吗?维护起来不嫌麻烦?其次,服务端把请求挂起后,也是不断地重复调用其它服务来获取新数据,这不过是把轮询的代码换个位置而已,本质上没区别,对服务器一样有压力。
有没有什么简单的办法来实现高效的push呢?
答案是有,而且很简单,所需代码不超过20行!
首先我们借助Redis的Pub/Sub功能来实现真正的push,其次用JSON来作为客户端和服务端沟通的数据格式。
当Node.js收到请求后,我们将请求挂起,同时实例化一个Redis客户端,并根据请求里的参数来收听一个特定的频道,原有的服务端代码(比如PHP)处理完业务逻辑后,将新数据用JSON封装下发布到这个频道,Node.js收到消息后将其作为响应传给客户端,这样就完成了一次push。代码如下:
- var http = require('http');
- var url = require('url');
- var redis = require('redis');
- http.createServer(function (req, res) {
- var query = url.parse(req.url, true).query;
- if(typeof query.channel == 'undefined'){
- res.writeHead(200, {'Content-Type': 'text/plain'});
- res.end('Invalid Request\n');
- }else{
- var client = redis.createClient(6379, '127.0.0.1');
- client.subscribe(query.channel);
- client.on('message', function(channel, message){
- res.writeHead(200, {'Content-Type': 'application/json'});
- res.end(message);
- client.unsubscribe();
- client.end();
- });
- }
- }).listen(1337, '127.0.0.1');
这个方法简单易用,你只需要定好一个频道和数据关系的协议,然后对现有代码做些简单修改,就能实现一个高效的push服务了!
使用Node.js和Redis实现push服务--转载的更多相关文章
- node.js中ws模块创建服务端和客户端,网页WebSocket客户端
首先下载websocket模块,命令行输入 npm install ws 1.node.js中ws模块创建服务端 // 加载node上websocket模块 ws; var ws = require( ...
- 在centos7中安装redis,并通过node.js操作redis
引言 最近在学习node.js 连接redis的模块,所以尝试了一下在虚拟机中安装cent OS7,并安装redis,并使用node.js 操作redis.所以顺便做个笔记. 如有不对的地方,欢迎大家 ...
- node.js应用Redis数据库
node.js下使用Redis,首先: 1.有一台安装了Redis的服务器,当然,安装在本机也行 2.本机,也就是客户端,要装node.js 3.项目要安装nodejs_redis模块 注意第 3 点 ...
- Node.js调用百度地图Web服务API的Geocoding接口进行点位反地理信息编码
(从我的新浪博客上搬来的,做了一些修改.) 最近迷上了node.js以及JavaScript.现在接到一个活,要解析一个出租车点位数据的地理信息.于是就想到使用Node.js调用百度地图API进行解析 ...
- node.js中net网络模块TCP服务端与客户端的使用
node.js中net模块为我们提供了TCP服务器和客户端通信的各种接口. 一.创建服务器并监听端口 const net = require('net'); //创建一个tcp服务 //参数一表示创建 ...
- node.js使用redis储存session(详细步骤)
转储session的原因 网上有许多session需要用数据库储存的原因,对我来说原因很简单,仅仅只是node的生产环境不允许将session存到服务器的内存中.会报一个内存溢出的风险警告.所以我决定 ...
- node.js应用Redis初步
node.js下使用Redis,首先: 1.有一台安装了Redis的服务器,当然,安装在本机也行 2.本机,也就是客户端,要装node.js 3.项目要安装nodejs_redis模块 注意第 3 点 ...
- 在 Node.js 上调用 WCF Web 服务
摘要:有时我们需要在WCF中做一些复杂数据处理和逻辑判断等,这时候就需要在NodeJS中调用WCF服务获取数据,这篇文件介绍如何在Node中调用WCF服务获取数据. Node项目中调用WCF服务获取数 ...
- [Node.js]操作redis
摘要 在实际开发中,免不了要操作mysql,mongodb,redis等数据存储服务器.这里先简单介绍如何操作redis. 一个例子 关于redis服务端的安装这里不再介绍,重点不在这里.感兴趣的可以 ...
随机推荐
- Unity3D ShaderLab 立方体图的菲涅尔反射
Unity3D ShaderLab 立方体图的菲涅尔反射 菲涅尔反射是反射类型中比较常见的一种类型,当我们的视线正对物体表面,那么反射量会明显增加, 我们几乎可以在任何支持反射类型的物体表面看到这种情 ...
- 为什么web标准中无法设置IE浏览器滚动条颜色了?
<!doctype html><html> <head> <meta charset="UTF-8"> <meta name= ...
- [转]iOS游戏如何防御外挂及IAP破解
http://www.j1f3.com/news/game/21371.html 今年3月初写过一篇<iO平台游戏安全小议>,到现今已有7个月了.在这段时间内,iOS平台上的安全问题也产生 ...
- sql2008+vs2008安装心得以及详细教程分享
第一步,我把原来装的vs2005+sql2005全部卸载了 第二步,下载VS2008同时下载sql2008: 第三步,开始安装VS2008专业版,网上有很多给出了微软的地址,在这里我也贴一个吧 htt ...
- 编程之美的2.17,数组循环移位 & 字符串逆转(反转) Hello world Welcome => Welcome world Hello
代码如下:(类似于编程之美的2.17,数组循环移位) static void Main(string[] args) { string input = "Hello World Welcom ...
- nginx php-cgi php
/*************************************************************************** * nginx php-cgi php * 说 ...
- eclipse关联源码 Failed to create the part's controls
在eclipse中关联源码时: 1.出现Failed to create the part's controls错误, 2.而attach source 这个按钮却没有出现. 问题原由:eclipse ...
- 使用jQuery设置disabled属性与移除disabled属性
Readonly只针对input和textarea有效,而disabled对于所有的表单元素都有效,下面为大家介绍下使用jQuery设置disabled属性 表单中readOnly和disable ...
- Android模仿QQ空间图片上传——原理
MainActivity.class package com.example.imagedemotext; import java.io.ByteArrayOutputStream; import j ...
- spring+websocket整合
java-websocket的搭建非常之容易,没用框架的童鞋可以在这里下载撸主亲自调教好的java-websocket程序: Apach Tomcat 8.0.3+MyEclipse+maven+JD ...