没怎么用过 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 中找对应的数据
然后再处理, 处理结果放入队列, 异步入表
兄弟们, 这样合理吗? 如果不合理的话, 有什么更好的方案吗?