Memcached概念:
Memcached是danga.com开发的一套分布式内存对象缓存系统,用于在动态系统中减少数据库负载,提升性能。
Memcached是⼀个免费开源的,高性能的,具有分布式对象的缓存系统,它可以用来保存一些经常存取的对象或数据,保存的数据像⼀张巨⼤的HASH 表,该表以Key-value对的方式存在内存中。
Memcached是⾼性能的,分布式的内存对象缓存系统,⽤于在动态应用中减少数据库负载,提升访问速度。
官⺴网地址: http://www.memcached.org/
运行环境: linux,BSD,windows
适用场合
- 分布式应用:
由于memcached本身基于分布式的系统,所以尤其适合⼤型的分布式系统。 - 数据库前段缓存:
数据库常是网站系统的瓶颈。数据库的⼤并发量访问,常造成网站内存溢出。当然我们也可以使用Hibernate的缓存机制。但 memcached是基于分布式的,并可独立于网站应用本身,所以更适合大型⺴站进⾏应⽤的拆分。 - 服务器间数据共享:
举例来讲,我们将网站的登录系统、查询系统拆分为两个应用,放在不同的服务器上,并进⾏集群,那这个时候⽤户登录后,登录信息如何从登录系统服务器同步到查询系统服务器呢?这时候,我们便可以使用memcached,登录系统将登录信息缓存起来,查询系统便可以获得登录信息,就像获取本地信息一样。
不适⽤场合
那些不需要“分布”的,不需要共享的,或者干脆规模小到只有一台服务器的应用,memcached不会带来任何好处,相反还会拖慢系统效率,因为网络连接同样需要资源
操作流程:
1、检查客户端的请求数据是否在memcached中,如有,直接把请求数据返回,不再对数据库进行任何操作,路径操作为①②③⑦。
2、如果请求的数据不在memcached中,就去查数据库,把从数据库中获取的数据返回给客户端,同时把数据缓存一份到memcached中(memcached客户端不负责,需要程序明确实现),路径操作为①②④⑤⑦2。
3、每次更新数据库的同时更新memcached中的数据,保证一致性。
4、当分配给memcached内存空间用完之后,会使用LRU(Least Recently Used,最近最少使用)策略加上到期失效策略,失效数据首先被替换,然后再替换掉最近未使用的数据。
Memcached特征:
协议简单
它是基于文本行的协议,直接通过telnet在memcached服务器上可进行存取数据操作
基于libevent的事件处理
在Linux环境下应用Memcache时,Memcache用到了libevent这个库,用于Socket的处理,所以还需要安装libevent。
内置的内存管理方式
所有数据都保存在内存中,存取数据比硬盘快,当内存满后,通过LRU算法自动删除不使用的缓存,但没有考虑数据的容灾问题,重启服务,所有数据会丢失。
分布式
各个memcached服务器之间互不通信,各自独立存取数据,不共享任何信息。服务器并不具有分布式功能,分布式部署取决于memcache客户端。
Memcached安装与启动:
方法一,下载压缩包,解压,安装
1.安装memcached需要先安装libevent
2.安装memcached
3启动memcached
Shell>/usr/local/memcached/bin/memcached -p 11211 -d -u root -P /tmp/memcached.pid
-P是表示使用TCP,默认端口为11211
-d表示后台启动一个守护进程(daemon)
-u表示指定root用户启动,默认不能用root用户启动
-P表示进程的pid存放地点,此处“p”为大写“P”
-l,后面跟IP地址,手工指定监听IP地址,默认所有IP都在监听
-m后面跟分配内存大小,以MB为单位,默认为64M
-c最大运行并发连接数,默认为1024
-f 块大小增长因子,默认是1.25
-M 内存耗尽时返回错误,而不是删除项,即不用LRU算法
-h 显⽰示帮助
-d start 启动memcached服务
-d restart 重起memcached服务
-d stop|shutdown 关闭正在运⾏行的memcached服务 -d install 安装memcached服务
-d uninstall 卸载memcached服务
方法二:
参考memcache官网安装方法
命令行直接操作命令
Command | Description | Example |
---|---|---|
get | Reads a value | get mykey |
set | Set a key unconditionally | set mykey 0 60 5 |
add | Add a new key | add newkey 0 60 5 |
replace | Overwrite existing key | replace key 0 60 5 |
append | Append data to existing key | append key 0 60 15 |
prepend | Prepend data to existing key | prepend key 0 60 15 |
incr | Increments numerical key value by given number | incr mykey 2 |
decr | Decrements numerical key value by given number | decr mykey 5 |
delete | Deletes an existing key | delete mykey |
flush_all | Invalidate specific items immediately | flush_all |
flush_all | Invalidate all items in n seconds | flush_all 900 |
version | Prints server version. | version |
verbosity | Increases log level | verbosity |
quit | Terminate telnet session | quit |
stats | Prints general statistics | stats |
显示slabs信息,可以详细看到数据的分段存储情况 | stats slabs | |
Resets statistics | Stats reset | |
Prints memory statistics | stats malloc | |
Print higher level allocation statistics | stats items | |
列出slabs第一段里存的KEY值 | Stats cachedump 1 0 | |
表示要腾出新空间给新的item而移动的合法item数目STAT | evictions 0 | |
stats sizes |
实例操作:
一、先连接到memcache
shell>telnet 127.0.0.1 11211
二、存⼊数据
Set baidu 0 0 14
www.baidu.com
回车后系统自动保存,并返回正常值STORED
存入命令格式为
<command> <key> <flags> <exptime> <bytes> \r\n
注意在设定bytes字节后,存入的值的长度一定要与之匹配,否则无法保存成功, 如百度字段设置为14字节,所以存入的www.baidu.com长度为14。
三、取数据
get baidu