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

Redis 批量读取 Hash 数据

  •  
  •   suxxx · 2022-04-24 21:34:44 +08:00 · 3074 次点击
    这是一个创建于 936 天前的主题,其中的信息可能已经有所发展或是发生改变。

    java 项目里面,数据以 hash 结构保存在 redis 里面,怎么通过 key 批量获取 hash 数据,同时保证原子性? pipeline 好像不保证原子性。

    7 条回复    2022-04-27 17:09:48 +08:00
    crysislinux
        1
    crysislinux  
       2022-04-24 22:08:14 +08:00 via Android
    要保证原子性就写 lua 。
    CEBBCAT
        2
    CEBBCAT  
       2022-04-25 01:11:47 +08:00
    先定义一下名词,HSET key field value ;

    你说的批量获取是以原子性为前提对吗?也就是需要执行若干个 HGETALL/HMGET 同时要求在读取期间整个 Redis 示例不能有写入对吗?

    这种情况可以用 MULTI https://redisbook.readthedocs.io/en/latest/feature/transaction.html
    LeeReamond
        3
    LeeReamond  
       2022-04-25 04:14:55 +08:00
    multi 不保证事务性,不保证能回滚,也不保证命令执行成功,但可以保证执行期间不会被其他任务打断,读取是 ok 的。
    lizuoqiang
        4
    lizuoqiang  
       2022-04-25 09:21:53 +08:00
    set test 1
    >OK
    watch test
    >OK
    incr test
    >2
    multi
    >OK
    get test
    >QUEUED
    exec
    >NIL
    Red998
        5
    Red998  
       2022-04-25 11:33:41 +08:00
    首先你说的批量获取数据、100 以下直接 Mget ,获取的数据大可以管道获取、节省网络传输。至于你说的原子性我觉得可以忽略。lua 脚本也可以、但是需要控制命令的大小。管道和 lua 脚本我觉得 管道实践比较好
    suxxx
        6
    suxxx  
    OP
       2022-04-27 17:06:41 +08:00
    @redorblacck886 为什么可以忽略原子性?现在数据量大概有几百万 key 。
    suxxx
        7
    suxxx  
    OP
       2022-04-27 17:09:48 +08:00
    最近查了一下,有推荐 dump 后再反序列化。本地试了用 lua 直接批量读取,发现更慢了。lua 脚本是
    "local res={}; for i,v in pairs(KEYS) do res[i]=redis.call('hgetall',v) end; return res"。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1898 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 16:30 · PVG 00:30 · LAX 08:30 · JFK 11:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.