redis+websocket 实现统计数据实时推送

刚刚进入这个公司是三年前,我也刚刚满打满算有了两年工作经验,开发时很少会考虑性能、安全这些方面的东西。那时候公司需要我做一个监控大屏,就是满是统计图表的一个页面,投影出来展示。刚刚接手的时候我觉得这个项目的难点有两个:图表插件和统计sql。经过一段时间的开发,项目基本完成,图表选择用的highchars,参照着demo里的数据格式传入数据并没有想象中的困难,sql也勉勉强强的写了出来了,但是性能一般,经过很多次的优化,也说的过去。到这里看上去应该是一个圆满的结局,实际上一个痛苦的开始。随着公司业务上扩展,之前一个地区的监控大屏变成多个地区的大屏,没关系复制出来个项目改改参数两个小时我就可以开发一个项目。知道有一天有一个地区反映大屏打开慢,数据加载慢,通过验证得出结论,这个项目数据的加载是靠着jquery定时器每隔几秒去后台刷新数据,是很多的项目同时刷同样的数据导致的。经过讨论,最后决定做一个data-center为这些大屏提供数据。把一些不用实时去查询的数据缓存到static变量中,以供前台拉取,页面打开时间可以接受了。再后来去北京工作的一年当中我把这个项目和解决问题的过程当做主要的工作经历来介绍,也在面试的过程当中得到了很多别人的想法,比如说后台的数据推送和缓存工具的使用。但是我觉得恐怕没有机会,去亲手改造那个项目了。

在北京的这一年就像午休小憩时做了一场梦一样,一觉醒来,旁边坐着以前的同事,眼前是当年自己的写的代

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
好的,这是一个比较复杂的功能,需要涉及到多个模块的编写。下面是一个简单的示例代码,供您参考。 1. 首先是WebSocket的部分,我们可以使用Python的tornado框架来实现: ```python import tornado.web import tornado.websocket import tornado.ioloop import redis r = redis.Redis(host='localhost', port=6379, db=0) class WebSocketHandler(tornado.websocket.WebSocketHandler): def open(self): # 获取用户信息,将其作为Redis的key值 user_id = self.get_secure_cookie('user_id').decode('utf-8') self.user_id = user_id def on_close(self): pass def check_origin(self, origin): return True def on_message(self, message): # 接收到消息后,将其存入Redis,key为用户ID,value为消息内容 r.rpush(self.user_id, message) def make_app(): return tornado.web.Application([ (r'/ws', WebSocketHandler), ]) if __name__ == '__main__': app = make_app() app.listen(8000) tornado.ioloop.IOLoop.current().start() ``` 2. 接下来是Redis的部分,我们需要实现一个推送消息的函数,同时也需要实现一个获取离线消息的函数: ```python import redis r = redis.Redis(host='localhost', port=6379, db=0) def push_message(user_id, message): # 将消息推送到当前用户的WebSocket连接中 for conn in WebSocketHandler.connections: if conn.user_id == user_id: conn.write_message(message) def get_offline_message(user_id): # 获取当前用户的离线消息,并返回一个列表 messages = r.lrange(user_id, 0, -1) r.delete(user_id) return messages ``` 3. 最后,我们需要在适当的位置调用这些函数,来实现消息的推送和离线消息的获取。例如,在用户登录后,我们可以调用`get_offline_message()`函数,获取用户的离线消息: ```python class LoginHandler(tornado.web.RequestHandler): def post(self): user_id = self.get_argument('user_id') self.set_secure_cookie('user_id', user_id) # 获取用户的离线消息,并推送到当前用户的WebSocket连接中 offline_messages = get_offline_message(user_id) for msg in offline_messages: push_message(user_id, msg) ``` 当用户收到新消息时,我们可以调用`push_message()`函数,将消息推送到当前用户的WebSocket连接中: ```python class SendMessageHandler(tornado.web.RequestHandler): def post(self): user_id = self.get_secure_cookie('user_id').decode('utf-8') message = self.get_argument('message') # 将消息推送到当前用户的WebSocket连接中 push_message(user_id, message) # 将消息存入Redis,供离线推送使用 r.rpush(user_id, message) ``` 这样,我们就完成了WebSocket+Redis实现消息推送机制以及离线消息推送的功能。当用户收到新消息时,会立即推送到其当前的WebSocket连接中;当用户下线后,未读的消息会存入Redis中,等用户再次登录时,会将其离线消息推送给用户。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值