请教 Redis 中的数据存储查找问题, 这样合理吗 ?

2021-04-03 14:22:59 +08:00
 phpnote
没怎么用过 Redis, 现在遇到个问题需要用 Redis 解决, 描述如下:

# 从接口会零零散散接到大量的数据, 以下是简化的数据例子

row_1 = {name: zhangsan, age: 17}
row_2 = {name: lisi, age: 18}
row_3 = {name: wangwu, age: 19}
...

Python 脚本专门对符合条件的数据进行处理, 处理结果存表

原方案:
数据 row_1, row_2 ... 接口收到后直接存表, 有个定时发起的 Python 脚本从表里批量查询出 age <= xx 的数据进行处理, 处理结果存表, 由于脚本是并发的, 所以 Python 脚本先通过 update xxx pid = xxx .... 锁住数据后, 再进行后续的步骤

更换方案的原因: 数据量太大, 数据库读写太频繁, 跟不上

# --------------------------------------------------------------------------

准备上 Redis, 直接在内存中处理, 处理后的结果再放入队列中异步写入数据库

预计的数据结构如下, key = task:{自增 ID}

HSET task:{自增 ID} name zhangsan
HSET task:{自增 ID} age 17

HSET task:{自增 ID} name lisi
HSET task:{自增 ID} age 18

HSET task:{自增 ID} name wangwu
HSET task:{自增 ID} age 19
...

# --------------------------------------------------------------------------

问题: 数据只存 Redis 的话, 有没有好的办法筛选出 age <= xx 的数据集 ?

我现在的设想是, 用一个 set()来作为索引

key 为 age 索引, values 为 hash 的 key 们, 如下:

key_1 = task:index:age:17
SADD key_1 "task:{自增 ID}", "task:{自增 ID}", ...

key_2 = task:index:age:18
SADD key_2 "task:{自增 ID}", "task:{自增 ID}", ...

然后再通过 set()的 key 来遍历出 age <= 18 的数据

key 为 task:index:age:17 的 set() 中的 values
key 为 task:index:age:18 的 set() 中的 values
...

然后再通过查找出的 values (其实就是 hash 的 key 们), 去 hash 中找对应的数据
然后再处理, 处理结果放入队列, 异步入表

兄弟们, 这样合理吗? 如果不合理的话, 有什么更好的方案吗?
2011 次点击
所在节点    Redis
4 条回复
jifengg
2021-04-03 16:12:32 +08:00
有大于小于的需求,用 redis,一个是遍历(不推荐),一个是用 sortset ( zset ),value 存整个数据的 json,score 就是 age
phpnote
2021-04-03 16:58:41 +08:00
@jifengg 嗯嗯, 这样数据操作起来还简单了, 就是不知道如果每小时进来大约一千万条数据性能怎么样
xuanbg
2021-04-03 19:44:03 +08:00
数据进缓存无论你什么数据类型都不会有什么性能问题。按 key 读取数据也没什么问题。问题是按条件查询,这个不是 redis 的菜。
jifengg
2021-04-05 20:08:45 +08:00
@phpnote 如果要用可以在实际环境中测试看看

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

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

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

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

© 2021 V2EX