我想将信息从redis传输到mysql。
首先,我获得了user_id和得分表格redis。
info = $redis.zrevrange("some_info", 0, limit - 1, withscores: withscores)
然后我需要处理这些日期:
total_info = info.each_slice(2).to_a.inject([]) do |sum, e|
sum << {
id: id,
name: name,
rank: rank,
score: score,
}
total_info
是一个大小为100000 +的数组。
然后我需要将total_info
的记录插入mysql。
我尝试创建一个要插入的循环,但我认为这不是一个好主意。
如何制作?什么是最快的方式?
答案 0 :(得分:4)
您可以在Active Record Import中使用Fastest Version。
以下是一个例子:
columns = [ :id, :name, :rank, :score ]
values = []
infos.each do |info|
values << [info.id, info.name, info.rank, info.score]
end
Model.import columns, values, validate: false
答案 1 :(得分:0)
感谢@ e4c5和@Rich Peck。
我将日期转储到.CSV文件中,然后将其导入mysql。它非常快!
info = $redis.zrevrange("some_info", 0, limit - 1, withscores: withscores)
CSV.open("temp.csv", "w") do |csv|
csv << %w(id, name, rank, score......)
info.each_slice(2) do |e|
csv << [id, name, rank, score......]
end
end
然后:
sql = "LOAD DATA LOCAL INFILE 'temp.csv'
INTO TABLE <table_name>
FIELDS TERMINATED BY ','
ENCLOSED BY '\"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS
(ia, name, rank, score.....);"
ActiveRecord::Base.connection.execute(sql)