Memcache缓存系统知识点梳理

Memcached概念:
Memcached是一个免费开源的,高性能的,具有分布式对象的缓存系统,它可以用来保存一些经常存取的对象或数据,保存的数据像一张巨大的HASH表,该表以Key-value对的方式存在内存中。
官网下载地址: http://www.memcached.org/
运行环境: linux,BSD,windows都可跑
协议理论:http://code.sixapart.com/svn/memcached/trunk/server/doc/protocol.txt (英文)

操作流程:


1、检查客户端的请求数据是否在memcached中,如有,直接把请求数据返回,不再对数据库进行任何操作,路径操作为①②③⑦。

2、如果请求的数据不在memcached中,就去查数据库,把从数据库中获取的数据返回给客户端,同时把数据缓存一份到memcached中(memcached客户端不负责,需要程序明确实现),路径操作为①②④⑤⑦⑥。
3、每次更新数据库的同时更新memcached中的数据,保证一致性。

4、当分配给memcached内存空间用完之后,会使用LRU(Least Recently Used,最近最少使用)策略加上到期失效策略,失效数据首先被替换,然后再替换掉最近未使用的数据。

Memcached特征:

协议简单
   它是基于文本行的协议,直接通过telnet在memcached服务器上可进行存取数据操作
基于libevent事件处理
    Libevent是一套利用C开发的程序库,它将BSD系统的kqueue,Linux系统的epoll等事件处理功能封装成一个接口,与传统的select相比,提高了性能。
内置的内存管理方式
    所有数据都保存在内存中,存取数据比硬盘快,当内存满后,通过LRU算法自动删除不使用的缓存,但没有考虑数据的容灾问题,重启服务,所有数据会丢失。
分布式
   各个memcached服务器之间互不通信,各自独立存取数据,不共享任何信息。服务器并不具有分布式功能,分布式部署取决于memcache客户端。

Memcached安装与启动:
安装memcached需要先安装libevent

代码如下:

Shell>tar zxvf libevent-1.4.14b-stable.tar.gz
Shell>cd libevent-1.4.14b-stable
Shell>./configure
Shell>make && make install

安装memcached


代码如下:

Shell>tar zxvf memcached-1.2.5.tar.tar
Shell>cd memcached-1.2.5
Shell>./configure –prefix=/usr/local/memcached
Shell>make && make install

启动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算法

在64位系统中,会报libevent-1.4.so.2文件无法找到,解决办法是把32位目录里的同名文件链接至64位目录中,即像windows那样建立快捷方式。
Shell > /usr/local/lib/libevent-1.4.so.2 /usr/lib64/libevent-1.4.so.2
启动后如果发现没有端口在监听,是因为命动命令时带pid参数的“p”是大写“P”,你可能写成小写了。

命令行直接操作命令

存,有六个命令项。


代码如下:

Set:添加一个新条目到memcached或是用新的数据替换替换掉已存在的条目
Add:当KEY不存在的情况下,它向memcached存数据,否则,返回NOT_STORED响应
Replace:当KEY存在的情况下,它才会向memcached存数据,否则返回NOT_STORED响应
Cas:改变一个存在的KEY值 ,但它还带了检查的功能
Append:在这个值后面插入新值
Prepend:在这个值前面插入新值

取,有两个命令项:

代码如下:

Get:取单个值 ,从缓存中返回数据时,将在第一行得到KEY的名字,flag的值和返回的value长度,真正的数据在第二行,最后返回END,如KEY不存在,第一行就直接返回END
Get_multi:一次性取多个值

删除,一个命令:


代码如下:

Delete

实例操作:
先连接到memcache


代码如下:

shell>telnet 127.0.0.1 11211

在入数据



代码如下:

Set liuguohua 0 0 21
369369.blog.51cto.com

回车后系统自动保存,并返回正常值STORED
存入命令格式为
<command> <key> <flags> <exptime> <bytes> \r\n
注意在设定bytes字节后,存入的值的长度一定要与之匹配,否则无法保存成功,像liuguohua字段为21字节,所以存入的369369.blog.51cto.com长度为21(总计为21个数字或字母)。

取数据


代码如下:

Get liuguohua

回车后,第一行返回VALUE liuguohua 0 21
第二行,返回真正值369369.blog.51cto.com

Memcached的内存算法:

