redis通过hscan导入大hash key
·
背景
在一次业务迁移中,需要将一个redis的db导入另一个线上的redis中,在导入的db中有几个field上百万的hash key。直接hgetall来导入有点太粗暴,所以使用了hscan来操作
代码
#!/bin/env python
import redis
s1 = redis.Connection(host='192.168.0.1',port=1111)
s2 = redis.Connection(host='192.168.0.1',port=2222)
c1 = s1.send_command('select','3')
c2 = s2.send_command('select','3')
print(s1.read_response())
# db里的key数量不多,我直接使用了keys* 来遍历。若key很多的话可以用scan方法来遍历,使用和hscan类似
c1 = s1.send_command('keys','*')
keys0 = s1.read_response()
for i in keys0:
c1 = s1.send_command('type',i)
result = s1.read_response()
if result == "hash":
cursor = 0
print("start restore",i)
while True:
s1.send_command('hscan',i,cursor,'count',10)
hresult = s1.read_response()
cursor = hresult[0]
if hresult[0] == '0' :
s2.send_command('hmset',i,*hresult[1])
print(i,"restorte done!")
break
else:
s2.send_command('hmset',i,*hresult[1])
代码只导入hash key。
大致原理就是通过redis的hsacn方法来遍历hash key。cursor从0开始,每次请求会拿到一个新的cursor,当拿到的cursor为0时,代表遍历完毕。
其中count可以调整的更大,来使每次导入的数据量更大。
导入前建议找个redis测试一下,防止导入的太狠,让线上的redis负载升高影响业务
更多推荐



所有评论(0)