算法相关的入口

转载自博客园 --感谢原来的博主 浅谈算法和数据结构: 一 栈和队列 - 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)…

【转载】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,并且里面存在中文. 解析出来的数组中,中文字符串出现表示不完全的问题. 原始数据是:…

影响HTTP1.1的几个TCP特征

1,握手延迟. 每次建立一个HTTP请求 都需要重新建立一个TCP的连接通道,建立TCP链接通道是需要代价的 .三次握手. 并且服务端和客户端之间维护多个TCP连接需要一定的资源消耗. 2,分组确认(窗口滑动概念.) TCP数据包在网络上传输是不可靠的,这样的情况下TCP有自己的传输保证机制.滑动窗口确认. 在服务端和客户端都会维护一个滑动窗口,当数据包发送后对方确认的时候会回传一个小的确认包.当收到确认包之后才会继续发送新的数据.并且滑动窗口向前滑动. 用于确认的包很小.所以由正常的数据包捎带完成确认.但是HTTP的特征使得确认包找不到一个能够搭载的数据帧,出现等待情况.数据包得不到确认.导致数据不能够及时完成传输.窗口不会出现滑动. 3,TCP慢启动问题 为防止网络拥塞.TCP链接在建立之后想要传输数据.需要实现 发送一个包,确认了一个包才能发两个包,确认了两个包,才能发四个包以此类推. 是为了防止出现网络拥塞,控制流量来设计的. 4,Nagle算法.  TCP_NODELAY 全尺寸包先发.非全尺寸包最后发. 针对HTTP的应用场景这个策略并不适用. 是为了预防.**发送端傻窗口综合征** 来设计的.…

HTTP2.0 nginx部署

第一步,准备材料: nginx1.9.5+版本,我使用的版本是1.10.2http2.0在主流浏览器上面都必须是 http2 over TLS(传输层安全协议). 而http2的协商机制是需要在TLS协商完成,建立起来安全连接后完成协商的,所以需要通过TLS的扩展(ALPN)完成协商.而只有在openssl1.0.2+后才会支持ALPN.SO... 具体的HTTP2的协商问题可以查看QUQU的这篇文章.[1] 需要一个openssl/或者LibreSSL(如果你的机器上面的额openssl是1.0.2+版本的话应该没问题.否则需要单独一个openssl然后通过编译过程中指定来用这个新的. openssl1.0.2j Libressl2.5.0TLS也同样意味着你需要证书来实现你的HTTPS化. 需要给你的域名申请证书.可以在这里申请. 申请验证通过后需要再合并certificate.crt和ca_bundle.crt. cat a b >c.…