一、概念
Memcached是一个自由开源的,高性能,分布式内存对象缓存系统。
Memcached是一种基于内存的key-value存储,用来存储小块对的任意数据(字符串、对象等)。这些数据可以是数据库调用,api调用或者是页面渲染的结果。
一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态web应用的速度,提高可扩展性。
Memcached 官网:http://memcached.org/。
二、原理
Memcached有两个核心组件:服务端和客户端。首先客户端拿到服务端列表,并对key做hash转化,根据hash值确定key-value键值对所存的服务端位置;然后在一个memcached的查询中,客户端先通过计算key的hash值来确定key-value对所存在的服务端的位置,之后客户端就会发送一个查询请求给对应的服务端,让这个服务端来查询确切的数据。因为服务端之间并没有互为备份,也就不需要互相通信,所以效率较高。
三、适用场景举例
1.分布式应用。由于memcached本身就是一个分布式内存对象缓存系统,所以尤其适合大型的分布式系统。
2.数据库前端缓存。数据库访问常常是网站系统的瓶颈,高并发量的数据库访问,不只是会让响应变慢,甚至会造成网站内存溢出。这时候可以把一些频繁访问的查询缓存起来以减少数据库的访问。当然可以使用Hibernate的缓存机制,但是memcached是可以独立于网站应用本身的,所以更适合大型网站进行应用的拆分。
3.服务器间数据共享。假设我们将网站的登录和查询拆分成两个子系统,形成两个应用,放在不同的服务器上,并进行集群,这时候,就可以使用memcached将登录系统的用户登录信息缓存起来,以便查询系统能够通过memcached获取登录信息,就像获取本地信息一样。
四、安装
1.Linux下安装memcached
从其官方网站(http://memcached.org)下载memcached最新版本。
wget http://memcached.org/latest tar -zxvf memcached-1.x.x.tar.gz cd memcached-1.x.x ./configure && make && make test && sudo make install
2.windows 下安装memcached
百度网盘下载地址: http://pan.baidu.com/s/1eSMgsEY
包含32位和64位的 1.4.4 和 1.4.5 版本 及 32位的1.2.5和1.2.6 版本。
在1.4.5版本以前的memcached可以作为一个服务安装,而在1.4.5及其之后的版本则删除了该功能。因此以下介绍两个不同版本1.4.4和1.4.5的不同安装方法:
(1)1.4.4及其以下版本(memcached可以作为一个服务安装)
1.解压下载的安装包的指定目录。假设路径为 c:memcached
注意:你需要使用你自己真实的路径替代此路径。
2.使用管理员权限,在cmd窗口中执行以下命令即可安装成功。以后memcached就将作为windows的一个服务每次开机时自动启动。
c:memcachedmemcached.exe -d install
3.启动、关闭和卸载
c:memcachedmemcached.exe -d start
c:memcachedmemcached.exe -d stop
c:memcachedmemcached.exe -d uninstall
4.修改配置项
memcached有很多默认的参数配置项,比如最大缓存等,可以使用c:memcachedmemcached.exe -h 命令来查看其所有的配置项。需要先停止服务,设置参数后重启服务即可生效
方式一:通过注册表修改
运行regedit.exe命令打开注册表,并找到 HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesmemcached ,修改其ImagePath项的值,在其默认值后面添加各种参数。
方式二:通过命令行修改(其实就是带参数启动)
比如: c:memcachedmemcached.exe -m 512 -d start
(2). 1.4.5版本及其以上
1.解压下载的安装包的指定目录。假设路径为 c:memcached
注意:你需要使用你自己真实的路径替代此路径。
2.使用任务计划来开启一个普通的进程,在windows启动时设置memcached自动执行。使用管理员身份执行以下命令 将memcached添加到任务计划列表中:
schtasks /create /sc onstart /tn memcached /tr "'c:memcachedmemcached.exe' -m 512"
-m 512 表示设置memcached最大的缓存配置为512M。更多参数配置可使用 c:memcachedmemcached.exe -h命令查看
3.如果需要删除memcached的任务计划可使用以下命令:
schtasks /delete /tn memcached
五、内存分配
默认情况下,服务端是用一个内置的叫“块分配器”的组件来分配内存的。舍弃c++标准的malloc/free的内存分配,而采用块分配器的主要目的 是为了避免内存碎片,否则操作系统要花费更多时间来查找这些逻辑上连续的内存块(实际上是断开的)。用了块分配器,服务端会轮流的对内存进行大块的分配,并 不断重用。当然由于块的大小各不相同,当数据大小和块大小不太相符的情况下,还是有可能导致内存的浪费。
同时,服务端对key和value都有相应的限制,key的长度不能超过250字节,value也不能超过块大小的限制 --- 1MB。
因为 客户端使用的hash算法,并不会考虑到每个服务端的内存大小。理论上客户端会分配概率上等量的key-value键值对给每个服务端,这样如果每个服务端的内存都不太一样,那可能 会导致内存使用率的降低。所以一种替代的解决方案是,根据每个服务端的内存大小,找出他们的最大公约数,然后在每个服务端上开n个容量=最大公约数的 instance,这样就等于拥有了多个容量大小一样的子服务端,从而提供整体的内存使用率。
六、缓存策略
当服务端的hash表满了之后,新的插入数据会替代老的数据,更新的策略是LRU(最近最少使用),以及每个key-value键值对的有效时限。key-value键值对存储有效时限是在客户端由app设置并作为参数传给服务端的。
同时服务端采用是偷懒替代法,服务端不会开额外的进程来实时监测过时的key-value键值对并删除,而是当且仅当,新来一个插入的数据,而此时又没有多余的空间放了,才会进行清除动作。
七、memcached连接
通过 telnet 命令指定主机ip和端口来连接memcached服务。
语法: telnet ip port
举例: 连接 127.0.0.1(本机,也可使用localhost),端口 11211 (默认端口)
telnet 127.0.0.1 11211
连接上后,啥都不显示,使用 stats 命令检测是否连接成功