1.需求描述
在實際業務中,需要將百萬量級的數據導入到redis。而由於寫入程序和redis所在機房不同,導致每條記錄的寫入存在一定時延,被百萬次寫入放大后,竟然需要用3個小時才能完成全部寫入。
2.解決方法
為此,改用pipeline寫入redis。pipeline的作用,是能夠將多條命令集中起來,一次發送到redis服務端,從而減少網絡IO時延。
舉個例子,假設每條記錄的寫入(包括服務器的返回響應)網絡時延為20ms,則100萬條記錄的總時延可達5.5小時。但如果使用pipeline,每次寫入1萬條記錄、分100次寫入,則網絡時延僅為2秒。可以說,數據量越大,則采用pipeline的提速效果越是明顯。
3.示例如下:
from rediscluster import StrictRedisCluster
tag='xxx'
startup_nodes = [
{"host": "xxx", "port": "6379"},
]
rs = StrictRedisCluster(startup_nodes=startup_nodes, decode_responses=True, skip_full_coverage_check=True)
cnt = 0
# 通過pipeline批量寫入redis
p=rs.pipeline()
for line in sys.stdin:
line_split = line.strip().split('\t')
rec_key = line_split[0]
rec_value = line_split[1]
p.hset(rec_key, tag, rec_value)
cnt += 1
if cnt%10000==0:
p.execute()
p.execute()