技术求助帖,关于 redis 大 value 存储的问题

2020-11-30 16:41:50 +08:00
 hehe12980

这是我在 V2EX 的第一个帖子

最近遇到一个业务场景,外部接口每隔 5 秒种会给我一批温度参数, 分别为每个机器上的不同温度,需要在前台动态曲线图实时显示,前台 每次 只能 看某 1 天和某一个机器的 温度参数, 历史数据曲线图 可以查询

技术上我做了分表,每一天的数据建一张表,大概 100 台左右的机器数量,每一天的数据 172 万, 单台机器的温度数据每天大概为 1.7 万

前置条件: 任何一台机器温度数据一旦生成是不会变的,我的思路能不能放缓存中,这样就不用去 100 多万条数据,拿机器编号去匹配了

但是我尝试把 1.7 万条数据 放入 redis 中,这个时候 redis 直接报了个命令超时,应该是 value 过大,导致性能下降,IO 瓶颈太大

所以 这种场景的需求究竟要怎么处理呢? 感觉 我这个需求和股票的实时曲线很像 好难啊 呜呜呜

5531 次点击
所在节点    程序员
73 条回复
xgfan
2020-11-30 17:06:41 +08:00
每台机器的 1.7 万条数据,放到一个 list/zset 里面去。
hehe12980
2020-11-30 17:09:07 +08:00
一条一条放 取的时候 批量取么
hehe12980
2020-11-30 17:09:32 +08:00
@xgfan 一条一条放 取的时候 批量取么
xgfan
2020-11-30 17:14:52 +08:00
@hehe12980 采集一次放一次呗。取的时候批量取。
看起来用 zset 比较合适。用生成时间做为 score,也方便清理过时数据。
Jooooooooo
2020-11-30 17:15:53 +08:00
大 key 简单的做法是打散

散到 100 个 sub key 里去, 然后捞这个 key 数据的时候直接 pipeline 去捞这 100 个 sub key 然后组装起来
XDJI
2020-11-30 17:19:03 +08:00
可以切下 比如机器 1 切 10 个 key 存的时候批量存 取得时候批量取就是
pushback
2020-11-30 17:21:08 +08:00
可以参考 hashmap 的切法
qwerthhusn
2020-11-30 17:23:02 +08:00
时序数据库是不是更适合。。
sagaxu
2020-11-30 17:27:04 +08:00
历史数据存 db,不用缓存,一张表存明细,一张表每行是一个设备一天所有数据。

实时数据存 hashmap,key 为设备 ID,field 为时间 slot(0 到 17280),绘制实时曲线的时候,首次取整个 hash,之后只要取比上次最大 slot 更大的值。
dynastysea
2020-11-30 17:27:16 +08:00
为什么用 redis ?你的查询量多大?
chengz
2020-11-30 17:34:16 +08:00
应该是拿 redis 当缓存用
存入可以数据可以实时存
读取数据分批量取,还有大 key 就考虑将大 key 拆分
lyy16384
2020-11-30 17:46:58 +08:00
你的机器编号没索引的吗
hehe12980
2020-11-30 17:58:00 +08:00
@lyy16384 有索引你也是得扫 1.7 万啊
hehe12980
2020-11-30 17:59:00 +08:00
@dynastysea 没啥查询量 就是历史数据 去数据库查 感觉慢, 历史数据是固定的
rrfeng
2020-11-30 18:01:31 +08:00
建议上个时间序列数据库,influxdb 或者直接上个 prometheus (如果不要求持久化的话)
rrfeng
2020-11-30 18:02:23 +08:00
这数据量对专业的 TSDB 来说是小儿科~
hehe12980
2020-11-30 18:05:25 +08:00
@rrfeng 上新数据库应该不考虑了 毕竟引一个数据库 就干这么一个事 ==
rrfeng
2020-11-30 18:07:13 +08:00
1.7w 个 float 也没多大啊,改一下超时时间呗
hehe12980
2020-11-30 18:09:58 +08:00
@rrfeng 不止温度一个字段,有 6 个业务字段,绘制 6 条曲线,实时的,所以放 redis 没问题,取的时候 设置 3s 超时 直接爆了 感觉 还没 mysql 快 感觉 redis 用的有问题==
hehe12980
2020-11-30 18:11:36 +08:00
@sagaxu 历史数据存 mysql, 查的时间大概是 0.5s 到 1.1 秒之间,感觉这个响应时间还是有点慢了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/730651

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX