
java 项目里面,数据以 hash 结构保存在 redis 里面,怎么通过 key 批量获取 hash 数据,同时保证原子性? pipeline 好像不保证原子性。
1 crysislinux 2022 年 4 月 24 日 via Android 要保证原子性就写 lua 。 |
2 CEBBCAT 2022 年 4 月 25 日 先定义一下名词,HSET key field value ; 你说的批量获取是以原子性为前提对吗?也就是需要执行若干个 HGETALL/HMGET 同时要求在读取期间整个 Redis 示例不能有写入对吗? 这种情况可以用 MULTI https://redisbook.readthedocs.io/en/latest/feature/transaction.html |
3 LeeReamond 2022 年 4 月 25 日 multi 不保证事务性,不保证能回滚,也不保证命令执行成功,但可以保证执行期间不会被其他任务打断,读取是 ok 的。 |
4 lizuoqiang 2022 年 4 月 25 日 set test 1 >OK watch test >OK incr test >2 multi >OK get test >QUEUED exec >NIL |
5 Red998 2022 年 4 月 25 日 首先你说的批量获取数据、100 以下直接 Mget ,获取的数据大可以管道获取、节省网络传输。至于你说的原子性我觉得可以忽略。lua 脚本也可以、但是需要控制命令的大小。管道和 lua 脚本我觉得 管道实践比较好 |
6 suxxx OP @redorblacck886 为什么可以忽略原子性?现在数据量大概有几百万 key 。 |
7 suxxx OP 最近查了一下,有推荐 dump 后再反序列化。本地试了用 lua 直接批量读取,发现更慢了。lua 脚本是 "local res={}; for i,v in pairs(KEYS) do res[i]=redis.call('hgetall',v) end; return res"。 |