php操作memcache

来源:互联网 发布:织梦 编辑器字体修改 编辑:程序博客网 时间:2024/04/26 04:04

memory cache 内存缓存技术

Memcache或Redis是中间介质,可以帮助我们通过php语言实现对内存的操作

与redis区别

区别:
前者:
每个key的数据最大是1M
对各种技术支持比较全面,session可以存储memcache中,各种框架(例如thinkphp)对memcache支持的比较好
比较老牌、传统的内存缓存技术
适合存储简单、实用的数据
数据类型只有String
没有持久化
后者:
每个key的数据最大是1G
对各种技术支持没有memcache更好。
新兴的内存缓存技术
适合做集合计算(list/set/sortset)
数据类型较丰富(String/list/Set/Sort set/hash)
有持久化
联系: 数据存储在内存当中,数据模型都是key-value

两种内存缓存技术都要掌握,大家有各自擅长的地方
memcache:对session支持,各种框架支持
redis:集合计算

安装

win安装

下载memcached压缩包解压后生成文件
这是服务器端文件

到memcached.exe目录下运行memcached -help

通过设置参数开启memcache服务:

可以在windows任务管理器中看到memcache

开机启动

运行memcached -d install 安装memcached server
通过-d start开启服务 memcached -d start
停止和卸载服务
memcached -d stop
memcached -d uninstall

给php扩展目录ext拷贝对应的扩展文件,在php中开启memcache扩展
extension=php_memcache.dll
之后重启apache

linux安装

详情请见 http://blog.csdn.net/xiajiandong1024/article/details/71993606

php操作memcache

在php中memcache体现为“Memcache类”,在php手册中可以查看到memcache
具体使用:实例化对象,对象调用成员方法即可。

具体操作:
设置 : $obj -> set(key,value,是否有压缩0/1,有效期);
是否压缩:
不考虑速度,计较内存空间,压缩
计较速度,不计较内存空间,不压缩
有效期:
单位:秒
获取: $obj -> get(key);
删除: $obj -> delete(key);

连接memcache服务器

$mem=new Memcache();$flag=$mem->connect('127.0.0.1',11211);var_dump($flag);

key命名

key的名字可以有许多字符组成,长度不能超过250字节。
空格不能作为名字的组成内容。
(utf-8字符集的一个汉字是3个字节)

有效期

为0即不失效。
两种方式:
① 时间戳:1970-1-1号到目前的秒数
② 时间差:时间数字,从目前往后延伸的时间长度
时间差的值大到一定程度与时间戳的值可以保存一致
(限制:时间差最多不能多于30天,否则其为时间戳)

一个key的有效期为60天只能通过时间戳方式设置。

memcache中key的删除也是懒惰模式,如果超过有效期,该key还是存在的,当你get获取它的时候,其就消失了

各种数据类型的存储

php的数据类型(8种):
基本类型:int string boolean float
复合类型:array object resource null

基本类型 数据在memcache内部通过字符串存储
复合类型 数据在memcache中是原样存储
有的时候在memcache中需要把各种数据类型信息都变为字符串存储,就需要对复合类型信息进行序列化操作:serialize() unserailize()

第三个参数压缩作用

通过zlib进行压缩处理

其他相关操作

add() 给memcache增加一个key
不存在就增加,存在就报错
set() 给memcache设置key
不存在就增加,存在就修改

close() 关闭memcache连接,一般根据具体情况,设置到php代码的最后

decrement() 给key的值减少1 i–
increment() 给key的值累加1 i++

flush() 清空memcache的全部key

replace() 替换key的值为其他值
存在就替换,不存在就报错

终端操作

登录到memcache的操作终端:
telnet是远程登录协议:
没有telnet就yum install -y telnet
telnet 127.0.0.1 11211

如果是windows
telnet提示不是内部或外部指令的解决:
控制面板–》程序和功能–》打开或关闭windows服务–》telnet客户端:

在终端窗口实现memcache的操作:
设置:

set key 是否压缩 有效期 数据长度 [回车]
数据

add key 是否压缩 有效期 数据长度 [回车]
数据

replace key 是否压缩 有效期 数据长度 [回车]
数据
(数据真实长度 与 设置长度 要完全一致)
获取:
get key
删除:
delete key
flush_all //删除全部的key

给memcache设置一个key和读取:

通过php程序也可以读取到终端窗口设置的key

获取memcache信息

在php程序里边可以通过getStats()获得memcache服务器的统计信息。

分布式部署

如果单个memcache保存的数据非常多,memcache本身工作负载就会非常高,为了降低该memcache的工作量,提高其运行速度,可以设置多个memcache平均分担工作量,该模式就是分布式。
(例如一个memcache要保存1000W的数据,如果平均分配到5个memcache服务器,则每个就只保留200W的数据)

Redis的分布式是“主从模式”结构,一主多从。
Memcache的分布式与Redis的不同,其是把一台memcache的工作平均分配给多个memcache分担。

分布式具体的实施:
1) 可以在一个服务器里边开启多个memcache服务
2) 可以配置多个服务器,每个服务器里边都运行memcache服务

每个memcache服务器都是平等的,中间通过“算法”保证数据的平均分配。
php代码的编写还保持原有习惯即可。
key的分配原则:依次轮询、求余

分布式php代码的设计,无需考虑key存储在那个memcache服务器内部,memcache通过算法会自动给匹配上,不影响我们正常获得数据::

注意:
在每个php脚本文件内部服务器连接的顺序都要保持一致,否则数据有可能获取不到。

空间不足被强制删除

memcache的内存可用空间默认为64MB,如果存储的数据非常多,可用空间不足了。
此时仍然可以存储数据,因为memcache内部有LRU机制。
LRU: Least recently use 最近很少被使用的数据
内存空间如果不足,就会删除最近很少经常使用的数据。

如果不想使用LRU机制,就可以设置参数-M
开启memcache服务的时候带参数-M:
-M:内存空间耗尽,要报错,而不使用LRU机制删除数据

session共享

存储session形式.php.ini中:

存储在哪:

session存储到memcache的设置:

session保存到memcache中key的名称为session_id的值:

如果memcache是分布式的

0 0