Redis 批量读取 Hash 数据

2022-04-24 21:34:44 +08:00
 suxxx

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

3131 次点击
所在节点    Redis
7 条回复
crysislinux
2022-04-24 22:08:14 +08:00
要保证原子性就写 lua 。
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
2022-04-25 04:14:55 +08:00
multi 不保证事务性,不保证能回滚,也不保证命令执行成功,但可以保证执行期间不会被其他任务打断,读取是 ok 的。
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
2022-04-25 11:33:41 +08:00
首先你说的批量获取数据、100 以下直接 Mget ,获取的数据大可以管道获取、节省网络传输。至于你说的原子性我觉得可以忽略。lua 脚本也可以、但是需要控制命令的大小。管道和 lua 脚本我觉得 管道实践比较好
suxxx
2022-04-27 17:06:41 +08:00
@redorblacck886 为什么可以忽略原子性?现在数据量大概有几百万 key 。
suxxx
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"。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/849011

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX