面试题答案
一键面试优化HTTP请求性能
- 连接复用:使用
net/http
库时,可以通过HTTP::Persistent
类来实现连接复用。这可以减少建立新连接的开销。
require 'net/http'
require 'uri'
uri = URI('https://example.com/api')
http = Net::HTTP::Persistent.new('my_agent')
10.times do |i|
request = Net::HTTP::Put.new(uri)
response = http.request(request)
puts "Response #{i}: #{response.body}"
end
http.finish
解释:Net::HTTP::Persistent.new('my_agent')
创建了一个持久化的HTTP连接实例,在多次请求中可以复用这个连接,http.finish
用于结束持久化连接,释放资源。
- 异步处理:可以使用
async
和await
关键字(Ruby 2.6+)结合net/http
实现异步请求。需要引入async
库。
require 'async'
require 'net/http'
require 'uri'
uri = URI('https://example.com/api')
Async do |task|
10.times.map do |i|
task.async do
request = Net::HTTP::Put.new(uri)
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts "Response #{i}: #{response.body}"
end
end.each(&:await)
end
解释:Async do |task|
创建了一个异步上下文,task.async do
块中的代码会异步执行,each(&:await)
用于等待所有异步任务完成。
高效解析和筛选复杂响应数据
- 解析JSON:使用
json
库解析响应数据。
require 'json'
response_body = '{"key1": {"subkey1": "value1", "subkey2": "value2"}, "key2": "value3"}'
data = JSON.parse(response_body)
- 深度解析和筛选:可以使用
Hash#dig
方法进行深度嵌套数据访问,结合条件判断进行筛选。
# 假设data是解析后的JSON数据
if value = data.dig('key1','subkey1')
puts "Found value: #{value}" if value == 'value1'
end
解释:Hash#dig
方法可以方便地访问嵌套的哈希值,无需多次手动检查键是否存在。结合条件判断,可以根据特定规则筛选数据。
优化策略说明
- 连接复用:减少了每次请求建立和销毁TCP连接的开销,对于大量请求性能提升显著。
- 异步处理:充分利用CPU时间,在等待HTTP响应时可以执行其他任务,提高整体效率。
- JSON解析与筛选:
json
库解析效率高,Hash#dig
方法简洁高效,能够快速定位和筛选出所需数据。