文档等我下班之后编写,现在要搬砖了,呵呵! 求助大家代码出现不稳定性,现在不知道原因在哪儿,主键的重复也做判断,但是在插入数据库报错,主键重复
created_at = DateTime.parse(Time.now.to_s).strftime('%Y-%m-%d %H:%M:%S').to_s #Time.zone.now
updated_at = created_at
$redis_qrcodes = Redis::Namespace.new('qrcode', redis: Redis.new)
$redis_qrcodes.del('code')
@code_key = Qrcode.pluck(:code)
$redis_qrcodes.sadd('code',@code_key) unless @code_key.empty?
sql_line_array = []
1.upto(number) { |i|
tmp_code = Qrcode.generate_code(digit)
while true do
unless $redis_qrcodes.sismember('code', tmp_code)
$redis_qrcodes.sadd('code', tmp_code)
sql_line_array << "('#{tmp_code}','#{digit}','#{prefixion}', '#{webpage_jump}','#{created_at}','#{updated_at}')"
CodeJob.set(wait: 1.minute).perform_later(tmp_code)
break
else
p "------------出现重复编码---- #{tmp_code}-----------------"
tmp_code = Qrcode.generate_code(digit)
end
end
}
puts '------------结束批量生成编码code---------------------'
puts '------------开始批量导入数据库---------------------'
data = sql_line_array.join(',')
sql_line = "insert into qrcodes (code,digit,prefixion,webpage_jump,created_at,updated_at) values #{data}"
begin
ActiveRecord::Base.connection.execute(sql_line)
puts '------------批量编码code成功导入数据---------------------'
rescue ActiveRecord::RecordNotUnique => e
puts '------------自动生成编码异常重新开始---------------------'
Qrcode.generate_qr(digit,number,prefixion)
end
puts '------------结束批量导入数据库---------------------'
return ''
end
def self.generate_code(digit)
code = [*('a'..'z'),*('A'..'Z'),*(0..9)].shuffle[0..digit].join
end
最后通过 benchmark 测试出现不稳定,之后查看了 code 的字段类型, 发现用 string varchar(10) 这个是问题的所在地,改用 binary 类型二进制就可以解决