java 项目里面,数据以 hash 结构保存在 redis 里面,怎么通过 key 批量获取 hash 数据,同时保证原子性? pipeline 好像不保证原子性。
1
crysislinux 2022-04-24 22:08:14 +08:00 via Android
要保证原子性就写 lua 。
|
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 |
3
LeeReamond 2022-04-25 04:14:55 +08:00
multi 不保证事务性,不保证能回滚,也不保证命令执行成功,但可以保证执行期间不会被其他任务打断,读取是 ok 的。
|
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 |
5
Red998 2022-04-25 11:33:41 +08:00
首先你说的批量获取数据、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"。 |