2016-03-20 23:48:41    342    1    0

memcached介绍

memcache是danga.com的一个项目,最早是为 LiveJournal 服务的,目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力。它可以应对任意多个连接,使用非阻塞的网络IO。由于它的工作机制是在内存中开辟一块空间,然后建立一个HashTable,memcached自管理这些HashTable。为什么会有Memcache和memcached两种名称?
其实memcache是这个项目的名称,而memcached是它服务器端的主程序文件名。Memcache在高并发的情况下通过将热数据缓存到内存中来降低数据库的压力,这是目前很多网站使用Memcache的原因。

memcached的安装

memcached的安装非常简单,去官方网站下载http://memcached.org/downloads最新的memcached资源,安装方式很简单,官方例子。唯一比较不能接受的一点是,城外的网都比较慢

wget http://memcached.org/latest
tar -zxvf memcached-1.x.x.tar.gz
cd memcached-1.x.x
./configure && make && make test && sudo make install

启动memcached服务

进入到memcached的安装目录,然后通过daemon的方式启动起来。

localhost:Downloads MLS$ cd memcached-1.4.23
localhost:memcached-1.4.23 MLS$ ./memcached -d

检查memcached进程是否已经启动起来:

localhost:memcached-1.4.23 MLS$ ps -ef | grep memcached | grep -v grep
501  6978     1   0  9:37下午 ??         0:00.01 ./memcached -d

可以看到memcached服务以daemon的形式在后台运行,我们并没有制定端口和IP。memcach

2016-03-20 23:42:20    277    0    0

为什么要使用PHP自动加载

php自动装载就是根据需要自动加载php类,而不需要显示的include文件。在一个项目中,如果一个文件有过多的include依赖,那自动加载将会使这种情况变得好转。

  1. <?php
  2. include "/libs/Token.class.php";
  3. include "/libs/Auth.class.php";
  4. include "/libs/Db.class.php";
  5. include "/libs/Image.class.php";
  6. ...//更多加载
  7. class UserRegister {
  8. //code
  9. }
  10. ?>

写一堆include是不是很费劲?有的人可能会说还好,但是再看一个例子

  1. <?php
  2. require "libs/Memcache.class.php";
  3. require "libs/Redis.class.php";
  4. if(Config::getCacheMode() == "memcache"){
  5. $info = Memcache::get(1);
  6. }else{
  7. $info = Redis::get(1);
  8. }
  9. echo $info;

这个例子其实就是资源浪费了,因为无论如何,if-else只有一个分支回进去,当使用Memcache模式时,Redis引入进来是没有必要的;同样,当使用Redis模式时候,没有必要引入Memcache;
这时候,可以通过PHP的__autoload方法提供一种lazyload的机制,当第一次需要使用相关类时调用,这样就不会加载不必要的类。

实现自动加载的方式

__autoload方式

php应用中,当我们实例化类的时候,如果在当前文件中找不到这个类,php会自动执行一个函数__autoload;看下面的例子:

  1. <?php
  2. function __autoload($class){
  3. echo "自动执行我";
  4. }
  5. new Memcahce();
  6. ?>

运行php文件可以看到,__autoload函数被自动执行了,然后提示没有找这个类

  1. localhost:autoload MLS$ php index.php
  2. 自动执行我PHP Fatal erro
? MySQL ?    2016-03-02 22:30:27    297    0    0

数据库设计范式介绍

关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴德斯科范式(BCNF)、第四范式(4NF)和第五范式(5NF)

  • 第一范式(确保每列保持原子性)
    第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式

  • 第二范式(确保表中的每列都和主键完全依赖)
    需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中

  • 第三范式(在第二范式的基础上,消除传递依赖)
    需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关

当然还有更高的范式,单是它们的关系总是先满足1NF,然后在1NF上改进成2NF,以此类推,所以范式之间的关系可以用以下图表示:

第一范式

1NF是数据库设计的最基本范式,在关系型数据库中,如果一个域是原子的,并且该域的元素被认为是不可分的单元,我们就称符合这种设计的表满足1NF,比如下面一张商品表:
商品信息表

