Memcached简介

Memcached简介
Memcached是一个高性能、分布式的内存对象缓存系统,是由 Danga Interactive 开发并使用 BSD 许可的一种通用的分布式内存缓存系统。Danga Interactive 开发 memcached 的目的是创建一个内存缓存系统来处理其网站 LiveJournal.com 的巨大流量。每天超过 2000 万的页面访问量给 LiveJournal 的数据库施加了巨大的压力,因此 Danga 的 Brad Fitzpatrick 便着手设计了 memcached。memcached 不仅减少了网站数据库的负载,还成为如今世界上大多数高流量网站所使用的缓存解决方案。

Memcached广泛应用在大负载高并发的网站上,是一种非常成熟的产品(称为一项技术也未尝不可)。像 facebook,youtube,yahoo,sina,sohu,netease,豆瓣等网站均或多或少使用了该项产品。memcached在以用户为中心的网站上,表现尤其突出,例如sns,blog等web2.0应用的站点。这些站点一般来讲,特别注重用户体验,用户对服务器的响应速度要求很高,用户数据相对比较复杂、关连度比较高,需要经常对数据库进行更新和检索。

官方网站:http://memcached.org/

Memcached工作机制
Memcached 是以守护程序方式运行于一个或多个服务器中,随时接受客户端的连接操作,客户端可以由各种语言编写,目前已知的客户端API 包括 Perl/PHP/Python/Ruby/Java/C#/C 等等。客户端首先与 Memcached 服务建立连接,然后存取对象。每个被存取的对象都有一个唯一的标识符 key,存取操作均通过这个 key 进行,保存的时候还可以设置有效期。保存在 Memcached 中的对象实际上是放置在内存中的,而不是在硬盘上。Memcached 进程运行之后,会预申请一块较大的内存空间,自己进行管理,用完之后再申请一块,而不是每次需要的时候去向操作系统申请,其将对象保存在一个巨大的Hash表中,它还使用NewHash算法来管理Hash表,从而获得进一步的性能提升。所以当分配给Memcached的内存足够大的时候, Memcached的时间消耗基本上只是网络Socket连接了,Memcached按照LRU方式调度数据(LRU是Least Recently Used的缩写,即最近最少使用页面置换算法,是为虚拟页式存储管理服务的)。LRU算法在实际的工作环境中会与操作系统相关,比如32位的操作系统,最大的寻址空间是4G,如果当前内存的使用超过了这个限度,将被调出内存,内存中总维持最新最常用的数据。64位操作系统大大扩展了内存的寻址能力,所以现在很多memcached服务都是运行在64位系统上。

Memcached是一款基于Libevent多路异步I/O技术的内存共享系统,可以达到2000/秒平均查询,并且服务器CPU消耗依然不到10%。通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。它的缓存是一种分布式的,也就是可以允许不同主机上的多个用户同时访问这个缓存系统, 这种方法不仅解决了共享内存只能是单机的弊端,同时也解决了数据库检索的压力,最大的优点是提高了访问获取数据的速度。但是这些对象并不是持久的,服务停止之后,里边的数据就会丢失。允许多个server通过网络形成一个大的hash,用户不必关心数据存放在哪,只调用相关接口就可以。存放在内存的数据通过LRU算法进行淘汰出内存,同时可以通过删除和设置失效时间来淘汰存放在内存的数据, 服务器端采用slab机制管理内存空间。

使用流程

1、检查用户请求的数据在缓存中是否有存在,若存在的话,只需要直接把请求的数据返回。

2、如果请求的数据在缓存中找不到,这时候再去查询数据库,返回请求数据的同时把数据存储到缓存中一份

3、保持缓存的“新鲜性”,每当数据发生变化的时候如数据有被修改、删除的情况要同步更新缓存信息,确保用户不会在缓存取到旧的数据。

Memcached安装与管理

安装步骤

安装软件说明
libevent 是安装 memcached 的唯一前提条件。它是 memcached 所依赖的异步事件通知库。

软件准备
libevent,版本:1.4.12
memcached,版本:1.4.5

linux下的安装

把需要安装的程序包上传到/opt/install文件夹,如下安装步骤如不特殊说明均表示在该文件夹下操作。

1)安装libevent