Memcached利用slab allocation机制来分配和管理内存,它按照预先规定的大小,将分配的内存分割成特定长度的内存块,再把尺寸相同的内存块分成组,数据在存放时,根据键值 大小去匹配slab大小,找就近的slab存放,所以存在空间浪费现象。

传统的内存管理方式是,使用完通过malloc分配的内存后通过free来回收内存,这种方式容易产生内存碎片并降低操作系统对内存的管理效率。

Memcached的缓存策略:

Memcached的缓存策略是LRU(最近最少使用)加上到期失效策略。当你在memcached内存储数据项时,你有可能会指定它在缓存的失效时间,默认为永久。当memcached服务器用完分配的内时,失效的数据被首先替换,然后也是最近未使用的数据。在LRU中,memcached使用的是一种Lazy Expiration策略,自己不会监控存入的key/vlue对是否过期,而是在获取key值时查看记录的时间戳,检查key/value对空间是否过期,这样可减轻服务器的负载。

Memcached的分布式算法:
当向memcached集群存入/取出key/value时,memcached客户端程序根据一定的算法计算存入哪台服务器,然后再把key/value值存到此服务器中。也就是说,存取数据分二步走,第一步,选择服务器,第二步存取数据。

分布式算法(Consistent Hashing):

选择服务器算法有两种,一种是根据余数来计算分布,另一种是根据散列算法来计算分布。
余数算法:
先求得键的整数散列值,再除以服务器台数,根据余数确定存取服务器,这种方法计算简单,高效,但在memcached服务器增加或减少时,几乎所有的缓存都会失效。
散列算法:
先算出memcached服务器的散列值,并将其分布到0到2的32次方的圆上,然后用同样的方法算出存储数据的键的散列值并映射至圆上,最后从数据映射到的位置开始顺时针查找,将数据保存到查找到的第一个服务器上,如果超过2的32次方,依然找不到服务器,就将数据保存到第一台memcached服务器上。如果添加了一台memcached服务器,只在圆上增加服务器的逆时针方向的第一台服务器上的键会受到影响。

Memcache的管理与性能监控:

可以通过命令行直接管理与监控也可通过nagios,cacti等web软件进行监控
命令行:


代码如下:

Shell>telnet 127.0.0.1 1211 //如果在启动时指定了IP及端口号,这里要作相应改动
连接成功后命令
Stats:统计memcached的各种信息
Stats reset:重新统计数据
Stats slabs,显示slabs信息,可以详细看到数据的分段存储情况
Stats items:显示slab中的item数目
Stats cachedump 1 0:列出slabs第一段里存的KEY值
Set|get:保存或获取数据
STAT evictions 0:表示要腾出新空间给新的item而移动的合法item数目

其它常用软件使用:


代码如下:

Shell>./Memcached-tool 127.0.0.1:11211
Shell>./Memcached-tool 127.0.0.1:11211 display

Web软件:


代码如下:

Memcache.php
Nagios插件
Cacti模块

Memcached与redis比较:

本文出自 “系统网络运维” 博客,请务必保留此出处http://369369.blog.51cto.com/319630/833234

(0)