商品ID 商品名称 颜色 价格 商家名字 商家联系方式
1 韩版休闲裤 50.0 张三 13634589384
1 韩版休闲裤 60.0 张三 13634589384
2 欧式西装 140.0 李四 13234534543

这张表就符合1NF,每一列都不可再分。
1NF的缺点有以下
1. 数据冗余太大,商家名字和商家联系方式大量冗余
2. 更新异常,需要更改商家联系方式的时候,需要修改大量的信息
3. 插入异常,如果一个商家刚成立,没有发布商品,插入会导致异常
4. 删除异常,如果一个商家的商品全部删除,商家随着被删除
思考?
下面这收件地址张表符合1NF吗?

收件人 街道 详细地址
张三 江西省 赣州市 章贡区 钟楼大街 幸福小区503号楼22#

还有很

2016-02-23 11:34:31    4857    0    1

前言

本文目的旨在对http状态码含义做一个基本解释,不会太深入讨论每个状态码,由于每个http状态码的出现可能对应多种情况,本文可能也考虑不周全。总之,看完本文,能够对http状态码有一个更加直观的认知。本文的思路是一个状态码加一个重现例子的方式呈现。

坏境搭建

本文的测试需要的linux+nginx+PHP环境,可以不需要MySQL。搭建环境的资料如下:
lnmp.zip

http状态码分类

  1. 消息类(1字头)
  2. 成功类(2字头)
  3. 重定向类(3字头)
  4. 请求错误类(4字头)
  5. 服务器错误类(5、6字头)

中途可能会穿插nginx自定义的http状态码,nginx状态码本身不属于http状态码了,只是在nginx内部自己定义的一套状态码,但是在nginx日志中,却经常出现

请求错误类(客户端错误)

400

400的英文含义400 Request Header Or Cookie Too Large,顾名思义,头信息或者Cookie信息太多了
复现这个状态码只需要添加够长的头信息或者Cookie信息即可,构造一个curl请求:

curl --header "Cookie:sidisisidisidisisidisidisisidisidisisidisidisisidisidisisidisidisidisisidisisidisidisisidisidisisidisidisisidisidisisidisidisisidisidissidisisidisidisisidisidisisidisidisisidisidisisidisidisisidisidissidisisidisidisisidisidisisidisidisisidisidisisidisidisisidisidissidisisidisidisisidisi
? MySQL ?    2016-02-18 22:44:33    31441    1    2

前言

我们知道在MySQL中有3种类型可以表示实数,分别是float,double和decimal。关于如何合理得使用这三种类型,网上的答案也层出不穷。但是究竟该选择哪一种类型,好像并没有统一的答案,接下来,将通过一个例子来说明什么情况下选择float,什么情况下选择double,什么情况下选择decimal。相信对这个例子的剖析之后,你就会明白什么时候用什么样的类型

实数类型

举个例子

假如我们有一张表,用来存储用户的积分,表定义如下:

  1. CREATE TABLE `f` (
  2. `f1` float(10,2) DEFAULT NULL
  3. ) ENGINE=InnoDB DEFAULT CHARSET=utf-8

然后向这个表里插入131072.32的积分值,如下所示

  1. mysql> insert into f value (131072.32);
  2. Query OK, 1 row affected (0.00 sec)
  3. mysql> select * from f;
  4. +-----------+
  5. | f1 |
  6. +-----------+
  7. | 131072.31 |
  8. +-----------+
  9. 1 row in set (0.00 sec)

然后会惊奇的发现,这个用户的积分少了0.01,虽然这0.01的积分并不足于引起我们的注意,但是问题还是来了

  1. 丢失数据是否是正常现象?
  2. 为什么会少0.01,有没有可能少0.02,或者少1,少10甚至少100?
  3. 怎么样才能让我们的数据准确?

官方怎么看数据丢失

首先遇到问题,第一想到的就是官方找答案,我们翻阅官方文档,关于float和double有这样一段描述

For FLOAT, the SQL standard permits an optional specification of the precision (but not the range of the exponent) in bits following the keywordFLOAT in parentheses. MySQL also supports this optional precisio

3/3