找到你系统中的瓶颈

引言:提到服务端编程,很多时候写的就是IF/ELSE,一些简单的CURD操作。作为服务端编程的同学,每天面对的很多是很简单的逻辑,简单的逻辑里面又有着不同寻常的事情。 海量请求的情况下,就会发生量变引起质变的过程。如何优化你的系统,优化你的接口,优化你的服务。让你的服务跑的更欢快。下面一起来讨论一下。 ROUND 1  最简单的系统能想到的最最简单的系统,可能就是简单的静态网站了,只要有一个web服务器,就能够实现服务。 举个例子: 简单的静态宣传页面。大网站的静态页面。 静态页面的整个服务流程中,从请求的发起到正常的响应,整体流程很简单。 用户通过URL发起一个域名相关的请求; 请求到达DNS服务器,找到相关的ip地址。通过ip访问主机,获取数据,得到数据后访问设备(浏览器)通过数据去渲染。用户就看到了最终的呈现。 我们来假设一个系统,有一个某公司的宣传页面。是一个单纯的静态页面,部署于单机的一台静态服务器上面。页面上面设计比较多的静态资源(图片,js文件等。) 如果你发现你的静态单页面访问速度不是很理想,访问速度比较慢,加载比较慢等等问题。 能出问题的方向无非下面几个: DNS解析时间过长: dns的解析时间。优化dns服务器,…

算法相关的入口

转载自博客园 --感谢原来的博主 浅谈算法和数据结构: 一 栈和队列 - yangecnu - 博客园 浅谈算法和数据结构: 二 基本排序算法 - yangecnu - 博客园 浅谈算法和数据结构: 三 合并排序 - yangecnu - 博客园 浅谈算法和数据结构: 四 快速排序 - yangecnu - 博客园 浅谈算法和数据结构: 五 优先级队列与堆排序 - yangecnu - 博客园 浅谈算法和数据结构: 六 符号表及其基本实现 - yangecnu - 博客园 浅谈算法和数据结构: 七 二叉查找树 - yangecnu -…

open-resty nginx_lua扩展文档

名称lua-resty-redis - 基于cosocket API为ngx_lua 开发的 lua连接redis 的链接库。 目录列表名称状态介绍用法方法newconnectset_timeoutset_keepaliveget_reused_timescloseinit_pipelinecommit_pipelinecancel_pipelinehmsetarray_to_hashread_replyadd_commandsRedis 认证Redis 事务负载均衡和故障转移调试自动记录错误问题列表限制安装TODO社区英文邮件列表中文邮件列表Bugs and Patches作者版权和协议查看更多状态可以被应用到生产环境。 介绍这个库是为nginx的拓展 ngx_lua 写的,用于通过lua操作redis的库。 http://wiki.nginx.org/HttpLuaModule //nginx_lua_module地址。 受益于ngx_lua 的 cosocket API,这个库能够在完全非阻塞的模式下运行。 版本支持: 需要ngx_lua 0.5.14以上 或…

PHP连接redis无法使用长连接,ZTS导致的问题

问题现象: 线上的php在流量高峰等情况下出现redis连接proxy失败的情况,随着流量增长连接失败数量会增长。 虽然对线上的服务造成的影响很小,担心问题随着流量增长有增加趋势,可能会进一步引发线上问题。 问题排查与分析: 统计REDIS连接失败的数量,发现连接失败随流量增长有增加趋势。 查看redisproxy的session情况。加群里面咨询其他语言连接池的实现方式是否有连接失败情况。 收集到信息如下: golang集群连接失败一周内偶现几条。php集群一天内千条左右。 结论:跟php本身的语言有关系。 检查php连接redis的类   发现如下代码: 代码释义:在php7版本中使用长连接。在php5版本中使用短连接。 分析:如果按照长连接的方式。以php的实现方式。长连接会将连接的套接字信息存储在工作的worker进程的内存空间内。 PHP 生命周期见博客:https://www.kancloud.cn/digest/php-src/136264 此内存在  MSHUTDOWN  阶段时才会清理 。具体可见博客:https://anyof.me/articles/533 分析。 php-redis和myssql的长连接分析见:http://blog.aimager.com/post/…

php单例模式

