如何取出大数据量的 redis hash 结构的数据并遍历导出?

2016-03-01 12:04:56 +08:00
 tanteng

如图,存了一个 hash 结构的数据, key 是用户名, value 是这个用户的一些信息,这个 hash 结构的数据会增长,最后数据量可能非常大。

假如用 hgetall 一次取出所有数据,然后去遍历导出,大数据的情况可能会: 1.影响其他 redis 的操作 2.内存溢出

需求是把这个 hash 结构的数据导出,比如导出到数据表或者 excel 文件。

有什么好的技术实现方法?谢谢!(程序语言 PHP , JAVA , Python 都可以)

28178 次点击
所在节点    Redis
26 条回复
yuankui
2016-03-01 12:48:15 +08:00
一定是设计出了问题
soli
2016-03-01 13:00:09 +08:00
你需要的是 HSCAN : http://redisdoc.com/hash/hscan.html
tanteng
2016-03-01 13:05:28 +08:00
@yuankui 那像这种一开始没有记录到数据库,直接存到 redis 的数据,如何导出呢
Jaylee
2016-03-01 13:07:26 +08:00
先 keys * 取所有 key , 然后遍历
tanteng
2016-03-01 13:10:56 +08:00
@Jaylee 先 hkeys key ,然后根据这个 key 去遍历取 hash 的数据?? 1.这个 keys 可能非常大有没有影响 2.这样会大大增加操作 redis 的次数,是不是问题
Jaylee
2016-03-01 13:28:38 +08:00
@tanteng 1, 没有影响 2.不是问题
zhs227
2016-03-01 13:37:34 +08:00
@tanteng Redis 官方原来有个加密的功能,但是官方说你们不应该太相信这个功能,因为 Redis 的存取速度太快了,破解起来飞起。

http://redis.io/commands/AUTH

Note: because of the high performance nature of Redis, it is possible to try a lot of passwords in parallel in very short time, so make sure to generate a strong and very long password so that this attack is infeasible.

高速存取是 Redis 的优势,操作次数根本不是问题。
kingddc314
2016-03-01 13:41:17 +08:00
可以使用 redis 内的 lua 脚本进行处理
EVAL script numkeys key [key ...] arg [arg ...]
kingddc314
2016-03-01 13:43:20 +08:00
可能理解错了楼主的意思,同 2L ,你需要的应该是 HSCAN 进行遍历
tanteng
2016-03-01 14:13:25 +08:00
@kingddc314 hscan 只支持 2.8 以上版本
ynztyl10
2016-03-01 14:28:55 +08:00
keys * 确认没问题?不要误导。。
fwrq41251
2016-03-01 14:33:21 +08:00
像这种情况一般还会有个 set 存所有用户的用户名吧。这样直接取这个 set,再根据 key 遍历就好了。
zts1993
2016-03-01 14:40:42 +08:00
hscan 啊。。。。。
tanteng
2016-03-01 15:47:26 +08:00
@fwrq41251 并没有
rubytek
2016-03-01 17:30:01 +08:00
@tanteng 是说设计成自带一个 Key 的集合啊。
tanteng
2016-03-01 17:33:49 +08:00
从集合中取出所有用户 id ,和从 hash 中通过 hkeys 取,有什么不同吗
tanteng
2016-03-01 17:33:58 +08:00
@rubytek 从集合中取出所有用户 id ,和从 hash 中通过 hkeys 取,有什么不同吗
neoblackcap
2016-03-01 18:02:52 +08:00
@tanteng 一个是全部读到你 Client 端的内存里面,在 Client 端以一个数据结构或者对象的形式存在。一个只是一个迭代器。
简单而言,内存消耗不一样。
soli
2016-03-01 18:14:55 +08:00
KEYS 、 HGETALL 等命令应禁止在生产环境使用。看官方文档,都有非常显眼的警告。
tanteng
2016-03-01 18:32:42 +08:00
@neoblackcap 这个明白,但是要 2.8 才支持 hscan

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

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

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

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

© 2021 V2EX