背景

在一次业务迁移中,需要将一个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负载升高影响业务

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