cd /opt/install
tar zxvf libevent-1.4.12-stable.tar.gz
cd libevent-1.4.12-stable
./configure
make
make install

2)安装memcached,将软件上传到/opt文件夹下


cd /opt/install
tar zxvf memcached-1.4.5.tar.gz
cd memcached-1.4.5.
./configure
make
make install

3)检查安装是否成功,若出现如下信息表示已成功


ls -al /usr/local/bin/mem*
-rwxr-xr-x 1 root root 202029 Nov 15 23:07 /usr/local/bin/memcached

windows下的安装
下载windows下的memcached程序:http://www.splinedancer.com/memcached-win32/

解压之后双击安装即可。安装完毕可以在控制面板--》管理工具--》服务中看到已安装的服务信息:

管理说明

1)启动参数说明
如下命令是root用户以守护进程的形式启动 memcached,为其分配 256M 内存


#./memcached -d -m 256 -u root –c 10240
/usr/local/bin/memcached -d -m 2048 -u root -c 10240

主要启动参数说明

-d
以守护进程(daemon)方式运行 memcached

-m
设置memcached可以使用的内存大小,单位为 M

-l [ip_addr]
设置MEM接口监听的 IP地址,如果是本机的话,通常可以不设置此参数,默认所有地址

-p [num]
设置监听的tcp端口,默认为 11211,所以也可以不设置此参数;

-U [num]
设置监听的udp端口,默认为 11211,所以也可以不设置此参数;

-u
指定用户

-c [num]
最多并发连接数,默认为1024

-n [bytes]
键值对数据最少分配空间,默认为48b

-t [num]
使用的线程数,默认为4

-R
每个事件的最多请求数(一个连接的最多交互数据的次数),默认为20

2)管理参数说明

管理命令语法格式


command

管理命令说明

set
set 命令(可以理解为saveorupdate)用于向缓存添加新的键值对。如果键已经存在,则之前的值将被替换. 如果使用 set 命令正确设定了键值对,服务器将使用单词 STORED 进行响应。

add
仅当缓存中不存在键时,add 命令才会向缓存中添加一个键值对。如果缓存中已经存在键,则之前的值将仍然保持相同,并且您将获得响应 NOT_STORED。

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

get
使用语法

command

delete

使用语法

command

高级命令

gets
gets 命令的功能类似于基本的 get 命令。两个命令之间的差异在于gets 返回的信息稍微多一些,多返回的整型值非常像名称/值对的 “版本” 号。

cats
cas(check 和 set)是一个非常便捷的 memcached 命令,用于设置名称/值对的值(如果该名称/值对在您上次执行 gets 后没有更新过)。它使用与 set 命令相类似的语法,但需要指定版本号(gets 返回的额外值),否则写入无效。

缓存管理命令

stats
统计所连接的 memcached 实例的当前统计数据。通过其获取的参数分析缓存利用率用以优化程序。

flush_all
用于清理缓存中的所有名称/值对,将缓存重置到干净的状态。

管理命令参数说明

flags
可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息

expiration time
在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)

bytes
在缓存中存储的字节点

value
存储的值(始终位于第二行)

指令操作示例及说明

#登录memcached服务

telnet 192.168.15.111 11211

#存储key=userid value=12345数据

set userid 0 0 5
12345

#mem响应保存成功

STORED

#再次存储key=userid数据

add userid 0 0 5
12345

#由于该key已经存在,mem响应失败

CLIENT_ERROR bad data chunk
ERROR

#替换key=userid 数据的value=54321

replace userid 0 0 5
54321

#mem响应成功

STORED

#获取key=userid的值

get userid

#获取成功

VALUE userid 0 5
54321
END

#可以理解为获取版本号10的key/value数据

gets userid

#获取成功

VALUE userid 0 5 10
54321
END

#修改版本号位10的key=userid数据

cas userid 0 0 5 10
55555

#修改成功

STORED

#删除key=userid的数据

delete userid

#删除成功

DELETED

3)添加开机自启服务,在/etc/rc.local文件中加载启动命令,参数需要根据实际情况指定,如

/xxx/xxx/memcached -d -m 256 -u root

此条目发表在java/j2ee分类目录,贴了标签。将固定链接加入收藏夹。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据