php操作memcache
Posted cscsdvdsv
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php操作memcache相关的知识,希望对你有一定的参考价值。
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是分布式的
以上是关于php操作memcache的主要内容,如果未能解决你的问题,请参考以下文章