如图,存了一个 hash 结构的数据, key 是用户名, value 是这个用户的一些信息,这个 hash 结构的数据会增长,最后数据量可能非常大。
假如用 hgetall 一次取出所有数据,然后去遍历导出,大数据的情况可能会: 1.影响其他 redis 的操作 2.内存溢出
需求是把这个 hash 结构的数据导出,比如导出到数据表或者 excel 文件。
有什么好的技术实现方法?谢谢!(程序语言 PHP , JAVA , Python 都可以)
1
yuankui 2016-03-01 12:48:15 +08:00 1
一定是设计出了问题
|
2
soli 2016-03-01 13:00:09 +08:00 2
你需要的是 HSCAN : http://redisdoc.com/hash/hscan.html
|
4
Jaylee 2016-03-01 13:07:26 +08:00 1
先 keys * 取所有 key , 然后遍历
|
5
tanteng OP @Jaylee 先 hkeys key ,然后根据这个 key 去遍历取 hash 的数据?? 1.这个 keys 可能非常大有没有影响 2.这样会大大增加操作 redis 的次数,是不是问题
|
7
zhs227 2016-03-01 13:37:34 +08:00 1
@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 1
可能理解错了楼主的意思,同 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 1
@tanteng 一个是全部读到你 Client 端的内存里面,在 Client 端以一个数据结构或者对象的形式存在。一个只是一个迭代器。
简单而言,内存消耗不一样。 |
19
soli 2016-03-01 18:14:55 +08:00 1
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 其实从业务上来说是最简单的 |