

如图,存了一个 hash 结构的数据, key 是用户名, value 是这个用户的一些信息,这个 hash 结构的数据会增长,最后数据量可能非常大。
假如用 hgetall 一次取出所有数据,然后去遍历导出,大数据的情况可能会: 1.影响其他 redis 的操作 2.内存溢出
需求是把这个 hash 结构的数据导出,比如导出到数据表或者 excel 文件。
有什么好的技术实现方法?谢谢!(程序语言 PHP , JAVA , Python 都可以)
1 yuankui 2016-03-01 12:48:15 +08:00 一定是设计出了问题 |
2 soli 2016-03-01 13:00:09 +08:00 你需要的是 HSCAN : http://redisdoc.com/hash/hscan.html |
4 Jaylee 2016-03-01 13:07:26 +08:00 先 keys * 取所有 key , 然后遍历 |
5 tanteng OP @Jaylee 先 hkeys key ,然后根据这个 key 去遍历取 hash 的数据?? 1.这个 keys 可能非常大有没有影响 2.这样会大大增加操作 redis 的次数,是不是问题 |
7 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 的优势,操作次数根本不是问题。 |
8 kingddc314 2016-03-01 13:41:17 +08:00 可以使用 redis 内的 lua 脚本进行处理 EVAL script numkeys key [key ...] arg [arg ...] |
9 kingddc314 2016-03-01 13:43:20 +08:00 可能理解错了楼主的意思,同 2L ,你需要的应该是 HSCAN 进行遍历 |
10 tanteng OP @kingddc314 hscan 只支持 2.8 以上版本 |
11 ynztyl10 2016-03-01 14:28:55 +08:00 keys * 确认没问题?不要误导。。 |
12 fwrq41251 2016-03-01 14:33:21 +08:00 像这种情况一般还会有个 set 存所有用户的用户名吧。这样直接取这个 set,再根据 key 遍历就好了。 |
13 zts1993 2016-03-01 14:40:42 +08:00 hscan 啊。。。。。 |
16 tanteng OP 从集合中取出所有用户 id ,和从 hash 中通过 hkeys 取,有什么不同吗 |
18 neoblackcap 2016-03-01 18:02:52 +08:00 @tanteng 一个是全部读到你 Client 端的内存里面,在 Client 端以一个数据结构或者对象的形式存在。一个只是一个迭代器。 简单而言,内存消耗不一样。 |
19 soli 2016-03-01 18:14:55 +08:00 KEYS 、 HGETALL 等命令应禁止在生产环境使用。看官方文档,都有非常显眼的警告。 |
20 tanteng OP @neoblackcap 这个明白,但是要 2.8 才支持 hscan |
22 solaro 2016-03-09 11:16:35 +08:00 @Jaylee 你这种做法就是要坑死楼主的, keys * 在生产环境里我都是禁用的,量大的时候秒蹦你缓存你信不信,执行一次得卡上 N 秒或者 N 十秒 |
24 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 |
25 solaro 2016-03-09 11:23:36 +08:00 如果 hash 丢了,重建结构简单, 如果 zset 丢了,重建,也不难。 当然,你那个 hash 其实从业务上来说是最简单的 |