memcached 安装过程 和简单教程 解决方案.docx
- 文档编号:8877375
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:35
- 大小:231.18KB
memcached 安装过程 和简单教程 解决方案.docx
《memcached 安装过程 和简单教程 解决方案.docx》由会员分享,可在线阅读,更多相关《memcached 安装过程 和简单教程 解决方案.docx(35页珍藏版)》请在冰豆网上搜索。
memcached安装过程和简单教程解决方案
memcache
安装
安装libevent库
Linux:
centOs5.4
cd/usr/local/src
wgethttp:
//monkey.org/~provos/libevent-1.3b.tar.gz
tarzxvflibevent-1.3b.tar.gz
cdlibevent-1.3b
./configure
make&&makeinstall
安装成功
安装memcache
cd/usr/local/src
wget
tarzxvfmemcached-1.2.5.tar.gz
cdmemcached-1.2.5
./configure
make&&makeinstall
启动
cdusr/local/bin
bin]#memcached–h
出错
memcached:
errorwhileloadingsharedlibraries:
libevent-1.3b.so.1:
cannotopensharedobjectfile:
Nosuchfileordirectory
google解决方法:
则运行LD_DUBUG=libs就可以知道memcached启动时库的加载路径。
具体如下:
[root@bogonusr/local/bin]#LD_DEBUG=libsmemcached–v
5112:
findlibrary=libevent-1.3b.so.1[0];searching
5112:
searchcache=/etc/ld.so.cache
5112:
searchpath=/lib/tls/i686/sse2:
/lib/tls/i686:
/lib/tls/sse2:
/lib/tls:
/lib/i686/sse2:
/lib/i686:
/lib/sse2:
/lib:
/usr/lib/tls/i686/sse2:
/usr/lib/tls/i686:
/usr/lib/tls/sse2:
/usr/lib/tls:
/usr/lib/i686/sse2:
/usr/lib/i686:
/usr/lib/sse2:
/usr/lib(systemsearchpath)
5112:
tryingfile=/lib/tls/i686/sse2/libevent-1.3b.so.1
5112:
tryingfile=/lib/tls/i686/libevent-1.3b.so.1
5112:
tryingfile=/lib/tls/sse2/libevent-1.3b.so.1
5112:
tryingfile=/lib/tls/libevent-1.3b.so.1
5112:
tryingfile=/lib/i686/sse2/libevent-1.3b.so.1
5112:
tryingfile=/lib/i686/libevent-1.3b.so.1
5112:
tryingfile=/lib/sse2/libevent-1.3b.so.1
5112:
tryingfile=/lib/libevent-1.3b.so.1
5112:
tryingfile=/usr/lib/tls/i686/sse2/libevent-1.3b.so.1
5112:
tryingfile=/usr/lib/tls/i686/libevent-1.3b.so.1
5112:
tryingfile=/usr/lib/tls/sse2/libevent-1.3b.so.1
5112:
tryingfile=/usr/lib/tls/libevent-1.3b.so.1
5112:
tryingfile=/usr/lib/i686/sse2/libevent-1.3b.so.1
5112:
tryingfile=/usr/lib/i686/libevent-1.3b.so.1
5112:
tryingfile=/usr/lib/sse2/libevent-1.3b.so.1
5112:
tryingfile=/usr/lib/libevent-1.3b.so.1
然后给libevent-1.3b.so.1建立一个链接:
[root@bogon~]#sudoln-s/usr/local/lib/libevent-1.3b.so.1/lib/libevent-1.3b.so.1
检查是否建立成功
[root@bogon~]#ls-al/lib|greplibevent
lrwxrwxrwx1rootroot33Aug2519:
52libevent-1.3b.so.1->/usr/local/lib/libevent-1.3b.so.1
此时在bin]#memcached–h
[root@bogonbin]#memcached-h
memcached1.2.5
-p
11211)
-U
0,off)
-s
-a
-l
-drunasadaemon
-rmaximizecorefilelimit
-u
-m
-Mreturnerroronmemoryexhausted(ratherthanremovingitems)
-c
-klockdownallpagedmemory.Notethatthereisa
limitonhowmuchmemoryyoumaylock.Tryingto
allocatemorethanthatwouldfail,sobesureyou
setthelimitcorrectlyfortheuseryoustarted
thedaemonwith(notfor-u
undershthisisdonewith'ulimit-S-lNUM_KB').
-vverbose(printerrors/warningswhileineventloop)
-vvveryverbose(alsoprintclientcommands/reponses)
-hprintthishelpandexit
-iprintmemcachedandlibeventlicense
-brunamanagedinstanced(mnemonic:
buckets)
-P
-f
-n
现在memcache成功搞定
默认情况下memcached安装到/usr/local/bin下。
启动:
[root@bogonbin]#memcached-d-m128-uroot-p11211
检查是否已经启动
[root@bogonbin]#telnet127.0.0.111211
Trying127.0.0.1...
Connectedtolocalhost.localdomain(127.0.0.1).
Escapecharacteris'^]'.
这里使用的memcached启动选项的内容如下。
选项说明
p使用的TCP端口。
默认为11211
m最大内存大小。
默认为64M
vv用veryvrebose模式启动,调试信息和错误输出到控制台
d作为daemon在后台启动
查看memcached的内部状态
[root@bogonbin]#cd/usr/local/bin
[root@bogonbin]#telnet127.0.0.111211
Trying127.0.0.1...
Connectedtolocalhost.localdomain(127.0.0.1).
Escapecharacteris'^]'.
stats
STATpid6779
STATuptime14217是memcached运行的秒数
STATtime1314343512
STATversion1.2.5
STATpointer_size32
STATrusage_user0.002999
STATrusage_system0.027995
STATcurr_items0表示现在在缓存中的键值对个数
STATtotal_items0总数
STATbytes0
STATcurr_connections3当前连接数
STATtotal_connections4总连接数
STATconnection_structures4
STATcmd_get0查询缓存的次数
STATcmd_set0设置key=>value的次数
STATget_hits0缓存命中的次数
STATget_misses0get_misses的数字加上get_hits应该等于cmd_get
STATevictions0
STATbytes_read56
STATbytes_written482
STATlimit_maxbytes134217728
STATthreads1
END
Quit
其中,uptime是memcached运行的秒数,cmd_get是查询缓存的次数。
这两个数据相除一下就能得到
平均每秒请求缓存的次数——最近niupu的流量很低,所以平均也就一秒请求一次多,这么点大的压力,用文件系统缓存一样没问题,根本不会体现出使用memcached的优越。
下面的cmd_set就是设置key=>value的次数。
整个memcached是个大hash,用cmd_get没有找到的内
容,就会调用一下cmd_set写进缓存里。
紧跟着是get_hits,就是缓存命中的次数。
缓存命中率=
get_hits/cmd_get*100%。
下面的get_misses的数字加上get_hits应该等于cmd_get。
而total_itemscurr_items表示现在在缓存中的键值对个数,在图上total_items==cmd_set==get_misses,不过当可用最大内存用光时,memcached就会删掉一些内容,上面的等式就不成立了。
Springaop管理memcached
1,给DAO的方法上加SpringAOP的Around通知,决定数据从数据库获得还是从缓存获得。
2,自定义两个Annotation,@Cache和@Flush,分别加在DAO的查询和修改的方法上。
3,Around通知函数内用反射获取上述的@cache和@Flush,代表是记录缓存,还是删除缓存。
4,记录缓存时用“类名+方法名+参数的hashcode”作为Key,删除缓存时,删除所有的同类名开头的key对应的缓存。
5,Memcached不支持遍历key,所以采用数据库表记录key,假设:
tbl_memcached(key,exp_date)。
6,定义一个时钟,定期删除tbl_memcached的过期记录(删除数据库记录前,删除缓存)。
7,记录缓存时,同时存入一条记录到tbl_memcached表。
8,删除缓存是依据tbl_memcache表的key来进行,并且要删除tbl_memcached表的相关记录。
使用memcached显著提升站点性能
Memcached常被用来加速应用程序的处理,在这里,我们将着重于介绍将它部署于应用程序和环境中的最佳实践。
这包括应该存储或不应存储哪些、如何处理数据的灵活分布以及如何调节用来更新memcached和所存储数据的方法。
我们还将介绍对高可用性的解决方案的支持,比如IBMWebSphere®eXtremeScale。
所有的应用程序,特别是很多web应用程序都需要优化它们访问客户机和将信息返回至客户机的速度。
可是,通常,返回的都是相同的信息。
从数据源(数据库或文件系统)加载数据十分低效,若是每次想要访问该信息时都运行相同的查询,就尤显低效。
虽然很多web服务器都可被配置成使用缓存发回信息,但那与大多数应用程序的动态特性无法相适。
而这正是memcached的用武之地。
它提供了一个通用的内存存储器,可保存任何东西,包括本地语言的对象,这就让您可以存储各种各样的信息并可以从诸多的应用程序和环境访问这些信息。
1基础知识
Memcached是一个开源项目,旨在利用多个服务器内的多余RAM来充当一个可存放经常被访问信息的内存缓存。
这里的关键是使用了术语缓存:
memcached为加载自他处的信息提供的是内存中的暂时存储。
比如,考虑这样一个典型的基于web的应用程序。
即便是一个动态网站可能也会有一些组件或信息常量是贯穿页面整个生命周期的。
在一个博客站点内,针对单个blogpost的类别列表不大可能在页面查看间经常性地变更。
每次都通过一个对数据库的查询加载此信息相对比较昂贵,特别是在数据没有更改的情况下,就更是如此。
从图1可以看到一个博客站点内可被缓存的页面分区。
将这种结构放在blog站点的其他元素,poster信息、注释—设置blogpost本身—进行推断,可以看出为了显示主页的内容很可能需要发生10-20次数据库查询和格式化。
每天对数百甚至数千的的页面查看重复此过程,那么您的服务器和应用程序执行的查询要远远多于为了显示页面内容所需执行的查询。
通过使用memcached,可以将加载自数据库的格式化信息存储为一种可直接用在Web页面上的格式。
并且由于信息是从RAM而不是通过数据库和其他处理从磁盘加载的,所以对信息的访问几乎是瞬时的。
再强调一下,memcached是一个用来存储常用信息的缓存,有了它,您便无需从缓慢的资源,比如磁盘或数据库,加载并处理信息了。
对memcached的接口是通过网络连接提供的。
这意味着您可以在多个客户机间共享单个的memcached服务器(或多个服务器,如本文稍后所示的)。
这个网络接口非常迅速,并且为了改善性能,服务器会故意不支持身份验证或安全性通信。
但这不应限制部署选项。
memcached服务器应该存在于您网络的内部。
网络接口的实用性以及可以部署多个memcached实例的简便性让您可以使用多个机器上的多余RAM来提高您缓存的整体大小。
memcached的存储方法是一个简单的键/值对,类似于很多语言内的散列或关联数组。
通过提供键和值来将信息存储到memcached内,通过按特定的键请求信息来恢复信息。
信息会无限期地保留在缓存内,除非发生如下的情况:
1.为缓存分配的内存耗尽—在这种情况下,memcached使用LRU(最近最少使用)方法从此缓存删除条目。
最近未曾使用的条目会从此缓存中先删除,最旧的最先访问。
2.条目被明确删除—总是可以从此缓存内删除条目。
3.条目过期失效—各条目均有一个有效的期限以便针对此键存储的信息在过于陈旧时可从缓存中清除这些条目。
上述这些情况可以与您应用程序的逻辑综合使用以便确保缓存内的信息是最新的。
有了这些基础知识后,让我们来看看在应用程序内如何能最好地利用memcached。
2何时使用memcached
在使用memcached改进应用程序性能时,可以对一些关键的过程和步骤进行修改。
在加载信息时,典型的场景下图所示。
一般而言,这些步骤是:
1.执行一个或多个查询来从数据库加载信息
2.格式化适合于显示(或进一步处理)的信息
3.使用或显示格式化了的数据
在使用memcached时,为配合这个缓存,可对应用程序的逻辑进行稍许修改:
∙尽量从缓存加载信息
∙如果存在,使用信息的被缓存版本
∙如果它不存在:
1.执行一个或多个查询来从数据库加载信息
2.格式化适合于显示或进一步处理的信息
3.将信息存储到缓存内
4.使用格式化了的数据
下面是对这些步骤的总结。
数据加载成为了至多三个步骤的一个过程,从缓存加载数据或从数据库(视情况而定)加载数据并存储在缓存内。
当这个过程首次发生时,数据将正常地从数据库或其他数据源加载,然后再存储到memcached内。
当下一次访问此信息时,它就会从memcached拉出,而不是从数据库加载,节省了时间和CPU循环。
问题的另一个方面是要确保如果更改了要存储在memcached内的信息,在更新后端信息的同时还要更新memcached的版本
在一个典型的应用程序内更新或存储数据
比如,仍以博客站点为例,在博客系统更新数据库内的类别列表时,更新应该遵循如下顺序:
1.更新数据库内的类别列表
2.格式化信息
3.将信息存储到memcached内
4.将信息返回至客户机
memcached内的存储操作是原子的,所以信息的更新不会让客户机只获得部分数据;它们获得的或者是老版本,或者是新版本。
对于大多数应用程序,这两个操作是您惟一需要注意的。
在访问他人使用的数据时,它会自动被添加到这个缓存内,而且如果对该数据进行了更改,此缓存内也会自动进行更新。
3键、名称空间和值
memcached另一个需要重点考虑的因素是如何组织和命名存储在缓存内的这些数据。
从之前博客站点的例子中,不难看出需要使用一种一致的命名结构以便您能加载博客类别、历史和其他信息,然后再在加载信息(并更新缓存)时或者在更新数据(同样也要更新缓存)时使用。
使用的何种具体的命名系统特定于应用程序,但通常可以使用一种与现有应用程序类似的结构,并且这种结构很可能基于某种惟一识别符。
当从数据库拉出信息或在整理信息集时,就会发生这种情况。
以blogpost为例,可以在一个具有键category-list的项中存储类别列表。
与此postID对应的单个post,比如blogpost-29相关的值都可以使用,而该项的注释则可以存储在blogcomments-29内,其中29就是这个blogpost的ID。
这样一来,您就可以将各种各样的信息存储在缓存内,使用不同的前缀来标识这些信息。
在存储值的方面,应该确保存储在缓存内的信息适合于您的应用程序。
比如,对于这个博客系统,您可能想要存储被博客应用程序使用的对象以便格式化博客信息,而不是原始的HTML。
如果同一个基础结构用在应用程序内的多个地方,这一点更具实用性。
大多数语言的接口,包括Java™、Perl、PHP等,都能串行化语言对象以便存储在memcached内。
这就让您可以存储并随后从内存存储恢复全部对象,而不是在您的应用程序内手动重构它们。
很多对象,或它们使用的结构,都基于某种散列或数组结构。
对于跨语言的环境,比如在JSP环境和JavaScript环境间共享相同信息,可以使用一种架构中立的格式,比如JavaScriptObjectNotation(JSON)甚或XML。
4填充并使用memcached
作为一种开源产品以及一种最初开发用来工作于现有开源环境内的产品,memcached受大量环境和平台支持。
与memcached服务器通信的接口有很多,并常常具有针对所有语言的多个实现。
要列出所有受支持的接口和环境不太可能,但它们均支持memcached协议提供的基础API。
这些描述已经被简化并应用在不同语言的上下文内,在这些语言中,使用不同的值可指示错误。
主要的函数有:
∙get(key)—从存储了特定键的memcached获得信息。
如果键不存在,就返回错误。
∙set(key,value[,expiry])—使用缓存内的标识符键存储这个特定的值。
如果键已经存在,那么它就会被更新。
期满时间的单位为秒,并且如果值小于30天(30*24*60*60),那么就用作相对时间,如果值大于30天,那么就用作绝对时间(epoch)。
∙add(key,value[,expiry])—如果键不存在就将这个键添加到缓存内,如果键已经存在就返回错误。
如果您想要显式地添加一个新键而又不会因它已经存在而更新它,那么这个函数将十分有用。
∙replace(key,value[,expiry])—更新此特定键的值,如果键不存在就返回一个错误。
∙delete(key[,time])—从缓存中删除此键/值对。
如果您提供一个时间,那么添加具有此键的一个新值就会被阻塞这个特定的时期。
超时让您可以确保此值总是可以重新读取自您的数据中心。
∙incr(key[,value])—为特定的键增1或特定的值。
只适用于数值。
∙decr(key[,value])—为特定的键减1或特定的值,只适用于数值。
∙flush_all—让缓存内的所有当前条目无效(或到期失效)。
比如,在Perl内,基本set操作可以如清单1所示的那样处理。
清单1.Perl内的基本set操作
1
useCache:
:
Memcached;
2
∙
3
my$cache=newCache:
:
Memcached{
4
'servers'=>[
∙
5
'localhost:
11211',
6
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- memcached 安装过程 和简单教程 解决方案 安装 过程 简单 教程