mysql - 实时在线设备统计应该保存在SQL,Redis Set还是Redis Sorted Set?
天蓬老师
天蓬老师 2017-04-17 13:36:21
[MySQL讨论组]

之前我用Redis保存实时采集的数据,现在需要额外的数据结构记录实时在线设备。

传统MySQL数据库,
onConnectionMade(),更新SQL数据库;
onConnectionLost(),更新SQL数据库;

Redis Set,
onConnectionMode(),在online(set)中增加对应设备SNR;
onConnectionLost(),在online(set)中删除对应设备SNR;

Redis Sorted Set,
onConnectionMode(),在online(set)中增加对应设备SNR;
onConnectionLost(),在online(set)中删除对应设备SNR;

我纠结以下问题:

  1. 采用Sorted Set固然好处比较多,但却是Redis最复杂的数据类型,不知道会占用多少资源?10K设备,每个SNR大约16字节。

  2. 如果采用Set,如果采用分页显示设备清单,如果10K设备,即使采用JSON,是否一次返回太多数据?好像缺乏range和通配符之类的操作。

  3. 此类操作是否SQL更有优势?毕竟长连接情况下,更新频率不高。

  4. 如果重启服务器,那么这个数据库表需要清表,Redis下操作简单,但是SQL是否会锁表?

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回复(4)
PHPz

hello, 最近正在做这方面的工作,就是统计websocket的在线连接数量,一开始也是统计在redis的,后来采用日志对接storm实时处理去做了。因为一旦在多进程多机器的集群模式下,不管是数据库还是redis缓存,复杂度就很高了,某一个进程崩溃了,怎么清空他对应的连接呢?用最小的成本去解决这个问题就是在连接创建跟关闭的时候在日志里面打印出自己的连接数。
storm平台实时收集日志就可以计算出总的在线连接了,并且可以动态扩展伸缩进程和集群数量,这是数据库跟缓存不好实现的地方。

怪我咯

用sql吧,用内存数据库

大家讲道理

实时已经决定了倾向于NoSQL,redis存取快,适用于热数据,就它了。数据结构的话看你的业务场景与需求。

PHP中文网

看题目上纠结的几点貌似既要求实时又要求能够分页查询,首先很重要的一点就是预估数据量,10K的设备不多,放DB也可以,而且在分页上面更有优势,但是由于设备会不停的上线下线,这样就涉及到频繁的对DB进行增加/删除操作,那就不太合适了。
所以建议使用NoSql,也就是Redis,至于使用普通的Set还是有序集合嘛:
Redis有序集合的插入需要维护集合的顺序,所以相对于普通集合操作效率较低,如果说需要分页的话,其实有序集合也就支持一种排序方式,真心不觉得使用有序集合能够便于分页,稍微修改下分页规则这个有序集合就没用了。
综上推荐使用普通集合,如果需要进行分页查询,可以考虑将Redis中的数据定时同步到DB,然后进行查询,Redis中的数据主要用于计算实时在线设备数量。不过这样的话还不如维护一个计数器来的方便,哈哈~~~

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号