原始地址见 这里

本文是工作中一点点简单的思考,不能保证是完全正确的,可能也仅仅是适用于部分场景。

场景 1:获取用户关注的好友列表中,每个好友的名字、头像等信息。

在很多公司中,不同的服务是由不同的人甚至是不同的部门维护的,这中间会通过一些定义好的接口进行交互(这里就用 RPC接口来说明了)。假设我们的服务是维护用户的关注关系,而用户的基本信息会维护在用户服务中。用户服务提供了如下两个接口:

get_user_info(user_id):
return {name='name', avatar='avatar'} batch_get_user_info(user_ids):
return map{user_id=user_info, user_id2=user_info}

假设我们提供给用户的关注好友列表,开始的时候是先获取用户的所有关注好友,然后依次去获取每个关注好友的信息,则提供给用户的接口 P95 可能会是 300ms,初始伪代码如下:

def get_following_info():
following_ids = [1, 2, 4, 5]
user_infos = []
for f_id in following_ids:
user_infos.append(get_user_info(f_id))
return user_infos

我们知道,和 IO 比起来,一般来说,内存计算要快得多,所以,针对以上代码,我们可以使用批量接口,直接获取到所有的用户信息。

def get_following_info():
following_ids = [1, 2, 4, 5]
return batch_get_user_info(following_ids)

使用了以上代码之后,可能接口的性能会提高到 100 ms,此外,由于网络 IO 的减少,接口的错误也会少了很多。这就是一个优化。

当然,如果一个用户关注了很多的好友,可能没办法一次获取到所有的好友消息,这时候就需要分页了。

场景2: 批量查询表中数据

一般情况下,应用服务器和数据库存储并不是在同一台服务器上,如果要进行数据库的查询操作,很多时候就需要通过网络来进行。

对于 MySQL 来说,数据是按照主键来进行物理存储的,如果表中没有主键,则会设置一个默认的主键。二级索引都会查询到主键之后,再次回表查询。也就是说,根据主键,可以认为更快的进行数据的查询。对于下面的表,如果我们想进行表的扫描,获取到 user_id,则可以首先获取到表的最大和最小主键 ID,然后批量获取两个 ID 之间的数据。

CREATE TABLE `user_name` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id',
`user_id` bigint(20) NOT NULL COMMENT ' 用户 id',
`user_name` varchar(64) NOT NULL COMMENT '姓名',
PRIMARY KEY (`id`),
UNIQUE KEY `unq_uid` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; select max(id) from `user_name`;
select min(id) from `user_name`;

获取到了最大最小的 ID 之后,就可以批量获取两个 ID 之间的数据了,不过多数情况下,两个 ID 之间是有几百万甚至上亿数据的,这时候就需要在程序中设置一个阈值,避免一下获取太多,反而减缓速度,甚至没法获取到。当然,一次获取数据太多,内存也可能存在不足的问题了。

select user_name from `user_name` where 0 < id < 200;

这样一来,只需要在程序中设置好每次查询的数据量,就可以一次查询多条数据了。

