基础知识和细节问题

缓存技术包括内存的缓存和文件的缓存。php内存的缓存目前是memcached技术。文件缓存包括页面静态化·smarty·mysql优化。

memcached服务器默认端口11211.其维护了一张hashtable表,其数据以键值对存在。memcached是高性能的分布式内存缓存服务器,能减少读取数据库的次数,提高数据访问速度。

由于该服务器保存的数据实在内存中,所以一旦电脑奔溃或服务器停止重启memcached、重启操作系统,memcached维护的数据就会丢了。

另外,内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。memcached本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题。

三种方式访问Memcached服务器:

           1:php下载Memcache扩展库访问该服务

           2:php下载Memcached扩展库访问该服务

           3:直接使用socket编程

           4:telent请求该服务。

该三种方式对memcached服务器的CRUD操作如下:

1.2方式可以查php手册3在网上下载memcached-client-php探究源码

4.方式

set/add 标识名  参数  存时间  字节数  /  get/delete  标识名 / 

stats :转储所连接的memcached 实例的当前统计数据。

flush_all:用于清理缓存中的所有名称/值对。如果您需要将缓存重置到干净的状态,则flush_all 能提供很大的用处。

replace:仅当键已经存在时,replace 命令才会替换缓存中的键。如果缓存中不存在键,那么您将从memcached 服务器接受到一条NOT_STORED 响应。

添加或设置或替换缓存数据时其中的过期时间问题:

                              当为0时,只要服务器不关闭,数据就一直存在内存中。

                                            当使用UNIX时间戳时,时间可以任意长

                                            当使用秒数时,即从当前执行事件开始计算,不能超过30天

当我们设置的时间间隔大于 2592000 ,例如2592010,写进去的数据会被认为是unix时间戳格式,数据刚写进去已经过期,相当于导致数据写不进去,而更糟糕的是对于这种情况memcached服务端和客户端驱动都不会抛出exception或者打印任何警告信息,因为对memcached来说这样的时间值也是合理的。该expire的限制某似是从memcached 1.2.6以后才有体现,之前的版本如1.2.1中没有观察到这种现象。

单个缓存值大小限制:
memcached单个缓存值限制为1M(1000000bytes),超过这个限制的时候会出如下错误:
ValueError: Values may not be more than 1000000 bytes in length; received 2000000 bytes
 
key长度限制:
memcache的keys限制为250 bytes,超过这个长度会报错:
ValueError: Keys may not be more than 250 bytes in length, received 14670 bytes
 

Memcached的缓存机制:

                              Memcached主要的cache机制是LRU(最近最少用)算法+超时失效。当您存数据到memcached中,可以指定该数据在缓存中可以呆多久。如果memcached的内存不够用了,过期的slabs会优先被替换,接着就轮到最老的未被使用的slabs。

Memcached应该是应用的缓存层:

                             它的设计本身就不带有任何冗余机制。如果一个memcached节点失去了所有数据,您应该可以从数据源(比如数据库)再次获取到数据。您应该特别注意,您的应用应该可以容忍节点的失效。不要写一些糟糕的查询代码,寄希望于 memcached来保证一切!

Memcached属于什么架构:

                              Memcached属于c/s架构。Memcached本身是使用C开发的,客户端可以是php、C#、或者java。位于服务器端需要下载Memcached客户端软件才能支撑该服务。和浏览器没有直接关系。且MYSQL-apache-Memcached-负载均衡之间都是独立的,对于一个具体的应用来说需要他们的分工合作才能完成应用的功能

Memcached服务器和客户端通讯使用的是文本行协议而不是XML,所以telnet也可以写入和读取。


php中遇到addServer方法的时候,并不是立即去连接mem服务,而是通过计算,hash后才去决定连接哪个mem服务,因此当你大量加入连接(addServer)到连接池,不会有多余开销。

Memcached数据被销毁有一下情况:

                         1:指定保存时间到了2:memcached重启3:memcached所在主机重启4:使用delete或flush

Memcached适用场合:

1. 分布式应用。由于memcached本身基于分布式的系统,所以尤其适合大型的分布式系统。

2. 数据库前段缓存。数据库常常是网站系统的瓶颈。数据库的大并发量访问,常常造成网站内存溢出。当然我们也可以使用Hibernate的缓存机制。但memcached是基于分布式的,并可独立于网站应用本身,所以更适合大型网站进行应用的拆分。

3. 服务器间数据共享。举例来讲,我们将网站的登录系统、查询系统拆分为两个应用,放在不同的服务器上,并进行集群,那这个时候用户登录后,登录信息如何从登录系统服务器同步到查询系统服务器呢?这时候,我们便可以使用memcached,登录系统将登录信息缓存起来,查询系统便可以获得登录信息,就像获取本地信息一样。

首先 memcached 是以守护程序方式运行于一个或多个服务器中,随时接受客户端的连接操作。守护进程是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程常常在系统引导装入时启动,在系统关闭时终止。守护进程是在UNIX或其他多任务操作系统中在后台执行的电脑程序,并不会接受电脑用户的直接操控。此类程序会被以进程的形式初始化。守护进程程序的名称通常以字母“d”结尾:例如,syslogd就是指管理系统日志的守护进程。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章