• 【踩坑记录】记一次MySQL主从复制延迟的坑

    最近开发中遇到的一个MySQL主从延迟的坑,记录并总结,避免再次犯同样的错误。

    情景

    一个活动信息需要审批,审批之后才能生效。因为之后活动要编辑,编辑后也可能触发审批,审批中展示的是编辑前的活动内容,考虑到字段比较多,也要保存审批活动的内容,因此设计采用了一张临时表,审批中的活动写进审批表(activity_tmp),审批通过之后才把真正的活动内容写进活动表(activity)。表的简要设计如下,这里将活动内容字段合并为content展示:

    activity_tmp()
    id
    status // 审批状态    
    content //  审批阶段提交的活动内容
    
    activity
    id
    content // 审批通过后真正展示的活动内容
    

    Read more...
  • [源码学习]cjson库学习

    cJSON库是什么?

    cJSON是一个轻量级的json解析库。使用起来非常简单,整个库非常地简洁,核心功能的实现都在cJSON.c文件,非常适合阅读源代码来学习C语言。最近读完这个库的源码,分享自己收获的一些心得。

    什么是json,照搬json官网的说法:

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 这些特性使JSON成为理想的数据交换语言。

    Read more...
  • [深入学习Redis]RedisAPI的原子性分析

    在学习Redis的常用操作时,经常看到介绍说,Redis的set、get以及hset等等命令的执行都是原子性的,但是令自己百思不得其解的是,为什么这些操作是原子性的?

    原子性

    原子性是数据库的事务中的特性。在数据库事务的情景下,原子性指的是:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。【维基百科】

    对于Redis而言,命令的原子性指的是:一个操作的不可以再分,操作要么执行,要么不执行。

    Redis操作原子性的原因

    Read more...
  • [计算机网络]httpserver--如何解析HTTP请求报文

    这个http server的实现源代码我放在了我的github上,有兴趣的话可以点击查看哦。

    上一篇文章中,讲述了如何编写一个最简单的server,但该程序只是接受到请求之后马上返回响应,实在不能更简单。在正常的开发中,应该根据不同的请求做出不同的响应。要做到上述的功能,首先要解析客户端发来的请求报文。

    报文在不同的上下文情景下有不同的理解,本文所说的报文都是在HTTP上下文中描述的名词。

    HTTP报文是什么

    在HTTP程序中,报文就是HTTP用来搬运东西的包裹,也可以理解为程序之间传递信息时发送的数据块。这些数据块以一些文本形式的元信息开头,这些信息描述了报文的内容和含义,后面跟着可选的数据部分。

    报文的流动

    HTTP使用属于流入和流出来描述报文的传递方向。HTTP报文会像合水一样流动。不管时请求报文还是响应报文,都会向下游流动,所有报文的发送者都在接受者的上游。下图展示了报文向下游流动的例子。

    Read more...
  • [计算机网络]简易http server程序

    这个http server的实现源代码我放在了我的github上,有兴趣的话可以点击查看哦。

    好久没输出了,知识还是要写下总结才能让思路更加清晰。最近在学习计算机网络相关的知识,来聊聊如何编写一个建议的HTTP服务器。

    HTTP 服务器

    HTTP服务器,就是一个运行在主机上的程序。程序启动了之后,会一直在等待其他所有客户端的请求,接收到请求之后,处理请求,然后发送响应给客户端。客户端和服务器之间使用HTTP协议进行通信,所有遵循HTTP协议的程序都可以作为客户端。

    先直接上代码,然后再详细说明实现细节。

    Read more...
  • [代码大全读书笔记]如何定义一个好的变量名

    在日常编程中最烦恼的就是给变量取名,一段好代码,既要能完美地运行,还要能较容易地维护。这就意味着需要让日后维护代码的人能很快地看懂你的代码,而且,在团队合作中,其他开发者也会经常阅读你那部分代码。如果你的代码中充满了a,b,c,a1,a2,a3…那简直就是一个噩梦。因此,好的变量名非常重要。

    选择好变量名的注意事项

    变量和变量名本质上是同一件事物,因此,变量的好与坏就在很大程度上取决于它的命名的好与坏。

    下面举一个糟糕命名的例子

    $pp = ($cp > 1) ? ($cp - 1) : $cp;
    $np = ($cp < $tp) ? ($cp + 1) : $tp;
    
    $p = new P($pp, $cp, $np, $tp);
    

    Read more...
  • [PHP内核探索]PHP中的哈希表

    在PHP内核中,其中一个很重要的数据结构就是HashTable。我们常用的数组,在内核中就是用HashTable来实现。那么,PHP的HashTable是怎么实现的呢?最近在看HashTable的数据结构,但是算法书籍里面没有具体的实现算法,刚好最近也在阅读PHP的源码,于是参考PHP的HashTable的实现,自己实现了一个简易版的HashTable,总结了一些心得,下面给大家分享一下。

    笔者github上有一个简易版的HashTable的实现:HashTable实现

    另外,我在github有对PHP源码更详细的注解。感兴趣的可以围观一下,给个star。PHP5.4源码注解。可以通过commit记录查看已添加的注解。

    HashTable的介绍

    哈希表是实现字典操作的一种有效数据结构。

    Read more...
  • [PHP源码阅读]array_slice和array_splice函数

    array_slice和array_splice函数是用在取出数组的一段切片,array_splice还有用新的切片替换原删除切片位置的功能。类似javascript中的Array.prototype.splice和Array.prototype.slice方法。

    我在github有对PHP源码更详细的注解。感兴趣的可以围观一下,给个star。PHP5.4源码注解。可以通过commit记录查看已添加的注解。

    array_slice

    array array_slice ( array $array , int $offset [, int $length = NULL [, bool $preserve_keys = false ]] )
    

    返回数组中指定下标offset和长度length的子数组切片。

    Read more...
  • 红黑树探索笔记

    最近花了些时间重拾数据结构的基础知识,先尝试了红黑树,花了大半个月的时间研究其原理和实现,下面是学习到的知识和一些笔记的分享。望各位多多指教。本次代码的实现请点击:红黑树实现代码

    红黑树基础知识

    定义

    红黑树是带有 color 属性的二叉搜索树,color 的值为红色或黑色,因此叫做红黑树。

    对红黑树的每个结点的结构体定义如下:

    struct RBNode {
         int color;
         void *key;
         void *value;
         struct RBNode *left;
         struct RBNode *right;
         struct RBNode *parent;
    };
    

    Read more...
  • [PHP源码阅读]strtolower和strtoupper函数

    字符串的操作函数中,字符串的大小写转换也算是比较常用的函数,其底层实现也比较简单,下面来一探究竟。

    我在github有对PHP源码更详细的注解。感兴趣的可以围观一下,给个star。PHP5.4源码注解。可以通过commit记录查看已添加的注解。

    strtolower

    string strtolower ( string $string )
    

    将字符串转换成小写字符。

    Read more...