文档章节

Memcache学习总结

玄影镜心
 玄影镜心
发布于 2015/01/21 10:50
字数 2561
阅读 232
收藏 11
点赞 0
评论 0

一:简介

1:memcache是一个高性能的分布式的内存对象缓存系统,它在内存里维护一个统一的巨大的hash表。能用来缓存各种格式的数据,包括图像、视频、文件以及数据库检索等结果(将数据调到内存中,然后从内存中读取,从而大大提高读取速度)

2:memcache是以守护程序方式运行于一个或多个服务器中,随时会接收客户的连接和操作。


二:memcache的主要特点

    1:基于c/s架构,协议简单

    2:机遇libevent的事件处理

    3:自主内存存储处理

    4:机遇客户端的memcached分布式   

特性与限制

        1:在memcache中可以保存的item数据是没有限制的,只要内存足够。

          Memcached单进程在32位系统中最大使用内存为2G,若在64位系统则没有限制,这是由于32位系统限制单进程最多可使用2G内存,要使用更多内存,可以分多个端口开启多个Memcached进程 。

            最大30天的数据过期时间,设置为永久也会在这个时间过期。最长键长为250字节,大于该长度无法存储。最大同事连接数是200

    2:memcache是一种无阻塞的socket通信方式服务,基于libevent库,犹豫无阻塞通信,对内存读写速度非常快。

    3:memcache分服务器和客户端,可以配置多个服务器和客户端。memcache作为小规模的数据分布式平台室分有效果。

    4:memcache是键值一一对应,key默认最大不能超过128字节


三:原理

3.1 运行原理图

    

自主的内存存储处理

    数据存储方式::Slab Allocation

    数据过期方式Lazy Expiration  + LRU  

                            (Lazy Expiration:内部不监视记录过期时间,只在get时查看记录的时间戳,检查记录是否过期)

                            (LRU:memcache会优先使用已超时的记录的空间,但即使如此,也会发生追加新记录时空间不足的情况,此时就要使用名为least Recently used 机制来分配空间。顾名思义,这是删除”最近最少使用“记录的机制。)

四:其他

适用memcached的业务场景?

    1)如果网站包含了访问量很大的动态网页,因而数据库的负载将会很高。由于大部分数据库请求都是读操作,那么memcached可以显著地减小数据库负载。

    2)如果数据库服务器的负载比较低但CPU使用率很高,这时可以缓存计算好的结果( computed objects )和渲染后的网页模板(enderred templates)。

    3)利用memcached可以缓存session数据、临时数据以减少对他们的数据库写操作。

    4)缓存一些很小但是被频繁访问的文件。

    5)缓存Web 'services'(非IBM宣扬的Web Services,译者注)或RSS feeds的结果.。

3、不适用memcached的业务场景?

    1)缓存对象的大小大于1MB

    Memcached本身就不是为了处理庞大的多媒体(large media)和巨大的二进制块(streaming huge blobs)而设计的。

    2)key的长度大于250字符

    3)虚拟主机不让运行memcached服务

         如果应用本身托管在低端的虚拟私有服务器上,像vmware, xen这类虚拟化技术并不适合运行memcached。Memcached需要接管和控制大块的内存,如果memcached管理      的内存被OS或 hypervisor交换出去,memcached的性能将大打折扣。

    4)应用运行在不安全的环境中

    Memcached未提供任何安全策略,仅仅通过telnet就可以访问到memcached。如果应用运行在共享的系统上,需要着重考虑安全问题。

    5)业务本身需要的是持久化数据或者说需要的应该是database

4、 不能够遍历memcached中所有的item

     这个操作的速度相对缓慢且阻塞其他的操作(这里的缓慢时相比memcached其他的命令)。memcached所有非调试(non-debug)命令,例如add, set, get, fulsh等无论

memcached中存储了多少数据,它们的执行都只消耗常量时间。任何遍历所有item的命令执行所消耗的时间,将随着memcached中数据量的增加而增加。当其他命令因为等待(遍历所有item的命令执行完毕)而不能得到执行,因而阻塞将发生。

5、  memcached能接受的key的最大长度是250个字符

memcached能接受的key的最大长度是250个字符。需要注意的是,250是memcached服务器端内部的限制。如果使用的Memcached客户端支持"key的前缀"或类似特性,那么key(前缀+原始key)的最大长度是可以超过250个字符的。推荐使用较短的key,这样可以节省内存和带宽。

6、  单个item的大小被限制在1M byte之内

因为内存分配器的算法就是这样的。

详细的回答:

1)Memcached的内存存储引擎,使用slabs来管理内存。内存被分成大小不等的slabs chunks(先分成大小相等的slabs,然后每个slab被分成大小相等chunks,不同slab的chunk大小是不相等的)。chunk的大小依次从一个最小数开始,按某个因子增长,直到达到最大的可能值。如果最小值为400B,最大值是1MB,因子是1.20,各个slab的chunk的大小依次是:

slab1 - 400B;slab2 - 480B;slab3 - 576B ...slab中chunk越大,它和前面的slab之间的间隙就越大。因此,最大值越大,内存利用率越低。Memcached必须为每个slab预先分配内存,因此如果设置了较小的因子和较大的最大值,会需要为Memcached提供更多的内存。

2)不要尝试向memcached中存取很大的数据,例如把巨大的网页放到mencached中。因为将大数据load和unpack到内存中需要花费很长的时间,从而导致系统的性能反而不好。如果确实需要存储大于1MB的数据,可以修改slabs.c:POWER_BLOCK的值,然后重新编译memcached;或者使用低效的malloc/free。另外,可以使用数据库、MogileFS等方案代替Memcached系统。

7、  memcached的内存分配器是如何工作的?为什么不适用malloc/free!?为何要使用slabs?

实际上,这是一个编译时选项。默认会使用内部的slab分配器,而且确实应该使用内建的slab分配器。最早的时候,memcached只使用malloc/free来管理内存。然而,这种方式不能与OS的内存管理以前很好地工作。反复地malloc/free造成了内存碎片,OS最终花费大量的时间去查找连续的内存块来满足malloc的请求,而不是运行memcached进程。slab分配器就是为了解决这个问题而生的。内存被分配并划分成chunks,一直被重复使用。因为内存被划分成大小不等的slabs,如果item的大小与被选择存放它的slab不是很合适的话,就会浪费一些内存。

8、memcached对item的过期时间有什么限制?

item对象的过期时间最长可以达到30天。memcached把传入的过期时间(时间段)解释成时间点后,一旦到了这个时间点,memcached就把item置为失效状态,这是一个简单但obscure的机制。

9、什么是二进制协议,是否需要关注?

二进制协议尝试为端提供一个更有效的、可靠的协议,减少客户端/服务器端因处理协议而产生的CPU时间。根据Facebook的测试,解析ASCII协议是memcached中消耗CPU时间最多的

环节。

10、 memcached的内存分配器是如何工作的?为什么不适用malloc/free!?为何要使用slabs?

实际上,这是一个编译时选项。默认会使用内部的slab分配器,而且确实应该使用内建的slab分配器。最早的时候,memcached只使用malloc/free来管理内存。然而,这种方式不能与OS的内存管理以前很好地工作。反复地malloc/free造成了内存碎片,OS最终花费大量的时间去查找连续的内存块来满足malloc的请求,而不是运行memcached进程。slab分配器就是为了解决这个问题而生的。内存被分配并划分成chunks,一直被重复使用。因为内存被划分成大小不等的slabs,如果item的大小与被选择存放它的slab不是很合适的话,就会浪费一些内存。

11、memcached是原子的吗?

所有的被发送到memcached的单个命令是完全原子的。如果您针对同一份数据同时发送了一个set命令和一个get命令,它们不会影响对方。它们将被串行化、先后执行。即使在多线程模式,所有的命令都是原子的。然是,命令序列不是原子的。如果首先通过get命令获取了一个item,修改了它,然后再把它set回memcached,系统不保证这个item没有被其他进程(process,未必是操作系统中的进程)操作过。memcached 1.2.5以及更高版本,提供了gets和cas命令,它们可以解决上面的问题。如果使用gets命令查询某个key的item,memcached会返回该item当前值的唯一标识。如果客户端程序覆写了这个item并想把它写回到memcached中,可以通过cas命令把那个唯一标识一起发送给memcached。如果该item存放在memcached中的唯一标识与您提供的一致,写操作将会成功。如果另一个进程在这期间也修改了这个item,那么该item存放在memcached中的唯一标识将会改变,写操作就会

失败。




本文转载自:http://blog.csdn.net/hguisu/article/details/6163621

共有 人打赏支持
玄影镜心
粉丝 8
博文 90
码字总数 49460
作品 0
西安
高级程序员
Memcache学习总结2-Memcache的使用基本介绍

Memcache学习总结2-Memcache的使用基本介绍 上一次总结中我们已经安装部署好了Memcached,并且把PHP扩展Memcache也安装好了,这一节我们详细学习一下PHP扩展Memcache。Memcache客户端包含两组...

开元中国2015
2015/04/04
167
0
《Memcache学习总结》[PDF]发布

《Memcache学习总结》[PDF]发布 百度网盘共享: http://pan.baidu.com/s/1mgvayQO 版本号: V1.2 最后跟新: 2015-04-01 讨论组:http://www.lai18.com/group/214130.html QQ群:263832661...

开元中国2015
2015/04/06
194
0
车江毅/DistributedCache

##分支说明## 该分支是基于BSF的基础上开发的分支。 修改内容 1)sdk以插件的形式扩展自BSF。 2)项目命名空间从Dyd.Base.DistributedCache修改为DistributedCache 3) 打包安装包,可以直接被...

车江毅
2015/12/31
0
0
memcache的hash一致性

MemCache是一个自由、源码开放、高性能、分布式的分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高了网站访问的...

