memcache缓存
① memcache缓存的是什么数据又是怎么写入的呢
mysql 通常是有一个主键,一行记录里有一个可以标注"身份"的值。
mc 是 kv 形式的内存数据库,使用mc的意义就是高速读取,防止对mysql的读取量过大造成各种问题。存mc时候通常把mysql的主键作为key,value可以是一个数据(mysql的一行做一个关联数据),也可以把mysql的一条记录做json_encode,当作一个string进行缓存。
② 你使用过 Memcache 缓存吗如果使用过,能够简单的描述一下它的工作原理吗
首先 memcached 是以守护程序方式运行于一个或多个服务器中,随时接受客户端的连接操作,客户端可以由各种语言编写,目前已知的客户端 API 包括 Perl/php/Python/Ruby/Java/C#/C 等等。PHP 等客户端在与 memcached 服务建立连接之后,接下来的事情就是存取对象了,每个被存取的对象都有一个唯一的标识符 key,存取操作均通过这个 key 进行,保存到 memcached 中的对象实际上是放置内存中的,并不是保存在 cache 文件中的,这也是为什么PHP内存缓存技术memcached 能够如此高效快速的原因。注意,这些对象并不是持久的,服务停止之后,里边的数据就会丢失。
③ 怎么合理的使用memcache缓存如果缓存数据量过大怎么部署
这个,你不能这么问的,太笼统了。要看你的具体环境以及需求的。
现在部署方案有两种对立但是又都比较常用的。jimmyyem1的是一种,另外一种就是提倡不要集中部署memcached,而是分布在不同的机器上的。例如所有的web和db服务器都分1G出来给memcache,这样的话,如果down掉一台机器不至于损失所有的缓存效果。而只部署在一台上的话,如果这台服务器down了,整个memcache就都不工作了。当然,部署在多台服务器上也会带来管理不便等方面的问题。
④ memcache缓存命中率有多高
举个栗子啊。你的mc保存用户信息,现在有两个用户,id为1,2。mc中的key就是用户id。
你用id=1从mc中获取一个用户信息,这个时候mc命中率是 100%;
这个时候你的服务器重启了一次,mc里面的数据都没了,你再用id=1从mc中获取用户信息,取不到了,此时mc命中率是50%。
命中率是 get成功/get总次数 ,就是一个成功率。
一般的做法是如果从mc取不到信息了,就从数据库里取信息然后写到mc里,以避免下次获取信息的时
⑤ memcache怎样清除缓存两种方法
memcache确实是一个加速很好的缓存器,什么都可以缓存~
——方法一——-cmd上直接清除,【清除所有缓存】
$ telnet localhost 11211
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
flush_all
OK
quit
Connection to localhost closed by foreign host.
——方法二——-PHP清理缓存方法
<?php
$memcache = new Memcache;
$memcache->connect(‘localhost’, 11211) or die (“Could not connect”);
$version = $memcache->getVersion();
echo ”Server’s version: ”.$version.”
\n”;
?>
<?php
$memcache = new Memcache;
$memcache->connect(‘localhost’, 11211) or die (“Could not connect”);
print_r($memcache->getStats());
/**
* Array
* (
* [pid] => 8052
* [uptime] => 9205
* [time] => 1205898428
* [version] => 1.2.5 www.shellsec.com
* [pointer_size] => 32
* [rusage_user] => 0.008000
* [rusage_system] => 0.000000
* [curr_items] => 1
* [total_items] => 17
* [bytes] => 57
* [curr_connections] => 2
* [total_connections] => 15
* [connection_structures] => 3
* [cmd_get] => 9
* [cmd_set] => 23
* [get_hits] => 5
* [get_misses] => 4
* [evictions] => 0
* [bytes_read] => 671
* [bytes_written] => 850
* [limit_maxbytes] => 10485760
* [threads] => 1
* )
*/
?>
<?php
$memcache = new Memcache;
$memcache->connect(‘localhost’, 11211) or die (“Could not connect”);
$memcache->set( ’name’, ’leo’, 0, 30);
if(!$memcache->add( ’name’, ’susan’, 0, 30))
{
echo ’susan is exist’;
};
$memcache->replace( ’name’, ’lion’, 0, 300);
echo $memcache->get( ’name’);
$memcache->delete( ’name’, 5);
?>
<?php
function _callback_memcache_failure($host, $port) {
print ”memcache ’$host:$port’ failed”;
}
$memcache = new Memcache;
$memcache->addServer(’192.168.1.116′, 11211);
$memcache->setServerParams(’192.168.1.116′, 11211, 1, 15, true,
‘_callback_memcache_failure’);
echo $memcache->getServerStatus(’192.168.1.116′, 11211);
?>
<?php
$memcache = new Memcache;
$memcache->connect(‘localhost’, 11211);
$memcache->set(‘test_item’, 8);
$memcache->increment(‘test_item’, 4);
echo $memcache->decrement(‘test_item’, 7);
// 显示 5
?>
/usr/local/bin/memcached -d -m 10 -u root -l 127.0.0.1 -p 11211 -c 256 -P
/tmp/memcached.pid
memcached的服务正式启动
Memcache::add — 添加一个值,如果已经存在,则返回false
Memcache::addServer — 添加一个可供使用的服务器地址
Memcache::close — 关闭一个Memcache对象
Memcache::connect — 创建一个Memcache对象
memcache_debug — 控制调试功能
Memcache::decrement — 对保存的某个key中的值进行减法操作
Memcache::delete — 删除一个key值
Memcache::flush — 清除所有缓存的数据
Memcache::get — 获取一个key值
Memcache::getExtendedStats — 获取进程池中所有进程的运行系统统计
Memcache::getServerStatus — 获取运行服务器的参数
Memcache::getStats — 返回服务器的一些运行统计信息
Memcache::getVersion — 返回运行的Memcache的版本信息
Memcache::increment — 对保存的某个key中的值进行加法操作
Memcache::pconnect — 创建一个Memcache的持久连接对象
Memcache::replace — R对一个已有的key进行覆写操作
Memcache::set — 添加一个值,如果已经存在,则覆写
Memcache::setCompressThreshold — 对大于某一大小的数据进行压缩
Memcache::setServerParams — 在运行时修改服务器的参数
建议用面向对象的方式来测试这个库:
Memcache::getVersion方法的作用是返回运行的Memcache的版本信息。
Memcache::getStats 方法的作用是返回服务器的一些运行统计信息。Memcache::getStats方法有三个参
数,第一个参数表示要求返回的类型:reset, malloc, maps, cachemp, slabs, items, sizes;第二个
参数和第三个参数是在第一个参数设置为“cachemp”时使用的。Memcache::getExtendedStats方法的
作用是获取进程池中所有进程的运行系统统计。
Memcache::connect方法的作用是创建一个Memcache对象。Memcache::pconnect方法的作用是创建一个
Memcache的持久连接对象。Memcache::close方法的作用是关闭一个Memcache对象。
Memcache::set 方法的作用是添加一个值,Memcache::set方法有四个参数,第一个参数是key,第二个参
数是value,第三个参数可选,表示是否压缩保存,第四个参数可选,用来设置一个过期自动销毁的时间
。Memcache::add方法的作用和Memcache::set方法类似,区别是如果 Memcache::add方法的返回值为
false,表示这个key已经存在,而Memcache::set方法则会直接覆写。 Memcache::get方法的作用是获取
一个key值,Memcache::get方法有一个参数,表示key。Memcache::replace 方法的作用是对一个已有的
key进行覆写操作,Memcache::replace方法有四个参数,作用和Memcache::set方法的相同。
Memcache::delete方法的作用是删除一个key值,Memcache::delete方法有两个参数,第一个参数表示key
,第二个参数可选,表示删除延迟的时间。
memcache_debug()函数的作用是控制调试功能,前提是php在编译的时候使用了–enable-debug选项,否
则这个函数不会有作用。
Memcache::addServer 方法的作用是添加一个可供使用的服务器地址,Memcache::addServer方法有8个参
数,除了第一个参数意外,其他都是可选的,第一个参数表示服务器的地址,第二个参数表示端口,第三
个参数表示是否是一个持久连接,第四个参数表示这台服务器在所有服务器中所占的权重,第五个参数表
示连接的持续时间,第六个参数表示连接重试的间隔时间,默认为15,设置为-1表示不进行重试,第七个
参数用来控制服务器的在线状态,第8个参数允许设置一个回掉函数来处理错误信息。
Memcache::setServerParams方法的作用是在运行时修改服务器的参数,Memcache::setServerParams方法
有六个参数,Memcache::addServer方法少了第三和第四个参数。 Memcache::getServerStatus方法的作
用是获取运行服务器的参数,两个参数分别表示的地址和端口。
Memcache::flush方法的作用是清除所有缓存的数据,但是不会削去使用的内存空间。
Memcache::increment方法的作用是对保存的某个key中的值进行加法操作,Memcache::decremen方法的作
用是对保存的某个key中的值进行减法操作。
⑥ memcache缓存命中率是什么意思
你好
很高兴为您解答
命中:直接从缓存中读取到想要的数据。
不命中:缓存中没有想要的数据,还需要到数据库进行一次查询才能读取到想要的数据。
满意采纳下
⑦ memcache缓存 如何实现php
php实现memcache缓存示例讲解
共享内存是一种在相同机器中的应用程序之间交换数据的有效方式,本文说的是php实现memcache缓存示例,大家参考使用吧
概述
共享内存是一种在相同机器中的应用程序之间交换数据的有效方式。一个进程可创建一个可供其他进程访问的内存段,只要它分配了正确的权限。每个内存段拥有一个惟一的 ID(称为 shmid),这个 ID 指向一个物理内存区域,其他进程可在该区域操作它。创建并提供了合适的权限之后,同一台机器中的其他进程就可以操作这些内存段:读取、写入和删除。
这表明使用 C 语言编写的应用程序可与使用其他语言(比如 Java™ 或 PHP)编写的应用程序共享信息。它们都可以共享信息,只要它们可访问和理解该信息。共享内存在针对大部分语言的实现中得到了广泛使用,所以访问应该不是问题。要理解信息,我们可以使用一种标准格式,比如 XML 或 JSON。
共享内存的使用是一种在进程之间交换数据的快速方法,主要因为在创建内存段之后传递数据,不会涉及内核。这种方法常常称为进程间通信 (IPC)。其他 IPC 方法包括管道、消息队列、RPC 和套接字。当使用需要彼此通信的应用程序的生态系统时,这种在应用程序之间快速、可靠地交换数据的能力非常有用。取决于生态系统的大小,使用数据库在应用程序之间交换信息的常用方法常常会导致查询缓慢,甚至 I/O 阻塞。使用共享内存,没有 I/O 会减缓开发人员的进度。
本文的提议非常简单,学习如何使用 PHP 创建和操作共享内存段,使用它们存储可供其他应用程序使用的数据集。即使没有使用共享内存交换数据的计划,它本身也在许多好处,因为它使应用程序能够远离 I/O 问题。将数据集直接存储在内存中具有诸多优势,从 Web 服务数据缓存到会话共享。它是一个非常有用的概念,每个 PHP 开发人员都应该知道。
共享内存和 PHP
PHP 拥有丰富的可用扩展,共享内存也一样。使用一些共享的函数,无需安装任何扩展,开发人员就能够轻松操作内存段。
创建内存段
共享内存函数类似于文件操作函数,但无需处理一个流,您将处理一个共享内存访问 ID。第一个示例就是 shmop_open 函数,它允许您打开一个现有的内存段或创建一个新内存段。此函数非常类似于经典的 fopen 函数,后者打开用于文件操作的流,返回一个资源供其他希望读取或写入该打开的流的函数使用。让我们看看清单 1 中的 shmop_open。
清单 1. shmop_open 函数
复制代码代码如下:
<?php
$systemid = 864; // System ID for the shared memory segment
$mode = "c"; // Access mode
$permissions = 0755; // Permissions for the shared memory segment
$size = 1024; // Size, in bytes, of the segment
$shmid = shmop_open($systemid, $mode, $permissions, $size);
?>
该函数中出现的第一个事物是系统 ID 参数。这是标识系统中的共享内存段的数字。第二个参数是访问模式,它非常类似于 fopen 函数的访问模式。您可以在 4 种不同的模式下访问一个内存段:
•模式 “a”,它允许您访问只读内存段
•模式 “w”,它允许您访问可读写的内存段
•模式 “c”,它创建一个新内存段,或者如果该内存段已存在,尝试打开它进行读写
•模式 “n”,它创建一个新内存段,如果该内存段已存在,则会失败
第三个参数是内存段的权限。您必须在这里提供一个八进制值。
第四个参数提供内存段大小,以字节为单位。在写入一个内存段之前,您必须在它之上分配适当的字节数。
请注意,此函数返回一个 ID 编号,其他函数可使用该 ID 编号操作该共享内存段。这个 ID 是共享内存访问 ID,与系统 ID 不同,它以参数的形式传递。请注意不要混淆这两者。如果失败,shmop_open 将返回 FALSE。
向内存段写入数据
使用 shmop_write 函数向共享内存块写入数据。此函数的使用很简单,它仅接受 3 个参数,如清单 2 所示。
清单 2. 使用 shmop_write 向共享内存块写入数据
复制代码代码如下:
<?php
$shmid = shmop_open(864, 'c', 0755, 1024);
shmop_write($shmid, "Hello World!", 0);
?>
这个函数类似于 fwrite 函数,后者有两个参数:打开的流资源(由 fopen 返回)和您希望写入的数据。shmop_write 函数也执行此任务。
第一个参数是 shmop_open 返回的 ID,它识别您操作的共享内存块。第二个参数是您希望存储的数据,最后的第三个参数是您希望开始写入的位置。默认情况下,我们始终使用 0 来表示开始写入的位置。请注意,此函数在失败时会返回 FALSE,在成功时会返回写入的字节数。
从内存段读取数据
从共享内存段读取数据很简单。您只需要一个打开的内存段和 shmop_read 函数。此函数接受一些参数,工作原理类似于 fread。参见清单 3,读取一个 PHP 文件的内容。
清单 3. 使用 shmop_read 读取一个文件的内容
复制代码代码如下:
<?php
$stream = fopen('file.txt', 'r+');
fwrite($stream, "Hello World!");
echo fread($stream, 11);
?>
读取共享内存段的内容的过程与此类似,如清单 4 所示:
清单 4. 读取共享内存段的内容
复制代码代码如下:
<?php
$shmid = shmop_open(864, 'c', 0755, 1024);
shmop_write($shmid, "Hello World!", 0);
echo shmop_read($shmid, 0, 11);
?>
请留意这里的参数。shmop_read 函数将接受 shmop_open 返回的 ID,我们已知道它,不过它还接受另外两个参数。第二个参数是您希望从内存段读取的位置,而第三个是您希望读取的字节数。第二个参数可以始终为 0,表示数据的开头,但第三个参数可能存在问题,因为我们不知道我们希望读取多少字节。
这非常类似于我们在 fread 函数中的行为,该函数接受两个参数:打开的流资源(由 fopen 返回)和您希望从该流读取的字节数。使用filesize 函数(它返回一个文件中的字节数)来完整地读取它。
幸运的是,当使用共享内存段时,shmop_size 函数返回一个内存段的大小(以字节为单位),类似于 filesize 函数。参见清单 5。
清单 5. shmop_size 函数返回内存段大小,以字节为单位
复制代码代码如下:
<?php
$shmid = shmop_open(864, 'c', 0755, 1024);
shmop_write($shmid, "Hello World!", 0);
$size = shmop_size($shmid);
echo shmop_read($shmid, 0, $size);
?>
回页首
删除内存段
我们学习了如何打开、写入和读取共享内存段。要完成我们的 CRUD 类,我们还需要学习如何删除内存段。该任务可使用 shmop_delete 函数轻松完成,该函数仅接受一个参数:我们希望删除的共享内存 ID。
清单 6. shmop_delete 标记要删除的内存段
复制代码代码如下:
<?php
$shmid = shmop_open(864, 'c', 0755, 1024);
shmop_write($shmid, "Hello World!", 0);
shmop_delete($shmid);
?>
这不会实际删除该内存段。它将该内存段标记为删除,因为共享内存段在有其他进程正在使用它时无法被删除。shmop_delete 函数将该内存段标记为删除,阻止任何其他进程打开它。要删除它,我们需要关闭该内存段。
关闭内存段
打开一个共享内存段会 “附加” 到它。附加该内存段之后,我们可在其中进行读取和写入,但完成操作后,我们必须从它解除。这使用清单 7 中的 shmop_close 函数来完成。
这非常类似于处理文件时的 fclose 函数。打开包含一个文件的流并在其中读取或写入数据后,我们必须关闭它,否则将发生锁定。
清单 7. 使用 shmop_close 与一个内存段分开
复制代码代码如下:
<?php
$shmid = shmop_open(864, 'c', 0755, 1024);
shmop_write($shmid, "Hello World!", 0);
shmop_delete($shmid);
shmop_close($shmid);
?>
使用共享内存作为一个存储选项
有了共享内存和共享内存段上基本 CRUD 操作的基本知识,是时候应用此知识了。我们可以使用共享内存作为一种独特的存储选项,提供快速读/写操作和进程互操作性等优势。对于 Web 应用程序,这意味着:
•缓存存储(数据库查询、Web 服务数据、外部数据)
•会话存储
•应用程序之间的数据交换
在继续之前,我想介绍一个名为 SimpleSHM 小型库。SimpleSHM 是一个较小的抽象层,用于使用 PHP 操作共享内存,支持以一种面向对象的方式轻松操作内存段。在编写使用共享内存进行存储的小型应用程序时,这个库可帮助创建非常简洁的代码。要了解 SimpleSHM,请访问GitHub 页面。
您可以使用 3 个方法进行处理:读、写和删除。从该类中简单地实例化一个对象,可以控制打开的共享内存段。清单 8 展示了基本用途。
清单 8. SimpleSHM 基本用途
复制代码代码如下:
<?php
$memory = new SimpleSHM;
$memory->write('Sample');
echo $memory->read();
?>
请注意,这里没有为该类传递一个 ID。如果没有传递 ID,它将随机选择一个编号并打开该编号的新内存段。我们可以以参数的形式传递一个编号,供构造函数打开现有的内存段,或者创建一个具有特定 ID 的内存段,如清单 9 所示。
清单 9. 打开一个特定的内存段
复制代码代码如下:
<?php
$new = new SimpleSHM(897);
$new->write('Sample');
echo $new->read();
?>
神奇的方法 __destructor 负责在该内存段上调用 shmop_close 来取消设置对象,以与该内存段分离。我们将这称为 “SimpleSHM 101”。现在让我们将此方法用于更高级的用途:使用共享内存作为存储。存储数据集需要序列化,因为数组或对象无法存储在内存中。尽管这里使用了 JSON 来序列化,但任何其他方法(比如 XML 或内置的 PHP 序列化功能)也已足够。清单 10 给出了一个示例。
清单 10. 使用共享内存作为存储
复制代码代码如下:
<?php
require('SimpleSHM.class.php');
$results = array(
'user' => 'John',
'password' => '123456',
'posts' => array('My name is John', 'My name is not John')
);
$data = json_encode($results);
$memory = new SimpleSHM;
$memory->write($data);
$storedarray = json_decode($memory->read());
print_r($storedarray);
?>
我们成功地将一个数组序列化为一个 JSON 字符串,将它存储在共享内存块中,从中读取数据,去序列化 JSON 字符串,并显示存储的数组。这看起来很简单,但请想象一下这个代码片段带来的可能性。您可以使用它存储 Web 服务请求、数据库查询或者甚至模板引擎缓存的结果。在内存中读取和写入将带来比在磁盘中读取和写入更高的性能。
使用此存储技术不仅对缓存有用,也对应用程序之间的数据交换也有用,只要数据以两端都可读的格式存储。不要低估共享内存在 Web 应用程序中的力量。可采用许多不同的方式来巧妙地实现这种存储,惟一的限制是开发人员的创造力和技能
⑧ 如何改变memcached默认的缓存时间
至于设置一个UNIX时间戳或 以秒为单位的整数(从当前算起的时间差)来说明此数据的过期时间,但是在后一种设置方式中,不能超过 2592000秒(30天)的问题我们该怎么办呢?我们不想设置为永久有效,但是也不想再限制在30天内。那么方法来了,这里就以官方文档的代码为示例代码,如下。
<?php
$memcache_obj = memcache_connect(“localhost”, 11211);
/* 面向过程编程 API */
memcache_add($memcache_obj, 'var_key', 'test variable', false, 0);// 永久有效
/* 面向对象编程 API */
$memcache_obj->add(‘var_key', 'test variable', false, time()+24*60*60*30);// 超过30天
?>
⑨ memcache中怎么缓存文件
首先明确,memcache是作为高速缓存使用的。
那么,到底怎样才能获得高速的响应呢?当然如果是简单处理的话,利用关系型数据库的索引也能获得高速响应。虽然memcached会更快一些,但如果合理地使用索引,关系型数据库就足够快了。
但是如果要对多个表的数据进行计算,情况又会怎样呢?若使用关系型数据库,我们需要从每个表中取出数据然后进行最后的组合处理,或者每次都要使用JOIN等处理。虽然我们可以通过事前用批处理制作数据来解决这个问题,但是这样又会增加需要管理的表,花费我们更多的精力。