Nov 2, 2017 - 代码迁移之旅(一)- 项目结构

3547 Word Count

起因 之前说过自己被分配了一个重构代码的任务: 这是一个有6、7年历史,多人经手的老系统,PHP 语言,分布在50台机器上运行。代码使用最简单的结构,没有使用任何完整框架,甚至有三四千行代码的文件,修改时最新的 IDE 都无法帮得上忙,发生问题时排查困难。特别是程序员在写代码时,想引用之前的方法找不到,自己定义新的方法又无处放,只好在已经很杂乱的文件上堆砌。 由于此系统一直在运行中,甚至各机器日顶峰QPS有近1000,而且作为一个业务系统,之前甚至没有CR,里面遍布一些比较“奇怪”的逻辑和写法,看得人头皮发麻,迁移这个系统无异于给行驶的汽车换轮子。 写跟此项目迁移...

Oct 17, 2017 - Linux“体检”指标

3331 Word Count

前言 在“求佛保佑服务器不宕机”、“杀程序员祭天”的环境下,程序员每天可谓是战战兢兢,接到电话和短信都吓得瑟瑟发抖,为了我们的安全,及时发现服务器运行问题已不仅仅是运维的问题了。今天总结一下常见的服务器监控指标,希望各位开发人员都搞一个脚本运行着以保障自己的生命安全。 转载随意,文章会持续修订,请注明来源地址:[https://zhenbianshu.github.io](https://zhenbianshu.github.io) 。 获取服务器信息 多台机器同时需要监控时,每台机器都需要运行一个监控程序,我们首先要获取服务器的信息以分...

Oct 9, 2017 - Redis “瘦身”指南

3768 Word Count

前言 Redis 应该是开发者最常用的缓存服务器了,它丰富的数据结构,快速高效的内存操作能帮助开发者迅速完成复杂功能的设计,可以说让人一旦使用过后很难再离开它了,甚至在一些业务中,完全可以用 Redis 替代传统的关系型数据库 Mysql。 作为一个内存型数据库,Redis 经常会遇到内存问题,今天我们来谈一下 Redis 常见的内存满的问题,介绍一下给 Redis “瘦身”的通用方式。 转载随意,文章会持续修订,请注明来源地址:[https://zhenbianshu.github.io](https://zhenbianshu.github.io) 。 Re...

Sep 11, 2017 - 设计模式,Let's “Go”! (下)

3164 Word Count

前言 接上篇 设计模式,Let's “Go”! (中), 继续更新设计模式,今天介绍的设计模式有责任链模式、蝇量模式、解释器模式、中介者模式、备忘录模式、原型模式和访问者模式; 文章对设计模式的特点和使用场景进行了总结,每个设计模式分配的篇幅较少,给了解过设计模式的作为速查,帮不了解设计模式的入门, 当然具体实现才是重点,使用现实生活中的事物例子来帮助理解设计模式。 搭配源码食用更佳,放上 Go 实现设计模式的源码地址:DesignPattern-枕边书-Github ,偶有更新,欢迎 star。 转载随意,文章会持续修订,请注明来源地址:[https://zhe...

Sep 6, 2017 - 扩充你的工具箱 - 大行文件的处理

2693 Word Count

前几天,从 DBA 手里接到一个 Redis RDB 文件,里面是 15G 约 660万 的 Redis 键值对数据,想通过这些数据提取出当前 Redis 的 Key 和这些 Key 的类型。其文件的每行结构类似于: KEY: IAmATestKey || TYPE: STRING || expiretime:-1 || value:IAmTheTestValue 下文就是此问题的跳坑和脱坑过程: 转载随意,文章会持续修订,请注明来源地址:[https://zhenbianshu.github.io](https://zhenbianshu.github.io) 。 通用解决方案不好使...

Aug 29, 2017 - 设计模式,Let's “Go”! (中)

3356 Word Count

前言 接上篇 设计模式,Let's “Go”! (上), 继续更新设计模式,今天介绍的设计模式有模板模式、迭代器模式、组合模式、状态模式、代理模式、桥接模式和建造者模式; 文章对设计模式的特点和使用场景进行了总结,每个设计模式分配的篇幅较少,给了解过设计模式的作为速查,帮不了解设计模式的入门, 当然具体实现才是重点,使用现实生活中的事物例子来帮助理解设计模式。 放上 Go 实现设计模式的源码地址:DesignPattern-枕边书-Github ,偶有更新,欢迎 star。 转载随意,文章会持续修订,请注明来源地址:[https://zhenbianshu.git...

Aug 21, 2017 - 设计模式,Let's “Go”! (上)

3598 Word Count

前言 最近读了《Head First 设计模式》,每天早上看一章,学习一个设计模式,做些笔记,然后晚上抽空用刚学习的 Go 语言实现一下。半个月下来书读完了,留下了一些笔记,写博客总结一下。 书中的例子都是 Java 写的,但几乎没使用 Java 语言的特性,很容易看懂。对于我来说,就是一个 PHP 开发工程师,读了一本 用 Java 语言实现设计模式的书,然后用 Go 写了一遍。。。=_= 本文为每个设计模式只分配了一小节,总结一下设计模式的概念和特点以及适用场景,并介绍了自己用代码实现时的列举的例子,用现实生活中的事物对比加深一下记忆 ( 代码实现中所有的例子都是自己原创的,有牵强的...

Jul 31, 2017 - PHP 调用 Go 服务的正确方式 - Unix Domain Sockets

4661 Word Count

问题 可能是由于经验太少,工作中经常会遇到问题,探究和解决问题的过程总想记录一下,所以我写博客经常是问题驱动,首先介绍一下今天要解决的问题: 服务耦合 我们在开发过程中可能会遇到这样的情况: 进程依赖于某服务,所以把服务耦合在进程代码中; 服务初始化耗时长,拖慢了进程启动时间; 服务运行要占用大量内存,多进程时内存损耗严重。 如我上篇文章 小时到分钟 - 一步步优化巨量关键词的匹配 中介绍的文本匹配服务,它是消息处理流程中的一环,被多个消息处理进程依赖,每次初始化进程要 6秒 左右时间构造 Trie 树,而且服务读取关键词大文件、使用树组构造 Trie 树,会...

Jul 11, 2017 - 小时到分钟 - 一步步优化巨量关键词的匹配

7825 Word Count

问题由来 前些天工作中遇到一个问题: 有 60万 条短消息记录日志,每条约 50 字,5万 关键词,长度 2-8 字,绝大部分为中文。要求将这 60万 条记录中包含的关键词全部提取出来并统计各关键词的命中次数。 本文完整介绍了我的实现方式,看我如何将需要运行十小时的任务优化到十分钟以内。虽然实现语言是 PHP,但本文介绍的更多的思想,应该能给大家一些帮助。 原始 - grep 设计 一开始接到任务的时候,我的小心思立刻转了起来,日志 + 关键词 + 统计,我没有想到自己写代码实现,而是首先想到了 linux 下常用的日志统计命令 grep。 grep命令的用法不再多提,使用...

Jul 11, 2017 - Linux - 请允许我静静地后台运行

5073 Word Count

前言 常在 linux 下玩耍的开发者肯定会经常遇到需要对进程调度的情况,在 windows 中点击 最小化 去干别的就 OK 了,那么在 linux 下怎么办呢。 可能有的小伙伴会说,再开一个终端窗口不就好了么。可是开很多窗口管理会很不方便,还有万一手贱点了x,或者长时间不操作,远程终端断开了连接,进程停止了,再次打开,又是一番折腾。 今天来介绍几个命令,帮大家系统地梳理一下 linux 的进程调度,并附上一些自己的使用心得和踩过的坑。 名词 在此之前,我们必须(当然也不是必须,但了解原理有利于理解和解决错误)先弄懂几个名词。 进程组 进程组是一个或多个进程的集合,进程组方便了对多个进...