写一个单例模式的demo <?php /** * 单例模式demo * 然而用处并不大 */ class Single { private static $instance; private function __construct(){ return false; } /** * [getInstance description] * @return [type] [description] */ final public function getInstance(){ if(!self::$instance instanceof self) { self::$instance = new self(); } return self::$instance; } /** * 防止对象被克隆 * @return [type] [description] */ function __clone(){ unset(self::$instance); return false; } /** * 防止被序列化 * @return array…

mysql日志查看

日常工作中总会查看一些sql语句到底在数据库里面是如何操作的,其实mysql会提供一些相关的功能.来实现我们对查询的跟踪工作. 第一种: 查看当前正在执行的查询SHOW PROCESSLIST; 在mysql里面直接输入这个命令能够查看当前正在执行的查询,包括查询的一些状态,能够确定表现在的状态.  针对一些查询慢.可以先研究下这个命令分析下原因. 第二种,查看概要日志.在mysql的shell里面  输入 show variables like '%general%'; 此时会显示概要日志的状态.   有两个变量被显示出来 分别是 general_log_file general_log 第一个变量标识概要日志的存储路径 第二个变量标识当前概要日志是否开启 . 使用命令 set @@global.general_log=1; 和命令 set @@global.general_log_file=/home/users/someone/xxx; 能够指定日志是否开启和指定日志的存储路径. 第三种,binlogbinlog是mysql提供的一种二进制日志文件,…

intval 方法bug一枚

日常工作中遇到的在日常的工作中,很少用到bigint类型的  ,尤其是无符号的BIGINT类型的. 有一些时候当用到了这个类型.一定要格外小心. 整体业务逻辑: 1,从csv中取出一行数据 2,通过PHP做 一部解析然后插入到数据库 3,最后在前端通过PHP代码提供一组接口. 出现的问题:有一组id是采用bigint类型存储的,发现有一部分数据没办法被更新或者插入到数据库的数据错误. 排查:查看数据库数据类型:   bigint(20) 无符号 查看csv里面的数值: 20位int型   14XX开头  . 把更新和插入的SQL找出来  发现有很多bigint这一列ID设置成了 9223372036854775807 想到这个数值好像有点不太对劲 上网找资料: 有符号的bigint 最大取值范围  -9223372036854775808 到 9223372036854775807 数据库里面的存储字段是bigint,无符号   最大表示  20位的 18446744073709551615 现象分析完了,那么原因就显而易见,   这个14xx开头的ID   超出了有符号bigint能表示的最大值. 哪里发生了问题? 查看代码  发现在插入数据库前 ,对这一列ID 使用了一个方法 intval(ID)…

AboutMe

基本资料:姓名: 张剑                  出生于: 1987年04月15日 手机号:(HEX16)  30E6A9113 2011年毕业于: 北京航空航天大学北海学院     -   软件与信息工程专业 (本科) 目前就职于: 百度健康(TO C)    曾经就职于 ,奇虎360(2010/09 - 2012/10), 猎豹移动(2012/12 - 2015/4),百度地图(2015/4 - 2019/5),作业帮(2019、5-2021/6),百度健康(2021/6 - now) 技术栈PHP: PHP,对PHP有深入了解。常用框架yaf(百度内AP)…

【转载】MySQL索引背后的数据结构及算法原理

原文地址 http://blog.codinglabs.org/articles/theory-of-mysql-index.html 摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题。特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等。为了避免混乱,本文将只关注于BTree索引,因为这是平常使用MySQL时主要打交道的索引,至于哈希索引和全文索引本文暂不讨论。 文章主要内容分为三个部分。 第一部分主要从数据结构及算法理论层面讨论MySQL数据库索引的数理基础。 第二部分结合MySQL数据库中MyISAM和InnoDB数据存储引擎中索引的架构实现讨论聚集索引、非聚集索引及覆盖索引等话题。 第三部分根据上面的理论基础,讨论MySQL中高性能使用索引的策略。 数据结构及算法基础 索引的本质 MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。提取句子主干,就可以得到索引的本质:索引是数据结构。 我们知道,数据库查询是数据库的最主要功能之一。我们都希望查询数据的速度能尽可能的快,因此数据库系统的设计者会从查询算法的角度进行优化。最基本的查询算法当然是顺序查找(linear search),这种复杂度为O(n)的算法在数据量很大时显然是糟糕的,好在计算机科学的发展提供了很多更优秀的查找算法,例如二分查找(binary…

php fgetcsv方法bug一例

在导入导出数据的时候常用的方法是: 让初始导入数据组织成csv格式.去除掉"," .然后读取合并导入 `` $fp = fopen(file); while($data = fgetcsv($fp)){ $res[] = $data; } return $data; fgetcsv方法在手册上面的解释是: 说明 array fgetcsv ( resource $handle [, int $length = 0 [, string $delimiter = ',' [, string $enclosure = '"' [, string $escape = '\' ]]]] ) 和 fgets() 类似,只除了 fgetcsv() 解析读入的行并找出 CSV 格式的字段然后返回一个包含这些字段的数组。 在导入导出的过程中遇到了如下的问题: CSV使用的编码格式是UTF8,并且里面存在中文. 解析出来的数组中,中文字符串出现表示不完全的问题. 原始数据是:…