Memcache安装与入门

来源:互联网 发布:编程含金量最高的 编辑:程序博客网 时间:2024/05/18 00:11

简介

memcached 是一个灵活的内存对象缓存守护进程。它通过将对象缓存在内存中,从而降低WEB应用对数据库的压力。它基于 libevent 库,可以伸缩到任意大小,并永远使用非阻塞的网络I/O。因此在使用 memcached 的机器上应避免使用虚拟内存(swap)

下载与安装Memcache

下载memcache的windows版本,解压放某个盘下面。如我解压到D:\sotf\目录下。可以看到,有如下目录,其实除了memcached.exe,其它文件与目录都可以删除。
这里写图片描述
其实,到这里在win下,Memcache已经安装好了。就这么简单。
现在,可以进行相应的操作,首先我们来查询一下Memcache帮助命令:
这里写图片描述
参数描述:
-s file
指定在那个文件上监听 Unix socket (不使用TCP/IP网络)
-a perms
指定”-s”选项创建的 Unix socket 文件的权限(八进制)
-l ip_addr
在指定的 ip_addr 上监听,默认是所有可用地址(INADDR_ANY)。这是一个重要的选项,因为没有其它更多的访问控制方法。出于安全考虑,建议绑定到内网接口或者有防火墙保护的网络接口。
-d 以守护进程的方式运行(后台运行)
-u username
指定以 username 用户的身份运行,该选项仅在以root用户启动时有效。
-m num
使用 num MB 大小的内存作为缓冲区,默认值是 64MB
-c num
最大允许 num 个并发连接,默认值是 1024
-R num
这是一个为了防止某些客户端被饿死而设置的选项。num 的默认值是”20”。参数 num 表示服务器在同一个连接内最多连续处理 num 个请求。一旦某连接连续处理的请求数超过了 num 的限制,服务器将会转而去处理其他连接的请求, 直到其他连接的请求全部处理完毕(或者也达到了上限)之后,才会回过头来继续处理此连接上剩余的请求。
-k 锁定所有分页内存(paged memory)。这个选项在缓冲区比较大的时候使用可能会有些危险。
-p num
在TCP端口 num 上监听,默认值是 11211
-U num
在UDP端口 num 上监听,默认值是 11211 ,0 表示关闭
-M
禁止在缓冲区不够用的时候自动移除缓存对象。这样将会导致缓冲区满时无法添加新对象。
-r
将核心文件尺寸限制加大到最大值
-f factor
将 factor 用作计算每个缓存项所占内存块大小的乘数(multiplier)。默认值是”1.25”。也许较小的乘数会减少内存的浪费,但实际效果取决于可用内存总量以及不同缓存项大小的分布状况。
-n size
最少为每个缓存对象的”key, value, flags”分配 size 字节。默认值为 48 。如果你有大量的小”key,value”对,减小此值将会大大提高内存的利用效率。另一方面,如果你使用”-f”选项指定了较大的块膨胀系数(chunk growth factor),那么你应当增加此值以让更高比例的缓存项更适合稠密的压缩内存块。
-C
禁止使用CAS(可以为每个缓存项节约8个字节的空间)
-h
显示版本号和选项列表后退出
-v
在事件循环过程中打印详细的错误和警告消息
-vv
显示更加详细的消息,也就是在”-v”的基础上打印客户端命令和应答
-i
打印 memcached 和 libevent 的许可证
-P filename
将进程号(PID)保存在 filename 中,仅在使用了”-d”选项后才有意义。
-t threads
使用 threads 个线程来处理接入请求。将此值设置为超过总的CPU核心数只会弄巧成拙。默认值是 4 。
-D char
使用 char 作为key前缀和ID之间的分隔符,这将用于每一个前缀状态报告。默认值是冒号(:)。明确指定此选项后状态收集器将被自动打开,否则可以通过向服务器发送”stats detail on”命令来开启。
-L
尽量使用大内存页(如果可用)。使用大内存页可以增大TLB缓存命中概率,从而提升内存性能。此选项仅在内核支持大内存页(CONFIG_TRANSPARENT_HUGEPAGE,CONFIG_HUGETLBFS)的系统上有意义。
-B proto
指定要使用的绑定协议。默认值”auto”表示由服务器与客户端进行协商。而”ascii”和”binary”则明确表示仅允许使用确定的协议。
-I size
指定每个slab/slub页的默认大小。默认值是”1m”。允许的最小值是”1k”,允许的最大值是”128m”。改变此项同时也改变了每个缓存项的尺寸上限。增大此项的同时也增大了slab/slub页的数量(可以使用 -v 查看),以及 memcached 的内存总使用量。
-F
禁用”flush_all”命令。cmd_flush 计数器仍然会增加,但是客户端将会收到”刷新动作未被执行”的错误消息。
-o options
逗号分隔的扩展或实验性选项的列表。参见 -h 或 wiki 以获取这些选项。

