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

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

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

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

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

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

28177 次点击
所在节点    Redis
26 条回复
tanteng
2016-03-01 18:33:04 +08:00
@soli 看来不能用这种方式
solaro
2016-03-09 11:16:35 +08:00
@Jaylee 你这种做法就是要坑死楼主的, keys * 在生产环境里我都是禁用的,量大的时候秒蹦你缓存你信不信,执行一次得卡上 N 秒或者 N 十秒
tanteng
2016-03-09 11:18:16 +08:00
@solaro 还没着手做这个,用 hscan 是否可行?
solaro
2016-03-09 11:22:23 +08:00
如果是我,我会这么做:
1.一个 hash , hash-key :uid, hash-value:zsetid_uid
2.一个 zset, id:uid ,value : user info
各种好判断, hash 效率高,单量小, zset 可以用来分页,分段取出
甚至你存储的时候可以做 shard
solaro
2016-03-09 11:23:36 +08:00
如果 hash 丢了,重建结构简单,
如果 zset 丢了,重建,也不难。
当然,你那个 hash 其实从业务上来说是最简单的
abc123ccc
2016-04-14 18:55:06 +08:00
@tanteng 建议:
方案 1 、凌晨某个点,一次 hgetall 把 key 写入到队列当中,这样你的队列与 hash 就能保持一致了,以后取数据就相当的容易。因为 list 里的值就为 hash 的 key 。但可以告诉你的是:一次性读入大量的数据,整个网站都会很慢。

方案 2 、如果你的 hash 的 key 是有规律的,那就写个程序往 list 里赛吧,定时定量跑。跑完为止。

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

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

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

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

© 2021 V2EX