通过减少 IO 实现性能的优化的更多相关文章

  1. Java性能之优化RPC网络通信

    服务框架的核心 大型服务框架的核心:RPC通信 微服务的核心是远程通信和服务治理 远程通信提供了服务之间通信的桥梁,服务治理提供了服务的后勤保障 服务的拆分增加了通信的成本,因此远程通信很容易成为系统 ...

  2. python面试总结3(性能分析优化,GIl常考题)

    python性能分析和优化,GIL常考题 什么是Cpython GIL Cpython解释器的内存管理并不是线程安全的 保护多线程情况下对python对象访问 Cpython使用简单的锁机制避免多个线 ...

  3. [转帖]Java虚拟机(JVM)体系结构概述及各种性能参数优化总结

    Java虚拟机(JVM)体系结构概述及各种性能参数优化总结 2014年09月11日 23:05:27 zhongwen7710 阅读数 1437 标签: JVM调优jvm 更多 个人分类: Java知 ...

  4. Windows五种IO模型性能分析和Linux五种IO模型性能分析

    Windows五种IO模型性能分析和Linux五种IO模型性能分析 http://blog.csdn.net/jay900323/article/details/18141217 http://blo ...

  5. Java性能 -- Lock优化

    Lock / synchronized Lock锁的基本操作是通过乐观锁实现的,由于Lock锁也会在阻塞时被挂起,依然属于悲观锁   synchronized Lock 实现方式 JVM层实现 Jav ...

  6. 在ASP.NET Core中用HttpClient(四)——提高性能和优化内存

    到目前为止,我们一直在使用字符串创建请求体,并读取响应的内容.但是我们可以通过使用流提高性能和优化内存.因此,在本文中,我们将学习如何在请求和响应中使用HttpClient流. 什么是流 流是以文件. ...

  7. fir.im Weekly - APP 性能监测优化 二三事

    每一个成功的 App,都拥有强大的性能体验.本期 fir.im Weekly 整理了微信读书.美团外卖. 天猫.美团点评技术团队的关于性能监测优化方面策略和工具的分享,一起来看看. 微信读书 iOS ...

  8. paip.提升性能---mysql 优化cpu多核以及lan性能的关系.

    paip.提升性能---mysql 优化cpu多核以及lan性能的关系. 作者Attilax  艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http:/ ...

  9. php性能效率优化

    [size=5][color=Red]php性能效率优化[/color][/size] 最近在公司一边自学一边写PHP程序,由于公司对程序的运行效率要求很高,而自己又是个新手,一开始就注意程序的效率很 ...

随机推荐

  1. SignalR简单实用_转自:https://www.cnblogs.com/humble/p/3851205.html

    一.指定通信方式 建立一个通讯方式需要一定的时间和客户机/服务器资源.如果客户机的功能是已知的,那么通信方式在客户端连接开始的时候就可以指定.下面的代码片段演示了使用AJAX长轮询方式来启动一个连接, ...

  2. mac使用poetry

    安装 为了防止依赖冲突不推荐使用pip的方式直接安装,当然你也可以这样做 curl -sSL https://raw.githubusercontent.com/sdispater/poetry/ma ...

  3. ubuntu之路——day1(一点十五分 MMP终于把显卡装好了)

    因为要上手深度学习的原因,购置了一台RTX2080TI+ubuntu18.04的机器 例行两条命令 sudo apt-get update sudo apt-get upgrade 开启巨坑第一天,以 ...

  4. 三大框架 之 OGNL表达式

    目录 OGNL 什么是OGNL OGNL与EL表达式对比 OGNL功能 OGNL使用要素 OGNL入门 java程序使用ognl struts2中使用ONGL OGNL 什么是OGNL OGNL是Ob ...

  5. 小福bbs-冲刺日志(第二天)

    [小福bbs-冲刺日志(第二天)] 这个作业属于哪个课程 班级链接 这个作业要求在哪里 作业要求的链接 团队名称 小福bbs 这个作业的目标 UI重构完成 作业的正文 小福bbs-冲刺日志(第二天) ...

  6. python3+requests get/post 请求

    1.get请求 (1)没有请求参数类型 1 response = requests.get(url='') 2 print(response.text) (2)有请求参数的类型(键值对形式表示参数) ...

  7. pyinstaller参数介绍以及总结

    最近利用tkinter+python+pyinstaller实现了小工具的项目,在此记录下pyinstaller相关参数以及爬过的坑. 一.pyinstaller相关参数 -F, –onefile 打 ...

  8. 谷歌分析(Google Analytics) 是什么

    谷歌分析(Google Analytics) 是什么 一.总结 一句话总结: 谷歌分析,即大家俗称的ga,全称google analytics,是谷歌推出的网站流量分析工具,可以说是当前业界最强大的流 ...

  9. web文件上传,带进度条

    原生ajax上传带进度条 (百分比) <%@ page language="java" contentType="text/html; charset=UTF-8& ...

  10. Eclipse 的快捷键以及文档注释、多行注释的快捷键 一、多行注释快捷键

    一.多行注释快捷键 1.选中你要加注释的区域,用ctrl+shift+C 或者ctrl+/ 会加上//注释2.先把你要注释的东西选中,用shit+ctrl+/ 会加上/*    */注释 3.以上快捷 ...