`
Everyday都不同
  • 浏览: 723509 次
  • 性别: Icon_minigender_1
  • 来自: 宇宙
社区版块
存档分类
最新评论

redis主动向页面push数据

阅读更多

对于页面上定时刷新显示的数据,之前一直都是比较“传统”的思想——那就是“页面通过ajax请求后台,后台响应后把数据返回给前台展示,如此反复……”,而自己也从来没有过“服务端主动向页面推送数据”的概念。

现在需要用到redis的发布/订阅,页面“订阅”某一channel,服务端在某一channel“发布”内容。服务端发布后,客户端可以通过订阅实时将刚刚发布的内容展示出来。

说说我探索的解决过程吧。。从用tomcat的WebSocketServlet,但发现已经不推荐使用(废弃了,加上它必须依赖tomcat,并且前台订阅的逻辑也难以表达,所以不行;后来又想到用javax.websocket-api.jar的@ServerEndpoint,但是,还是卡住了。。因为也是难以体现redis的发布/订阅功能。

后来一直苦于用何种解决方案,这时,socket.io+redis+node.js实时聊天的例子让我眼前一亮。。

 

好了,说说我对nodejs的理解——Node是一个Javascript运行环境(runtime),就是Js的服务器,类似tomcat或weblogic是java代码的运行服务器一样。。安装nodejs之后,最新版已经带了npm,而npm是用于安装各种支持nodejs扩展的客户端的。比如你想要用到redis,就必须安装redis的nodejs客户端。把nodejs配好环境变量后,使用如下命令即可安装redis:

npm install redis

安装好后,它默认是在C:\Users\xxx\node_modules多一个redis的文件夹的,但如果你安装的nodejs不在C盘,最好是把刚刚安装的module拷贝至你安装包下的node_modules目录下。安装好后,就可以在Js中使用require('redis')了。

socket.io连接于browser和nodejs的http服务器之间,可用于二者之间同步数据。同样,它也需要通过npm命令安装。

 

解决过程如下:

编写pubsub.js作为前台页面订阅某一渠道的服务端(便与测试,我这里是把渠道写死的: var c = 'testchannel';):

 

var server = require('http').createServer(function (request, response) {
  response.writeHead(200, {'Content-Type': 'text/plain'});
  response.end('Hello World\n');
}).listen(1379);
 
var redis = require('redis');
var redisclient = redis.createClient();
 
var sub = function(c) {
    var c = 'testchannel';
    redisclient.subscribe(c, function(e) {
        console.log('subscribe channel : ' + c);
    });
}
sub();
 
console.log('Server running at http://127.0.0.1:1379/');
 
var io = require('socket.io')(server);
io.on('connection', function(socket) {
    redisclient.on('message', function(error, msg) {
        console.log('connection');
        console.log(msg);
        socket.emit('msgReceived', msg);        
    });
})

 

 

然后,定义用来显示订阅消息的前台页面:

 

<html>
<head>
<script src="F:\nodejs\node_modules\socket.io\node_modules\socket.io-client\socket.io.js"></script>
<script src="jquery-1.7.2.min.js"></script>

</head>
<body>
	<div style="width:100px; height:200px; border:1px solid red" id="show"></div>
	</script>hello world <script type="text/javascript"> 
	var div = $("#show");
	console.log("hello"); 
        var socket = io('http://localhost:1379'); 
	socket.on('connection', function() { 
		console.log('connection setup for socket.io') }); 
	socket.on('msgReceived', function(msg) {
		//alert(div.html());
		div.append(msg + "<br/>"); 
		//alert(msg);
		}) 
</script>
</body>
</html>

 页面中var socket = io('http://localhost:1379');一行是关键,它和pubsub.js中 listen(1379)里对应。表明位于本地的Nodejs服务器的1379端口,在pubsub.js里listen(1379)被监听了。

 

用任一浏览器(我这里是谷歌的),打开刚定义的前台页面。



 页面此时没内容,因为还未开启pubsub.js发起订阅请求。

OK,我们开始运行pubsub.js发起请求



 

接下来要用redis发布请求咯:

打开redis服务:



 

 再打开一客户端,向testchannel发布消息:



 

运行pubsub.js: node pubsub.js

可以看到:



 

开启一redis客户端,可看到订阅内容:



 

重点来了,页面也可显示订阅的内容:



 

同理,你在java中写发布到渠道testchannel的的代码,前台页面一样可以显示。

而你开启另外一个浏览器(比如搜狗),也是可以看到实时订阅的消息的:



 这说明,已经做到了redis主动向页面push数据,实时推送的效果。

总结:nodejs作为页面订阅的pubsub.js的运行服务端,socket.io则是类似websocket的功能,实现nodejs和浏览器之间交流的桥梁,是redis向页面推送数据的关键。另外注意nodejs用到redis和socket.io这2个module,必须要先用npm命令安装扩展。注意redis发布订阅思想在实时推送中的模型——前台页面订阅某一渠道的消息,而发布的话则是由redis来发布的。

 

  • 大小: 19.2 KB
  • 大小: 2.2 KB
  • 大小: 13.9 KB
  • 大小: 5.2 KB
  • 大小: 4.5 KB
  • 大小: 8.3 KB
  • 大小: 13.7 KB
  • 大小: 12.4 KB
6
3
分享到:
评论
1 楼 戢_时光 2015-07-05  
    
mark  并转载  好文!

相关推荐

    Redis数据导入导出以及数据迁移的4种方法详解

    Redis 数据导入导出和数据迁移是 Redis 管理中的重要环节,对于数据备份、故障恢复、集群扩展等场景有着至关重要的作用。本文将详细解析 Redis 数据导入导出的4种方法。 首先,我们来看第一种方法:使用 AOF...

    redis增删改数据

    redis增删改数据 redis增删改数据 redis增删改数据redis增删改数据 redis增删改数据

    Redis集群数据迁移操作文档

    《Redis集群数据迁移实战指南》 在IT领域,数据迁移是一项关键任务,特别是在使用Redis这样的高性能内存数据库时。本文将详细介绍如何进行Redis集群的数据迁移,包括全量和增量数据迁移,以及离线迁移的方法,主要...

    Redis数据库和可视化数据的客户端

    Redis数据库是一种开源、高性能、键值对存储系统,主要用于数据缓存、消息队列和数据库。它的设计目标是实现高速读写操作,尤其适合处理大量短生命周期的数据。Redis支持多种数据结构,包括字符串、哈希表、列表、...

    Java 实现Redis存储复杂json格式数据并返回给前端

    在Java Web开发中,利用Redis作为缓存系统可以显著提高数据获取速度,特别是当需要频繁处理和返回相同或相似的数据时。本篇文章主要探讨如何在Java中存储和检索复杂JSON格式的数据到Redis,并将其返回给前端。以下是...

    Redis实战_Redis实战中文完整版_Redis快速入门_Redis数据类型及操作_Redis常用

    2. **Redis数据类型及操作**:这是Redis的核心部分,包括五大数据类型: - **字符串(String)**:最基础的数据类型,支持设置、获取、增加、减少等操作。 - **哈希(Hash)**:用于存储键值对集合,适用于存储对象。 ...

    c++ 操作redis数据库

    在IT行业中,C++与Redis的结合使用是一个常见的实践,特别是在需要高性能数据存储和处理的场景下。Redis是一个开源的、基于内存的数据结构存储系统,它支持多种数据类型,如字符串、哈希、列表、集合、有序集合等,...

    redis2json:以JSON格式导出Redis数据

    例如: ./redis_to_json.py | gzip &gt; redis_backup.json.gz这对于您正在使用但又不想丢失数据的应用程序也很不错,因为Redis RDB文件并不总是那么方便。注意事项和注意事项u()中的Unicode支持仅适用于Python2.x。...

    Redis基础架构与数据类型 Redis键值操作与命令 Redis字符串与列表数据结构 Redis哈希与集合数据结构

    Redis基础架构与数据类型 Redis键值操作与命令 Redis字符串与列表数据结构 Redis哈希与集合数据结构 Redis排序集合与使用场景 Redis持久化策略与RDB Redis持久化策略与AOF Redis主从复制与集群配置 Redis事务与Lua...

    如何高效地向Redis插入大量的数据(推荐)

    最近有个哥们在群里问,有一个日志,里面存的是IP地址(一行一个),如何将这些IP快速导入到Redis中。 我刚开始的建议是Shell+redis客户端。 今天,查看Redis官档,发现文档的首页部分...

    java 对Redis的导入和导出

    在Java开发中,Redis作为一个高性能的键值存储系统,常被用作缓存或数据库,其数据操作便捷高效。为了在不同的服务器之间迁移或者备份Redis中的数据,我们需要实现数据的导入与导出功能。本篇将详细介绍如何使用Java...

    redis 缓存技术学习笔记

    这些数据类型支持原子性的操作,例如push/pop、add/remove以及集合间的交集、并集和差集等运算。 - **数据排序**:除了基本的数据管理功能之外,Redis还支持对数据进行排序,可以根据不同的需求对数据进行灵活的...

    memcached数据完整迁移到redis

    标题 "memcached数据完整迁移到redis" 描述的是一个数据迁移的过程,从使用 memcached 存储的数据转换到使用 redis 存储。这个过程在 IT 领域中是常见的,因为不同的缓存系统有不同的特性和优势。让我们深入探讨这个...

    redis存储二进制数据测试代码

    Redis,作为一个高性能的键值对数据存储系统,不仅支持简单的字符串、整数和浮点数等数据类型,还能够处理二进制数据。在实际应用中,存储和处理二进制数据是常见的需求,比如图片、音频、视频的元数据或者数据库的...

    PHP+Redis 实例 页面缓存

    Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal...

    基于springboot+echarts+redis实现的数据分析及可视化系统源码+项目说明.zip

    1、基于springboot+echarts+redis实现的数据分析及可视化系统源码+项目说明.zip 2、该资源包括项目的全部源码,下载可以直接使用! 3、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目...

    redis可视化客户端工具

    RedisClient将redis数据以资源管理器的界面风格呈现给用户,可以帮助redis开发人员和维护人员方便的建立,修改,删除,查询redis数据,完全不需要了解redis命令。可以让用户方便的编辑数据,可以剪切,拷贝,粘贴...

    Redis桌面管理工具(数据可视化):Another-Redis-Desktop-Manager(Windows)

    Redis是一款高性能的键值对数据库,常用于数据缓存、消息队列以及持久化存储等场景。在管理和操作Redis数据库时,使用一个直观且功能强大的桌面管理工具是必不可少的,Another-Redis-Desktop-Manager(ARDM)就是...

    Redis学习资料

    Redis学习手册 Hash数据类型 doc Redis学习手册 Key操作命令 doc Redis学习手册 List数据类型 doc Redis学习手册 Set数据类型 doc Redis学习手册 Sorted Sets数据类型 doc Redis学习手册 String数据类型 doc Redis...

Global site tag (gtag.js) - Google Analytics