最近对Memcache的一些学习
安装,配置Memcache,中间磕磕碰碰还是有遇到一些小问题的。
、下载一个稳定版本的Memcache,点我下载.找个最新版本的pecl压缩包,并放到某个盘下,并通过cmd控制台启动,必须要管理员身份,不然报错(我开始就报错过 - -),安装命令:c:/Memcache.exe –d install
然后再打:c:/Memcache.exe –d start,启动服务
、第二步,根据自身PHP版本,寻找对应的php_Memcache.dll并下载(重要,开始随便下了个,就无法使用Memcache,各种报错),我的PHP是5..4版本(http://huangqiqing123.iteye.com/blog/1682857),并放到PHP中的ext并在php.info配置文件下加一句话:extension=php_memcache.dll
、最后可以测试使用Memcache了,重启apache,打印phpinfo()信息,搜索Memcache,是否存在,再创建一个php文件:<?php $mem = new memcache; //实例化 $mem->connect(‘192.168.0.124’,11211) or die (“链接失败”); //192.168.0.124(服务器地址,本地可用localhost)11211(端口号)
echo $mem->getVersion(); //获得版本信息,使用echo输出?>
我的打印结果是:1.2.
Hello World
$mems = new memcache;
$mems->connect('localhost',11211) or die ("链接失败");
$mems->set(‘test’,’Hello World!’);
Echo $mems->get(‘name’);
实际应用:先创建一个MyMemcache.php,代码如下:
class MyMemcache extends memcache{
function __construct(){
memcache::addServer('localhost',11211)or die ("链接失败");}}
$mems = new MyMemcache();
再在需要的时候包含进来,例如:在memcache_set页面中:
require_once 'memcache.php';
$mems->set('name','mywang');
echo $mems->get('name');
在memcache_get页面中:
require_once 'memcache.php';
if($mems->get('name')){
echo $mems->get('name');
}else{
//select name from db
//echo $name;
//$mems->set('name','xxx');
}
PHP Memcache的API地址,点我点我
常用方法:
Memcache::add 向一个新的key下面增加一个元素
Memcache::addServer — 向服务器池中增加一个服务器
Memcache::delete — 删除一个元素
Memcache::fetch — 抓取下一个结果
Memcache::get — 检索一个元素
Memcache::replace — 替换已存在key下的元素
Memcache::set — 存储一个元素
Memcache::flush — 作废缓存中的所有元素
Memcache::getResultMessage — 返回最后一次操作的结果描述消息
Memcache::getResultCode — 返回最后一次操作的结果代码
Memcache::getDelayedByKey — 从指定的服务器上请求多个元素 示例推荐代码
理论分析推荐(重要)
一般而言,这些步骤是:
执行一个或多个查询来从数据库加载信息
格式化适合于显示(或进一步处理)的信息
使用或显示格式化了的数据 在使用 Memcache 时,为配合这个缓存,可对应用程序的逻辑进行稍许修改:
尽量从缓存加载信息
如果存在,使用信息的被缓存版本
如果它不存在:
执行一个或多个查询来从数据库加载信息
格式化适合于显示或进一步处理的信息
将信息存储到缓存内
使用格式化了的数据 减少了从数据库获取信息的次数,从而提高了web网页的响应速度
1.目前大多数php环境里使用的都是不带d的memcache版本,这个版本出的比较早,是一个原生版本,完全在php框架内开发的。与之对应的带d的memcached是建立在libmemcached的基础上,所以相对来说,memcached版本的功能更全一些。
2.Memcache是原生实现的,支持OO和非OO两套接口并存。而memcached是使用libmemcached,只支持OO接口。
3.memcached还有个非常称赞的地方,就是flag不是在操作的时候设置了,而是有了一个统一的setOption()。Memcached实现了更多的memcached协议。
4.memcached支持Binary Protocol,而memcache不支持。这意味着memcached会有更高的性能。不过memcached目前还不支持长连接。
有关 Memcache 最常见的一个问题是:“若缓存不可用了,会发生什么情况呢?”正如之前章节中明示的,缓存内的信息不应该成为信息的的惟一资源。必须要能够从其他位置加载存储在缓存内的数据。
虽然,无法从缓存访问信息将会减缓应用程序的性能,但它不应该阻止应用程序的运转。可能会发生这样几个场景:
如果 Memcache 服务宕掉,应用程序应该回退到从原始数据源加载信息并对信息进行显示所需的格式化。此应用程序还应继续尝试在 Memcache 内加载和存储信息。
一旦 Memcache 服务器恢复可用,应用程序就应该自动尝试存储数据。没有必要强制重载已缓存了的数据,可以使用标准的访问来用信息加载和填充缓存。最终,缓存将会被最常用的数据重新填充。
再次重申,Memcache 是信息的缓存但并非惟一的数据源。Memcache 服务器不可用不应该是应用程序的终结,虽然这意味着在 Memcache 服务器恢复正常之前性能会有所降低。实际上,Memcache 服务器相对简单,并且虽然不是绝对无故障的,但它的简单性的结果就是它很少会出错。
1、memcached 不是一个数据库,也就意味这Memcache不能永久地保存数据,只能存在于页面的整个生命周期中
2、memcached 并不安全。为了确保最佳性能,memcached 并未提供任何形式的安全性,没有身份验证,也没有加密。
3、虽然可以使用 memcached 存储加载自数据库的数据行,但这实际上是查询缓存,并且大多数数据库都提供各自的查询缓存的机制。其他的对象,比如文件系统的图像或文件的情况与此相同。很多应用程序和 web 服务器针对此类工作已经有了一些很好的解决方案。
1、如果Value特别大,不太适合。在默认编译下Memcache只支持1M的Value,其实从实践的角度来说也不建议把非常大的数据保存在Memcache中,因为有序列化反序列化的过程,别小看它消耗的CPU
2、 如果不允许过期,不太适合。 Memcache在默认情况下最大30天过期,而且在内存达到使用限制后它也会回收最少使用的数据。如果我们要把它当作static变量的话就要考虑到这个问题,必须有重新初始化数据的过程。
3、Memcached是“分布式”的内存对象缓存系统,那么就是说,那些不需要“分布”的,不需要共享的,或者干脆规模小到只有一台服务器的应用,memcached不会带来任何好处,相反还会拖慢系统效率,因为网络连接同样需要资源,即使是UNIX本地连接也一样。 在我之前的测试数据中显示,memcached本地读写速度要比直接PHP内存数组慢几十倍,而APC、共享内存方式都和直接数组差不多。可见,如果只是本地级缓存,使用memcached是非常不划算的。Memcached在很多时候都是作为数据库前端cache使用的。因为它比数据库少了很多SQL解析、磁盘操作等开销,而且它是使用内存来管理数据的,所以它可以提供比直接读取数据库更好的性能,在大型系统中,访问同样的数据是很频繁的,memcached可以大大降低数据库压力,使系统执行效率提升。
4、memcached能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等等,而且生产环境中就这么跑过,只不过让大数据量使用缓冲的话,有点太浪费了,同样数量的内存存不了几条数据,所以会明显的降低命中率。
5、Memcached的由于是静态数据,需要每隔一定时间进行清空并从数据库提取数据,而刷新的时间可以根据不同的数据需求而定。
6、那么Memcache主要用在哪些功能上呢?
其实我觉得平时能想到在内存中做缓存的地方我们都可以考虑下是不是可以去适用分布式缓存,但是主要的用途还是用来在前端或中部挡一下读的需求来释放Web服务器App服务器以及DB的压力。
最近对Memcache的一些学习的更多相关文章
- Memcache的一些学习
Memcache的一些学习 首先,Memcache是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态.数据库驱动 ...
- memcache/redis 缓存学习笔记
0.redis和memcache的区别 a.redis可以存储除了string之外的对象,如list,hash等 b.服务器宕机以后,redis会把内存的数据持久化到磁盘上,而memcache则不会 ...
- 使用memcache(thinkphp框架学习)
$memcache = new Memcache; $memcache->connect("localhost",11211); $memcache->set('sxt ...
- 《Memcache学习总结》[PDF]发布
<Memcache学习总结>[PDF]发布 百度网盘共享: http://pan.baidu.com/s/1mgvayQO 版本号: V1.2 最后跟新: 2015-04-01 讨论组: ...
- memcache学习资料
memcached是国外社区网站LiveJournal团队开发,通过缓存数据库查询结果,减少数据库访问次数,从而提高动态web站点性能.官方站点 http://memcached.org/memcac ...
- memcache的学习路线图
memcache学习材料 //memcache自带的github 上的 wiki //席剑飞 Memcache(MC)系列 1~8系列 评注: memcache系统写的最深的一博客,建议一读 ...
- php之memcache学习
php之memcache学习 简介: memcache是一个分布式高速缓存系统. 分布式是说可以部署在多台服务器上,实现集群效果: 高速是因为数据都是维护在内存中的: 特点和使用场景: 1.非持久化存 ...
- 五分钟学后端技术:如何学习Redis、memcache等常用缓存技术
原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者. 本文思维导图 什么是缓存 计算机中的缓存 做后端开发的同学,想必对缓存都不会陌生了,平时我们可能会使用Redis,MemCache这类 ...
- Memcache学习整理
一.Memcache 是什么? 组成:程序进程管理.Socket 程序进程:Memcache把内存先分成几个大份,每一份分成多个小份.例如:小份中有5M...0.9M.0.8M.....0.1M,一份 ...
随机推荐
- 九度OJ 1068 球半径和数量 (模拟)
题目1068:球的半径和体积 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4797 解决:1696 题目描写叙述: 输入球的中心点和球上某一点的坐标,计算球的半径和体积 输入: 球的中心 ...
- CSS3+HTML5特效1 - 上下滑动效果
先看看效果,把鼠标移上去看看. back front 1. 本实例需要以下元素: a. 外容器 box b. 内容器 border c. 默认显示内容 front d. 滑动内容 back 2. 外容 ...
- ENode 2.0
ENode 2.0 - 介绍一下关于ENode中对Command的调度设计 摘要: CQRS架构,C端的职责是处理从上层发送过来的command.对于单台机器来说,我们如何尽快的处理command呢? ...
- 项目管理实践 -- 健身小管家(Fitness housekeeper)的管理(2)
继续跟踪进度 按计划应该在14号完成的工作,今天已经完成了.
- Require.JS 2.0
就在前天晚上RequireJS发布了一个大版本,直接从version1.0.8升级到了2.0.随后的几小时James Burke又迅速的将版本调整为2.0.1,当然其配套的打包压缩工具r.js也同时升 ...
- 使用 COM 风格的编程接口
使用COM 风格的编程接口 假设不直接使用 COM 库.不创建自己的包装.那么更可能的是使用 COM 风格的编程接口.这是由于如今很多开发商公布应用程序时.提供了首选的互操作程序集(Primary I ...
- EditPlus仿Sublime配色方案(三种任你选择)
[Options] Placement=2C00000002000000030000000083FFFF0083FFFFFFFFFFFFFFFFFFFFEA000000EE000000D6050000 ...
- 客户端Webview重定向
今天在客户端的网页中写了句alert的代码,发现执行了两次,后来发现网页的地址写的是http://192.168.14.72/app 客户端Webview加载网页,对于不完全路径会重定向到完全路径,导 ...
- jquery+html三级联动下拉框及详情页面加载时的select初始化问题
html写的三个下拉框,如下: <select name="ddlQYWZYJ" id="ddl_QYWZYJ" class="fieldsel ...
- Spring IOC之Bean 概述
1.Bean概述 一个Spring IOC容器管理一个或者多个bean.这些bean是根据你提供给容器的配置数据信息创建的,例如XML形式的的定义. 在容器内部,这些bean的定义表示为BeanDef ...