让 API 端点的响应速度提高 50 倍!
2019-12-16 09:53
1101 查看
users 用户记录; subscriptions 订阅关系记录; subscriber_lists 订阅信息记录; documents 文档记录。
{
"title": "Harry Potter",
"author": "JK Rowling"
...
}
{"title":["Harry Potter","Twilight"]}
{ subscriber_list: 1 }
def find_subscriber_list(query)
return [] unless query.present?
subscriber_lists = SubscriberList.where("ARRAY(SELECT json_object_keys(attributes)) = Array[:keys]", keys: query.keys)
subscriber_lists.select do |subscriber_list|
subscriber_list.attributes.all? do |key, attributes|
query_values = query[key]
list_values = attributes[key]
query_values.sort == list_values.sort
end
end
end
{ "tag": ["a12", "c32", "b521", "b212", "d230", "z291", ...] }
class AddAttributesDigestToSubscriberLists < ActiveRecord::Migration[5.2]
def change
add_column :subscriber_lists, :attributes_digest, :string
end
end
class AddIndexesToSubscriberListDigest < ActiveRecord::Migration[5.2]
disable_ddl_transaction!
def change
add_index :subscriber_lists,
:attributes_digest,
algorithm: :concurrently
end
end
Digest::SHA256.hexdigest(normalize_hash(hash))
# in SubscriberList class
before_save do
self.attributes_digest = HashDigest.new(attributes).generate
end
# migration
class AddDigestToExistingSubscriberLists < ActiveRecord::Migration[5.2]
disable_ddl_transaction!
def change
SubscriberList.where("attributes_digest IS NULL").find_each do |list|
list.attributes_digest = HashDigest.new(list.attributes).generate
list.save!
end
end
end
def find_subscriber_list(query)
digest = HashDigest.new(query).generate
SubscriberList.find_by_attributes_digest(digest)
end
ab -t 10 -r -c 5 /endpoint?tag[]=a12,b23,c34,d45...
基准测试结果
完成 18 次请求 .
请求的比例和耗时(单位:毫秒)
50% 2518
66% 2549
75% 2744
80% 2873
90% 3138
95% 3161
98% 3161
99% 3161
100% 3161 (慢请求的耗时)
完成 1167 次请求.
请求的比例和耗时(单位:毫秒)
50% 41
66% 45
75% 47
80% 49
90% 53
95% 57
98% 63
99% 66
100% 598 (慢请求的耗时)
热 文 推 荐
点击阅读原文,即刻参加!
相关文章推荐
- 安装 Windows 自动化 API 3.0 ,提高Visual Studio 2010 的运行速度
- 深入浅出Symfony2 - 如何提高网站响应速度
- PHP使用memcache缓存技术提高响应速度的方法
- 提高AJAX客户端响应速度
- 2012年08月29日--如何在JSP页面中提高响应速度
- 使用fastcgi_finish_request提高页面响应速度
- Linux中通过缓存DNS的解析来提高上网的响应速度!
- 深入浅出Symfony2 - 如何提高网站响应速度
- 提高AJAX客户端响应速度
- TB案例 - 从改进HelpDesk问题处理流程来提高IT team的响应速度
- 使用ajaxcontroltoolkit时如何提高响应速度和阻止timeout
- 如何提高页面响应速度
- 使用fastcgi_finish_request提高页面响应速度
- 使用fastcgi_finish_request提高页面响应速度
- 深入浅出Symfony2 - 如何提高网站响应速度
- 使用fastcgi_finish_request提高页面响应速度
- android开发之提高应用启动速度_splash页面瞬间响应_避免APP启动闪白屏
- 优化页面性能的代码技术整理(提高网页响应速度必看)
- 提高AJAX客户端响应速度
- AJAX 客户端响应速度提高分析