V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
phpnote
V2EX  ›  Redis

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

  •  
  •   phpnote · 2021-04-03 14:22:59 +08:00 · 2010 次点击
    这是一个创建于 1361 天前的主题,其中的信息可能已经有所发展或是发生改变。
    没怎么用过 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 中找对应的数据
    然后再处理, 处理结果放入队列, 异步入表

    兄弟们, 这样合理吗? 如果不合理的话, 有什么更好的方案吗?
    4 条回复    2021-04-05 20:08:45 +08:00
    jifengg
        1
    jifengg  
       2021-04-03 16:12:32 +08:00 via Android   ❤️ 1
    有大于小于的需求,用 redis,一个是遍历(不推荐),一个是用 sortset ( zset ),value 存整个数据的 json,score 就是 age
    phpnote
        2
    phpnote  
    OP
       2021-04-03 16:58:41 +08:00
    @jifengg 嗯嗯, 这样数据操作起来还简单了, 就是不知道如果每小时进来大约一千万条数据性能怎么样
    xuanbg
        3
    xuanbg  
       2021-04-03 19:44:03 +08:00   ❤️ 1
    数据进缓存无论你什么数据类型都不会有什么性能问题。按 key 读取数据也没什么问题。问题是按条件查询,这个不是 redis 的菜。
    jifengg
        4
    jifengg  
       2021-04-05 20:08:45 +08:00 via Android
    @phpnote 如果要用可以在实际环境中测试看看
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1553 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 16:55 · PVG 00:55 · LAX 08:55 · JFK 11:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.