相关推荐

  • Memcache缓存系统知识点梳理

    Memcached概念: Memcached是一个免费开源的,高性能的,具有分布式对象的缓存系统,它可以用来保存一些经常存取的对象或数据,保存的数据像一张巨大的HASH表,该表以Key-value对的方式存在内存中. 官网下载地址: http://www.memcached.org/ 运行环境: linux,BSD,windows都可跑 协议理论:http://code.sixapart.com/svn/memcached/trunk/server/doc/protocol.txt (英文) 操

  • Android 内存优化知识点梳理总结

    目录 RAM 和 ROM 常见内存问题 内存溢出 内存泄漏 常见内存泄漏场景 静态变量或单例持有对象 非静态内部类的实例生命周期比外部类更长导致的内存泄漏 Handler 导致的内存泄漏 postDelayed 导致的内存泄漏 View 的生命周期大于 Activity 时导致的内存泄漏 集合中的对象未释放导致内存泄漏 WebView 导致的内存泄漏 内存抖动 解决方案 其他优化点 App 内存过低时主动清理 前言: Android 操作系统给每个进程都会分配指定额度的内存空间,App 使用内存

  • PHP使用memcache缓存技术提高响应速度的方法

    本文实例讲述了PHP使用memcache缓存技术提高响应速度的方法.分享给大家供大家参考.具体分析如下: php虽然己经做到很好很快了,但是如果大数据量时还是会有些卡了,这里介绍一下PHP中使用memcache缓存技术提高响应速度方法,有需要了解的朋友可参考. memcache既可以在linux下使用,也可以在windows系统下使用,当然首推linux系统,至于如何安装memcache,google一下就什么都出来了. 下面贴一段memcache的使用例子,代码如下: 复制代码 代码如下: <

  • 利用php操作memcache缓存的基础方法示例

    前言 最近在工作中又遇到了memcache,大家应该都有所了解,memcache 是一个高效的分布式的内存对象缓存系统,他可以支持把php的各种数据(数组,对象,基本数据类型)放在它管理的内存中,本文将给大家详细介绍关于php操作memcache缓存的基础方法,话不多说,来一起看看详细的介绍吧. 1.代码使用 <?php //连接 $mem = new Memcache; $mem->connect("127.0.0.1", 11211) or die ("Cou

  • Memcached缓存系统的介绍、安装以及应用方法详解

    本文实例讲述了Memcached缓存系统的介绍.安装以及应用方法.分享给大家供大家参考,具体如下: 一. memcached 是什么? memcached is a high-performance, distributed memory object caching system, generic in nature, but intended for use in speeding up dynamic web applications by alleviating database loa

  • Discuz!下Memcache缓存实现方法

    前言:在PHP+MySQL架构的站点中,本文重点从MySQL的角度去分析如何使Discuz!论坛(或者类似的PHP+MySQL架构的程序)应对大访问量.同时给出一些使用Memcache去减轻MySQL压力的建议.其中很多数据是个人测试的结果,如有不同意见,敬请留言告之.另外由于个人思维的问题,行文比较跳跃,特此声明! 系统分析:单纯的从MySQL的角度出发,单台MySQL的数据库负载到每天上亿次的操作(每秒大概1100次MySQL操作,然后乘以86400)应该不是非常困难的事情.按照这个数据也就

  • Java Dubbo框架知识点梳理

    1.Dubbo是什么 Dubbo 是一个分布式.高性能.透明化的 RPC 服务框架,提供服务自动注册.自动发现等高效服务治理方案, 可以和 Spring 框架无缝集成. RPC 指的是远程调用协议,也就是说两个服务器交互数据. 2.Dubbo的由来 互联网的快速发展,Web应用程序的规模不断扩大,一般会经历如下四个发展阶段. 单一应用架构:当网站流量很小时,只需一个应用,将所有功能都部署在一起即可. 垂直应用架构:当访问量逐渐增大,单一应用按照有业务线拆成多个应用,以提升效率.此时,用于加速前端

  • ThinkPHP简单使用memcache缓存的方法

    本文实例讲述了ThinkPHP简单使用memcache缓存的方法.分享给大家供大家参考,具体如下: Thinkphp的默认缓存方式是以File方式,在/Runtime/Temp 下生成了好多缓存文件. 服务器装了memcached后想给更改成memecache方式 在Conf/config.php 中添加 'DATA_CACHE_TYPE' => 'Memcache', 'MEMCACHE_HOST' => 'tcp://127.0.0.1:11211', 'DATA_CACHE_TIME'

  • 使用Memcache缓存mysql数据库操作的原理和缓存过程浅析

    对于大型网站如facebook,ebay等网站,如果没有Memcache做为中间缓存层,数据访问不可能吃得消,对于一般网站,只要具备独立的服务器,完全可以通过配置Memcache提高网站访问速度和减少数据库压力,这里主要讨论一下Memcache和MySQL数据库交互过程的流程关系,了解Memcache的中间缓存层作用,从而深入了解Memcache机制原理. Memcache和MySQL交互流程图 如上图,传统的查询方法是直接查询数据库,数据库将结果返回给查询语句,而当有Memcache中间缓存层

  • php操作memcache缓存方法分享

    使用memcache的前提是需要在服务端先配置好memcahche的环境!确认memcahce可以正常连接之后就可以在程序使用了! <?php /** * Memcache缓存操作 * @author hxm * @version 1.0 * @since 2015.05.04 */ class MCache extends Object implements CacheFace { private $mem = null; //Mem对象 private $sId = 1; //servier

随机推荐