首页 > PHP,好久不见 > memcache入门
2016
01-20

memcache入门

写在前面

简介

  • memcache是一款开源软件,由LiveJournal的Brad Fitzpatrick开发,以BSD license授权发布。
  • 是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个巨大的hash表,将数据(包括图像、视频、文件以及数据库检索的结果等)调用到内存中,然后从内存中读取,从而大大提高读取速度。

特性

  • 非持久性存储
  • 定位于分布式存储,不适用于单机系统
  • 不支持List、Array等复杂的数据

Memcache和Memcached

  • 这款开源软件的项目名叫Memcache,Memcached (Memcached-Daemon的简称) 是软件的主程序名。
  • 在php中,有两个为memcache开发的扩展(客户端):Memcache扩展和memcached扩展。后者比前者要新,功能也比较多。推荐安装后者。

部署环境

安装memcache服务端

安装php扩展(客户端)

这里以安装memcached扩展为例,从官网下载最新版本,解压并cd到目录

编译安装

安装完后会提示安装的目录:

编辑php.ini文件

最后,重启web服务器和php-fpm
看看phpinfo()是否将memcached添加成功。我这里为了做测试编译了两个扩展,实际编译后者就可以。
memcache入门 - 第1张  | foam


简单使用

这里只介绍php中memcached类的使用。更多请参考手册


其他

Memcache的分布式缓存

Memcache尽管说是分布式缓存服务器,但其分布式却是由客户端实现的。
保存数据时,客户端会根据数据的键使用特定的算法(不同的客户端,算法不同)选择要保存的服务器,将其存入其中。获取数据时也是使用相同的算法在所在的服务器获取。这些客户端算法一般在Hash的基础上进行改良,保证其数据的分散性。
具体策略就不展开说明了。

Memcache与锁

在高并发的业务场景中,都会使用锁的概念。如:
场景一:一批cache同时过期,许多客户端同时并发请求cache。此时业务逻辑发现cache过期,会高并发下从DB同时请求数据并重新设置给memcache。整个过程都是高并发的,就如决堤,洪水汹涌袭来一般。对系统的负载能力将是巨大的挑战。
场景二:脏数据场景,有两个客户A和B。A发送投票请求,服务器在12时00分00秒10毫秒取出当前票数100,在12时00分00秒15毫秒给当前票数自增1并保存。B发送投票请求,服务器在12时00分00秒12毫秒取出当前票数100,在12时00分00秒13毫秒给当前票数自增1并保存。总票数原本应该为102的实际上却是101。即使数据库上已经使用了锁的策略,但由于磁盘IO速度慢,仍然会导致读写脏数据的错误。如果锁的动作发生在内存上就不一样了。
我们可以用memcache实现简单的锁,重点在于memcache的add方法,如果cache上有相同的键了,add方法会返回false。下面是用php实现的简单锁。

Memcache和Memcached扩展互不兼容

NOTIC:这里指的是Memcache的两个php扩展

php.net上有人做了测试,两个扩展间由于调用的客户端库不同,存储的方式有一定的差异。
测试脚本:

 

结果是只有处理string的方式一样,其他数据结构都采用了不同的处理方式。因此两个扩展间是不能相互切换的。

Last:还有许多值得说的地方,日后若有memcache的相关内容可能会补充进来。以上内容若存在错误的地方,请留言或发邮件指正错误,谢谢。

最后编辑:
作者:foam
foam
这个作者貌似有点懒,什么都没有留下。

留下一个回复

你的email不会被公开。