吴之恒心
2017/02/24
0
0
编写GO的WEB开发框架 (一): 我需要一个什么样的框架?

写了多年的PHP,go刚出来时也了解过。过年时重新看了一些文档和文章,并着手用GO去写一个WEB开发框架,算是正式学习的加固。现在,框架已基本成型,在此想通过文字总结一下整个过程。 框架本...

TimWong
2016/03/02
189
2
memcache 源码分析之开场白

装逼以前的一段独白: 现在2018年5月5号。距离上次写技术博客还是2016好像是12月份的事情,当时离职在陪老婆考试,我算是半给陪考和半个鼓励师。呵呵。。不知不觉时间到了2018年,我也来到了...

佛观一杯水
05/05
0
0
[docker]不通过SSH接入Docker

声明: 本博客欢迎转发,但请保留原作者信息! 博客地址:http://blog.csdn.net/halcyonbaby 内容系本人学习、研究和总结,如有雷同,实属荣幸! 翻译自:http://www.sebastien-han.fr/blog/...

halcyonbaby
2014/09/15
0
0
Memcache的key怎么管理 [

本人在游戏公司做后台开发,一些数据会暂存到memcache 但是在开发的时候遇到这样一个问题: 很多后台开发在他们自己写的扩展类里面,使用memcahce,会声明自己的key. 这样,对于我在写我的扩...

itbook
2013/11/04
731
2
小蚂蚁学memcache笔记(完结)

memcache安全讨论 memcache和session的比较 memcache主要目的用于提速,因此它是一种无状态的数据,即数据不会和任何用户绑定。 session数据是和用户绑定的,因此是一种有状态的数据。 memc...

嗜学如命的小蚂蚁
2015/09/13
105
0
php操作memcache的使用测试总结

1.简介 memcache模块是一个高效的守护进程,提供用于内存缓存的过程式程序和面向对象的方便的接口,特别是对于设计动态web程序时减少对数据库的访问。 memcache也提供用于通信对话(session...

tiger_lee
2014/02/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

conda 换源

https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/conda config --add channels https://mir......

阿豪boy
10分钟前
0
0
Confluence 6 安装补丁类文件

Atlassian 支持或者 Atlassian 缺陷修复小组可能针对有一些关键问题会提供补丁来解决这些问题,但是这些问题还没有放到下一个更新版本中。这些问题将会使用 Class 类文件同时在官方 Jira bug...

honeymose
20分钟前
0
0
设计模式:代理模式

代理模式可以分为三种:静态代理,动态代理,cglib代理 1.静态代理:被代理的类需要实现一接口或是继承一父类 委托类(被代理的类): package com.java.pattern.proxy.staticdemo;publ...

人觉非常君
22分钟前
0
0
非常实用的IDEA插件之总结

1、Alibaba Java Coding Guidelines 经过247天的持续研发,阿里巴巴于10月14日在杭州云栖大会上,正式发布众所期待的《阿里巴巴Java开发规约》扫描插件!该插件由阿里巴巴P3C项目组研发。P3C...

Gibbons
28分钟前
0
0
Tomcat介绍,安装jdk,安装tomcat,配置Tomcat监听80端口

Tomcat介绍 Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。 java程序写的网站用tomcat+jdk来运行...

TaoXu
28分钟前
0
0
TensorFlow,从一个 Android Demo 开始

TensorFlow Android Demo 项目地址 Machine Learning 既然提到了 TensorFlow,那是不是得神经网络、机器学习了解下? 如果你能坚持把 机器学习速成课程 给啃完了,觉得还挺有兴趣的,那可以考...

孟飞阳
30分钟前
0
0
JVM学习笔记二:内存结构规范

1、JVM基本结构图 2、java堆(Heap) 3、方法区(Method Area) 4、程序计数器 5、JAVA栈图解 局部变量表:八大基本类型,还可以存储引用类型 上一篇:JVM学习笔记一:类加载机制介绍...

刘祖鹏
36分钟前
0
0
mui集成微信H5支付(返回白屏问题已经解决)

一.项目需求 因为公司人员缺少,没有专门开发安卓和ios的人员,为了项目尽早上线采用了混合APP开发的方式,我选择了MUI混合开发框架,项目中需要在用户购买VIP会员的时候进行支付,所以需要在项目...

银装素裹
40分钟前
0
0
SpringBoot集成Redis--配置自定义的RedisCacheManager

配置自定义的RedisCacheManager--1自定义键生成规则 默认的键生成器 当不指定缓存的key时,SpringBoot会使用SimpleKeyGenerator生成key。 SimpleKeyGenerator SimpleKey 查看源码可以发现,它...

karma123
59分钟前
0
0
防火墙未来的发展趋势在哪里?

导读 防火墙(Firewall),也称防护墙,是由Check Point创立者Gil Shwed于1993年发明并引入国际互联网。当下互联网时代,无论是大小企业,大部分都会部署有防火墙的设备,但这些防火墙往往并不...

问题终结者
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部