启动Memcache

运行memcache命令即可启动memcache服务。
这里写图片描述

连接Memcache与数据操作

通过Telnet

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

增加数据

使用add命令
add key flag expire length
数据

解析:key给值取的一个唯一的名字
flag标志。因为memcached 基于文本协议,传输的东西,可以理解成字符串来存储。那么存储与读取类似对象这样的东西,就需要序列化与反序列化。
expire 有效期
length 缓存的长度(字节为单位)
实例:往memcache里面添加保存一个姓名,stu_name为dq
这里写图片描述
可以看到,因为前面我们开启了回显功能,每次存一个数据,会在服务器开启的窗口显示出来。

查询数据

使用get命令
语法 get key
实例:从memcache中取出key为stu_name的值
这里写图片描述

修改数据

使用replace或者set命令。两者不同处在于,set 想当于有add replace 两者的功能。如果服务器无此键—-> 增加的效果
如果服务器有此键—-> 修改的效果.
使用replace
这里写图片描述
使用set
这里写图片描述

删除数据

使用delete
语法如下:
delete key [time seconds]
解析:删除指定的key. 如加可选参数time,则指删除key,并在删除key 后的time 秒内,不允许get,add,replace 操作此key.
这里写图片描述

通过PHP

下载与配置

1.要想通过php访问Memcache数据库,首先得需要
php_memcache.dll文件下载地址如下:
http://windows.php.net/downloads/pecl/releases/memcache/3.0.8/
注意,选择兼容你当前php版本的dll文件下载。
下载完成后,将其置于php安装目录下的ext文件中。
这里写图片描述
我选择了如下版本
这里写图片描述
ts代表线程安全,可以在apache上运行。
nts代表非线程安全,运行在cgi模式下。
2.配置
在php.ini文件中,添加如下一句话
extension=php_memcache.dll
3.测试配置
在php中输出phpinfo();如果有如下内容,则配置ok了。
这里写图片描述
好了现在就准备好。可以进行对Memcache中数据进行操作了。关于memcache数据操作,手册(http://php.net/manual/zh/book.memcache.php)上说的也相当清楚。有的时候,个人感觉,手册上讲的比有的书上说的更透彻一些。PHP中的Memcache扩展模块提供了Memcache类,操作memcache数据。该类的结构如下:

Memcache {bool add ( string $key , mixed $var [, int $flag [, int $expire ]] )bool addServer ( string $host [, int $port = 11211 [, bool $persistent [, int $weight [, int $timeout [, int $retry_interval [, bool $status [, callback $failure_callback [, int $timeoutms ]]]]]]]] )bool close ( void )bool connect ( string $host [, int $port [, int $timeout ]] )int decrement ( string $key [, int $value = 1 ] )bool delete ( string $key [, int $timeout = 0 ] )bool flush ( void )string get ( string $key [, int &$flags ] )array getExtendedStats ([ string $type [, int $slabid [, int $limit = 100 ]]] )int getServerStatus ( string $host [, int $port = 11211 ] )array getStats ([ string $type [, int $slabid [, int $limit = 100 ]]] )string getVersion ( void )int increment ( string $key [, int $value = 1 ] )mixed pconnect ( string $host [, int $port [, int $timeout ]] )bool replace ( string $key , mixed $var [, int $flag [, int $expire ]] )bool set ( string $key , mixed $var [, int $flag [, int $expire ]] )bool setCompressThreshold ( int $threshold [, float $min_savings ] )bool setServerParams ( string $host [, int $port = 11211 [, int $timeout [, int $retry_interval = false [, bool $status [, callback $failure_callback ]]]]] )}

连接memcacehe

运行下面代码如下:

$host="127.0.0.1";$port='11211';//创建memcache类,用于连接memcache服务器$memcache=new Memcache();//打开连接if($memcache->connect($host,$port)){    echo '当前版本为:', $memcache->getVersion(),'</br>';}else{    die('连接失败');}//关闭连接$memcache->close();

若输出如下效果,代表,已经成功连接上了memcache
这里写图片描述

增加数据

使用add方法
运行下面代码:

$host="127.0.0.1";$port='11211';//创建memcache类,用于连接memcache服务器$memcache=new Memcache();//打开连接if($memcache->connect($host,$port)){    $dqs=new Student('dqs',16);    //保存$dqs    $rs=$memcache->add ('dqs',$dqs);    if($rs){        //保存ok了        var_dump('数据保存ok');    }else{        die('数据保存失败');    }}else{    die('连接失败');}//关闭连接$memcache->close();//创建一个类,待会将其实例保存到memcache中class Student{    private $name=null;    private $age=0;    function __construct($name,$age){        $this->name=$name;        $this->age=$age;    }    public function getName(){        return $this->name;    }    public function getAge(){        return $this->age;    }}

通过浏览器查看
这里写图片描述
这时候,我们通过telnet,可以查看到该数据,很明显是经过序列化了,内容如下:
这里写图片描述

查询数据

现在,我们要操作的是将上面保存的Student实例取出来。
执行如下代码:

$host="127.0.0.1";$port='11211';//创建memcache类,用于连接memcache服务器$memcache=new Memcache();//打开连接if($memcache->connect($host,$port)){    $dqs=$memcache->get('dqs');    var_dump($dqs);    var_dump($dqs->getName());    var_dump($dqs->getAge());}else{    die('连接失败');}//关闭连接$memcache->close();class Student{    private $name=null;    private $age=0;    function __construct($name,$age){        $this->name=$name;        $this->age=$age;    }    public function getName(){        return $this->name;    }    public function getAge(){        return $this->age;    }}

注意此时类的定义不能删除,代码执行效果如下
这里写图片描述

修改数据

可以使用replace和set,至于两者区别,可以看上面。现在,我要修改dqs键所对应的值。
代码如下:

$host="127.0.0.1";$port='11211';//创建memcache类,用于连接memcache服务器$memcache=new Memcache();//打开连接if($memcache->connect($host,$port)){    $dqs=new Student('pps',13);    $rs=$memcache->replace('dqs',$dqs);    var_dump($rs);}else{    die('连接失败');}//关闭连接$memcache->close();class Student{    private $name=null;    private $age=0;    function __construct($name,$age){        $this->name=$name;        $this->age=$age;    }    public function getName(){        return $this->name;    }    public function getAge(){        return $this->age;    }}

效果如下:
这里写图片描述
这里写图片描述

删除数据

删除上面的数据,代码如下

$host="127.0.0.1";$port='11211';//创建memcache类,用于连接memcache服务器$memcache=new Memcache();//打开连接if($memcache->connect($host,$port)){    $rs=$memcache->delete('dqs');    var_dump($rs);}else{    die('连接失败');}//关闭连接$memcache->close();class Student{    private $name=null;    private $age=0;    function __construct($name,$age){        $this->name=$name;        $this->age=$age;    }    public function getName(){        return $this->name;    }    public function getAge(){        return $this->age;    }}

执行效果如下
这里写图片描述
这里写图片描述

总结

其实,无论连接的是MySQL还是MongoDB或是Memcache,它们的思路都是一样的。要融合贯通,相互比较。

2 0
原创粉丝点击