memcached代码分析详解

合集下载

有关memcached企业面试案例讲解

有关memcached企业面试案例讲解

有关memcached企业⾯试案例讲解有关memcached企业⾯试案例讲解1、Memcached是什么,有什么作⽤?a. memcached是⼀个开源的、⾼性能的内存的缓存软件,从名称上看Mem就是内存的意思,⽽Cache就是缓存的意思。

b. 作⽤:memcached通过在事先规划好的内存空间中,临时缓存数据库中的各类数据,以达到减少业务对数据库的直接⾼并发访问,从⽽达到提升数据库的访问性能,加速⽹站集群动态应⽤服务的能⼒。

2、Memcached服务在企业集群架构中应⽤场景(1). 作为数据库的前端缓存应⽤a. 完整缓存(易),静态缓存例如:商品分类,以及商品信息,可事先放在内存⾥,然后再对外提供数据访问,这个被称之为预热。

⽤户访问时可以只读取memcached缓存,不读取数据库了。

b. 热点缓存(难)需要前端程序配合。

只缓存热点的数据,即缓存经常被访问的数据。

先预热基础数据,然后在再动态更新。

先读取缓存,如果缓存⾥没有对应的数据,再去读取数据库,然后把读到的数据放⼊缓存。

特殊说明:1. 如果碰到电商秒杀等⾼并发的业务,⼀定要事先预热,或者其他思想实现,例如:秒杀只是获取资格,⽽不瞬间秒杀到⼿商品。

2. 如果数据更新,同时触发缓存更新,防⽌给⽤户过期数据。

c. 对于持久化缓存存储系统,例如:redis,可以替代⼀部分数据库的存储。

⼀些简单的数据业务,投票,统计,好友关注,商品分类等。

(2). 作为集群的session会话共享存储。

/2561410/1331316/2561410/13234683、Memcached服务在不同企业业务应⽤场景中的⼯作流程a. 当web程序需要访问后端数据库获取数据时会优先访问memcached内存缓存,如果缓存中有数据就直接获取返回前端服务及⽤户,如果没有数据(没有命中),再由程序请求后端的数据库服务器,获取到对应的数据后,除了返回给前端服务及⽤户数据外,还会把数据放到Memcached内存中进⾏缓存,等待下次请求被访问,Memcached内存始终是数据库的挡箭牌,从⽽⼤⼤的减轻数据库的访问压⼒,提⾼整个⽹站架构的响应速度,提升了⽤户体验。

Memcached知识大讲解

Memcached知识大讲解

Memcached知识大讲解memcached是什么?web应用数据保存在RDBMS中(绝大多数是mysql).从数据库读取数据,随着访问量增大,出现数据库负担很重,反应很慢的问题。

memcached就是解决此问题而生。

他将数据缓存到内存中,提高读写数据的能力。

memcached有何特点?两点:第一,分布式;第二, 缓存。

如何理解分布式memcached是分布式内存缓存服务器,但服务器端是不互相通信的。

简而言之,他的分布式取决于客户端的实现。

那么,如何解决如下问题,有三台memcached 服务器,如何将key=>value类型的数据存放到memcached中?方法有两种:余数计算法和圆点计数法(官方名称,一致性算法).先看余数计算法.先将memcached服务器标号1,2,3.计算key的hash值。

然后初以服务器数量3,得到的余数(如2),则将数据放到2上。

此法优点方法简单,易于分散数据。

但问题是,如果增加了一台memcached服务器,key的hash值除以的余数就变了,势必要重组整个缓存数据,代价不小。

所以,看下圆点解决之道。

圆点法是基于Consistent Hashing的思想。

简单的说,先得出memcached服务器的哈希值,配置到一个0-2的32次方的圆上。

然后同样计算出key的哈希值,映射到相同的圆上。

从映射的位置开始顺时针查找,将数据保存到找到的第一个服务器上。

这样在增加新的memcached服务器的时候,可以最大限度的减少键的重组。

php中Consistent Hashing的实现memcache客户端的实现:1 在php.ini中添加memcache.hash_strategy = consistentmemcached客户端的实现:1 $mc = new Memcached();$mc->setOption(Memcached::OPT_DISTRIBUTION,Memcached::DISTRIBUTION _CONSISTENT);3 $mc->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE, true);php客户端memcached vs memcache怎样区别,也没彻底明白。

memcached协议解析

memcached协议解析

memcached协议解析协议memcached 的客户端使⽤TCP链接与服务器通讯。

(UDP接⼝也同样有效,参考后⽂的 “UDP协议” )⼀个运⾏中的memcached服务器监视⼀些(可设置)端⼝。

客户端连接这些端⼝,发送命令到服务器,读取回应,最后关闭连接。

结束会话不需要发送任何命令。

当不再需memcached服务时,要客户端可以在任何时候关闭连接。

需要注意的是,⿎励客户端缓存这些连接,⽽不是每次需要存取数据时都重新打开连接。

这是因为memcached 被特意设计成及时开启很多连接也能够⾼效的⼯作(数百个,上千个如果需要的话)。

缓存这些连接,可以消除建⽴连接所带来的开销(/*/相对⽽⾔,在服务器端建⽴⼀个新连接的准备⼯作所带来的开销,可以忽略不计。

)。

在memcache协议中发送的数据分两种:⽂本⾏和⾃由数据。

⽂本⾏被⽤于来⾃客户端的命令和服务器的回应。

⾃由数据⽤于客户端从服务器端存取数据时。

同样服务器会以字节流的⽅式传回⾃由数据。

/*/服务器不⽤关⼼⾃由数据的字节顺序。

⾃由数据的特征没有任何限制;但是通过前⽂提到的⽂本⾏,这项数据的接受者(服务器或客户端),便能够精确地获知所发送的数据库的长度。

⽂本⾏固定以“\r\n”(回车符紧跟⼀个换⾏符)结束。

⾃由数据也是同样会以“\r\n”结束,但是 \r(回车符)、\n(换⾏符),以及任何其他8位字符,均可出现在数据中。

因此,当客户端从服务器取回数据时,必须使⽤数据区块的长度来确定数据区块的结束位置,⽽不要依据数据区块末尾的“\r\n”,即使它们固定存在于此。

键值存储在memcached中的数据通过键值来标识。

键值是⼀个⽂本字符串,对于需要存取这项数据的客户端⽽⾔,它必须是唯⼀的。

键值当前的长度限制设定为250字符(当然,客户端通常不会⽤到这么长的键);键值中不能使⽤制表符和其他空⽩字符(例如空格,换⾏等)。

命令所有命令分为3种类型:存储命令(有3项:’set’、’add’、’repalce’)指⽰服务器储存⼀些由键值标识的数据。

编程代码分析

编程代码分析

编程代码分析代码是计算机程序员用来实现特定功能的指令集合。

在编程开发中,对代码进行分析有助于了解代码的结构、逻辑和性能,从而优化代码的质量和效率。

本文将探讨编程代码分析的重要性以及常用的代码分析方法。

一、代码分析的重要性代码分析在软件开发过程中起着至关重要的作用。

它可以帮助开发人员找出代码中的潜在问题并进行修复,提高代码的可靠性和稳定性。

以下是代码分析的几个重要方面:1. 发现潜在错误:通过对代码进行分析,可以发现潜在的逻辑错误、语法错误、内存泄漏等问题,有助于提前修复这些问题,减少程序在运行时的异常情况。

2. 提高代码质量:代码分析可以检查代码的可读性、可维护性和可扩展性,帮助开发人员优化代码结构和命名规范,提升代码的整体质量。

3. 改进代码性能:通过对代码的分析,可以找出性能瓶颈所在,优化算法和数据结构,提高代码的执行效率和响应速度。

4. 规范团队开发:代码分析可以帮助团队建立一致的编码规范和标准,提高团队开发的协同效率和代码的可读性。

二、代码分析的方法1. 静态代码分析:静态代码分析是指在不执行代码的情况下对代码进行分析。

它通过检查代码的结构和语法规则,发现潜在的问题和错误。

常见的静态代码分析工具有Lint、Pylint、FindBugs等。

2. 动态代码分析:动态代码分析是指在代码执行过程中对代码进行分析。

它通过监视代码的执行轨迹和运行时信息,找出潜在的问题和性能瓶颈。

常见的动态代码分析工具有Profiling工具、Coverage工具等。

3. 代码复杂度分析:代码复杂度是指代码的结构和逻辑的复杂程度。

通过对代码复杂度进行分析,可以评估代码的可读性和可维护性。

常用的代码复杂度分析工具有Cyclomatic Complexity、McCabe Complexity等。

4. 代码质量度量:代码质量度量是根据一系列的规则和标准评估代码的质量。

通过对代码质量进行度量,可以找出代码中存在的问题和改进的空间。

Memcached 缓存技术介绍

Memcached 缓存技术介绍

优化
调试块大小 使用 Growth Factor进行调试: 启动时指定 Growth Factor(通过 -f选项),可以适当控制 slab差异,默认值为1.25。

以 verbose模式启动 Memcached: 默认 Growth Factor输出(f=1.25): # memcached -m 1024 -c 40960 -u root -p 11219 -P /var/run/m11219.pid -vv slab class 1: chunk size 96 perslab 10922 slab class 2: chunk size 120 perslab 8738 slab class 3: chunk size 152 perslab 6898 slab class 4: chunk size 192 perslab 5461 …… 设置 Growth Factor为 2倍(f=2): # memcached -m 1024 -c 40960 -u root -p 11219 -P /var/run/m11219.pid -f2 -vv slab class 1: chunk size 96 perslab 10922 slab class 2: chunk size 192 perslab 5461 slab class 3: chunk size 384 perslab 2730 slab class 4: chunk size 768 perslab 1365 …… 输出可见,从192字节的组开始,组大小依次增大为原来的 2倍。 这样设置后,slab之间的差别比较大,有些情况下会浪费内存。 通过重新计算数据的预期平均长度,调整 growth factor,以获得最恰当的内存使用。
命中率

simple-spring-memcached统一缓存的使用实例

simple-spring-memcached统一缓存的使用实例

simple-spring-memcached统一缓存的使用实例如何在一个中型的Java应用中使用Memcached缓存数据不是个简单的问题。

当某个缓存数据需要在多个系统间共享和失效时,必须要有统一的规划才能保证不出错。

经过各种实践,目前系统在使用Memcached缓存数据全部采用Simple-Spring-Memcached框架来完成,并统一规划各系统Spring和Cache key的配置。

下面对在使用过程中需要注意的点做一个详细说明:Cache整体规划目前我们系统中有两个不同的Memcached服务器:1session memcached服务器:主要存储用户的session2app memcached服务器: 主要用于缓存应用数据由于应用所有的缓存数据都放在app缓存上,为避免各应用的缓存数据出现冲突,必须规划好它们的命名空间。

所幸Simple-Spring-Memcached支持namespace的概念,因此对各应用的namespace前缀规定如下:应用namespace前缀goodscenter goodscentertrade tradeuic uic这个namespace在生成key时,将放在最前面,稍后会有例子详述。

同一个应用中存在许多需要缓存的对象,因此约定namespace前缀之后再加上缓存对象的类名。

例子如下:应用缓存对象完整的namespace 最终生成的keytrade TcRate (id为42) trade:TcRate trade:TcRate:12goodscenter GoodsDo(id为42) goodscenter:GoodsDo goodscenter:GoodsDo:12key的生成规则Simple-Spring-Memcached提供的针对单个对象的注解接口提供了两种key生成方式,详情见此文3AssignCache类注解通过assignKey指定cache的key4SingleCache类注解通过ParameterValueKeyProvider注解指定生成key的方法对于第一种只要求必须保证key不与其它的冲突,且namesapce符合规则。

memcached技术-韩顺平

memcached技术-韩顺平

memcached技术第 1 章MEMCACHED是什么 (1)1.1MEMCACHED的历史1 1.2MEMCACHED的运行原理1 1.3MEMCACHED的安装11.3.1windows下的安装步骤 (2)1.3.2Liunx下安装memcached步骤 (3)第 2 章对MEMCACHED进行操作(CRUD) (5)2.1通过TELNET操作MEM5 2.2 7 2.3通过PHP程序对MEMCACHED进行操作(通过DLL扩展) 7 2.4如何实现WINDOWS 操作LINUX下的MEM12 2.5MEMCACHED最佳实践12 2.6使用源码对MEMCACHED操作13第 3 章MEMCACHED的机制了解 (14)3.1MEMCACHED是基于C/S的架构,协议是文本协议14 3.2MEMCACHED是使用LIBEVENT处理并发14 3.3MEMCACHED是内存存储数据,当MEM重启,或者操作系统重新,数据消失,当数据满后,再放入数据,则使用LRU算法(最近最少使用),对数据置换. 14 3.4MEMCACHED是基于客户端分布式的系统15第 4 章MEMCACHED的细节说明 (17)4.1MEMCACHED的数据生命周期17 4.2S ESSION数据放入到M EMCACHED17 4.3MEMCACHED的安全性讨论18 4.4什么数据放入到MEMCACHED提示19第 1 章memcached是什么概述: memcached就是一个高性能的支持分布式的内存存储系统(软件)。

你可以把它看成一个巨大的hash表: 结构key(键) value(值)字符串(唯一) 整数,浮点数,字符串,布尔,数组,对象,null,二进制数据(视频,音频,图片)1.1memcached的历史国外livejoural 网站,开发memcached软件.=>很多大型网站都开始使用。

memcached 是各种开发程序使用比如php,,jsp网站Memcached是一个高性能的分布式的内存对象缓存系统,目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。

php的Memcache方法介绍及应用实例

php的Memcache方法介绍及应用实例

使用Memcache在PHP中调试方法的介绍及应用如果我们在网络开发中,特别是大访问量的web项目开发中,为了提高响应速度,减少数据查询运算,那么我们都会选用memcahce。

首先我们必须要安装,接下来如何使用memcache,在这里介绍下在linux下安装和windows下安装如下及配置:一、linux下的Memcache安装:1.下载memcache的linux版本,注意memcached 用libevent 来作事件驱动,所以要先安装有libevent。

2. 安装pecl::memcache。

用pecl 命令行工具安装:pecl install memcache或直接从源码安装:phpize./configuremakemake install二、Windows下的Memcache安装:1. 下载memcache的windows稳定版,解压放某个盘下面,比如在c:\memcached2. 在终端(也即cmd命令界面)下输入‘c:\memcached\memcached.exe -d install’安装3. 再输入:‘c:\memcached\memcached.exe -d start’启动。

NOTE: 以后memcached将作为windows的一个服务每次开机时自动启动。

这样服务器端已经安装完毕了。

4.下载/ext.php/php_memcache.dll,请自己查找对应的php版本的文件5. 在C:\winnt\php.ini 加入一行‘extension=php_memcache.dll’6.重新启动Apache,然后查看一下phpinfo,如果有memcache,那么就说明安装成功!三、memcached的基本设置:-p 监听的端口-l 连接的IP地址, 默认是本机-d start 启动memcached服务-d restart 重起memcached服务-d stop|shutdown 关闭正在运行的memcached服务-d install 安装memcached服务-d uninstall 卸载memcached服务-u 以的身份运行(仅在以root运行的时候有效)-m 最大内存使用,单位MB。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

memcached分析详解目录1.文档目的 (1)1.1.前言 (1)2.memcached是什么 (2)2.1. memcached的特征 (2)3.memcached适合的场合 (4)4.memcached的代码分析 (5)4.1. main流程 (5)4.2. memcached服务流程(TCP) (6)4.3. memcached状态转换和通信协议处理 (7)4.4. memcached核心数据结构 (7)4.5. Slab Allocation机制:整理内存以便重复使用 (8)5.memcached的使用优化 (10)5.1. 命中率 (10)5.2. 空间利用率 (11)5.3. 加速比 (12)5.4. 安全性能 (12)6.memcached的测试分析 (13)6.1. 读写memcache指令测试 (13)6.2. 服务端系统负载 (13)6.3. 空间分配,命中率 (14)7.memcached的中间层客户端编写 (16)8.libevent简介 (17)9.memcached应用 (18)10.结束语 (20)1. 文档目的1.1. 前言文档就是简单的把memcached做一个代码走读和分析,起到一个抛砖引玉的作用;目的就是让大家在使用memcached这个工具时,多一些对工具的了解,从而确定你的程序是否真的需要用memcached来实现不可;短短2个小时也讲不了多少,主要是做一个学习探讨,如果大家感兴趣的话后期可以再做培训牛人真多啊,向先行者致敬!2. memcached是什么memcached广泛应用在大负载高并发的网站上,是一种非常成熟的产品(称为一项技术也未尝不可)。

像facebook,youtube,yahoo,sina,sohu,netease,豆瓣等网站均或多或少使用了该项产品。

memcached在以用户为中心的网站上,表现尤其突出,例如sns,blog等web2.0应用的站点。

这些站点一般来讲,特别注重用户体验,用户对服务器的响应速度要求很高,用户数据相对比较复杂、关连度比较高,需要经常对数据库进行更新和检索。

许多Web应用都将数据保存到RDBMS中,应用服务器从中读取数据并在浏览器中显示。

但随着数据量的增大、访问的集中,就会出现RDBMS的负担加重、数据库响应恶化、网站显示延迟等重大影响。

这时就该memcached大显身手了。

memcached是高性能的分布式内存缓存服务器。

一般使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。

2.1. memcached的特征1)memcached的服务器客户端通信并不使用复杂的XML等格式,而使用简单的基于文本行的协议。

因此,通过telnet 也能在memcached上保存数据、取得数据。

下面是例子。

$ telnet localhost 8119Trying 127.0.0.1...Connected to localhost.localdomain (127.0.0.1).Escape character is '^]'.set foo 0 0 3 (保存命令)bar (数据)STORED (结果)get foo (取得命令)V ALUE foo 0 3 (数据)bar (数据)协议可以参考:2)为了提高性能,memcached中保存的数据都存储在memcached内置的内存存储空间中。

由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失。

另外,内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。

memcached本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题。

3)memcached尽管是“分布式”缓存服务器,但服务器端并没有分布式功能。

各个memcached不会互相通信以共享信息。

那么,怎样进行分布式呢?这完全取决于客户端的实现。

3. memcached适合的场合memcached是“分布式”的内存对象缓存系统,那么就是说,那些不需要“分布”的,不需要共享的,或者干脆规模小到只有一台服务器的应用,memcached不会带来任何好处,相反还会拖慢系统效率,因为网络连接同样需要资源,即使是UNIX/Windows本地连接也一样。

测试数据显示,memcached本地读写速度要比直接.NET内存数组慢几十倍,而APC、共享内存方式都和直接数组差不多。

可见,如果只是本地级缓存,使用memcached是非常不划算的。

Memcached在很多时候都是作为数据库前端cache使用的。

因为它比数据库少了很多SQL解析、磁盘操作等开销,而且它是使用内存来管理数据的,所以它可以提供比直接读取数据库更好的性能,在大型系统中,访问同样的数据是很频繁的,memcached可以大大降低数据库压力,使系统执行效率提升。

另外,memcached 也经常作为服务器之间数据共享的存储媒介,例如在SSO系统中保存系统单点登陆状态的数据就可以保存在memcached中,被多个应用共享。

需要注意的是,memcached使用内存管理数据,所以它是易失的,当服务器重启,或者memcached进程中止,数据便会丢失,所以 memcached不能用来持久保存数据。

很多人的错误理解,memcached的性能非常好,好到了内存和硬盘的对比程度,其实memcached使用内存并不会得到成百上千的读写速度提高,它的实际瓶颈在于网络连接,它和使用磁盘的数据库系统相比,好处在于它本身非常“轻”,因为没有过多的开销和直接的读写方式,它可以轻松应付非常大的数据交换量,所以经常会出现两条千兆网络带宽都满负荷了,memcached进程本身并不占用多少CPU资源的情况。

4. memcached的代码分析4.1. main流程4.2. memcached服务流程(TCP)4.3. memcached状态转换和通信协议处理需要说明的是,这里需要排除所有出错处理.很显然,不管是哪种操作下,一旦出错,信息需要通过conn_write状态往client写入出错信息的,那么在string_out时,必定转入conn_write状态.而且,很多细节也没有在流程图中给出,如统计信息的处理,超时后get操作时删除等等.对于在memcache协议中定义的其他操作,如stats,version,quit,flush_all,own,disown等等由于使用很少,在流程中没有详细给出,可以查看源代码.4.4. memcached核心数据结构1. item结构item是存储在memcache的key-value对的抽象.由于组织item存放是按照LRU算法组织的.那么在其中有几个成员在修改源代码时必须注意,time是最近访问时间.exptime是item消亡时间.item是一个双向列表.同时还挂在一个Hash table上.2. conn结构conn结构是联系上下文的关键对象.对于每个连接的到来,都有一个conn结构与其对应,并且对应到某个连接状态,进入状态转换而完成操作.conn在程序开始也进行了一次预分配,分配200个连接空间.当200个使用完之后便是按需分配,到达一个分配一个.conn和item,iovec(内核级别缓冲结构)关联.3. slabclass_t结构slabclass_t保存了分级大小的空间槽,以分别适用于不同大小的item存放.取决于两个命令行参数,-f和-n.在应用 slabclass_t时,定义的是一个数组,该数组长度取决于增长的指数级别和初始值大小(32+chunk_size),每个空间槽是不允许大于1M 的,也就是1048576.4. settings结构系统获取的命令行参数保存的地方.5. stats结构:统计信息保存地方,可以考虑对其进行操作以适应不同的统计信息处理,如获取某个时间段的get 命中率等等操作.4.5. Slab Allocation机制:整理内存以便重复使用1)memcached默认情况下采用了名为Slab Allocator的机制分配、管理内存。

在该机制出现以前,内存的分配是通过对所有记录简单地进行malloc和free来进行的。

但是,这种方式会导致内存碎片,加重操作系统内存管理器的负担,最坏的情况下,会导致操作系统比memcached进程本身还慢。

Slab Allocation的原理相当简单。

将分配的内存分割成各种尺寸的块(chunk),并把尺寸相同的块分成组(chunk的集合)(图1)。

2)memcached根据收到的数据的大小,选择最适合数据大小的slab(图2)。

memcached中保存着slab内空闲chunk的列表,根据该列表选择chunk,然后将数据缓存于其中。

3)Slab Allocator解决了当初的内存碎片问题,但新的机制也给memcached带来了新的问题。

这个问题就是,由于分配的是特定长度的内存,因此无法有效利用分配的内存。

例如,将100字节的数据缓存到128字节的chunk中,剩余的28字节就浪费了(图3)。

4)memcached在启动时指定Growth Factor因子(通过-f选项),就可以在某种程度上控制slab之间的差异。

默认值为1.25。

但是,在该选项出现之前,这个因子曾经固定为2,称为“powers of 2”策略。

将memcached引入产品,或是直接使用默认值进行部署时,最好是重新计算一下数据的预期平均长度,调整growth factor,以获得最恰当的设置。

内存是珍贵的资源,浪费就太可惜了。

5. memcached的使用优化在优化memcache的工作之前,需要了解memcache体系的工作流程.一个分布式的memcache的运作是需要三个部分的,多台提供 memcache服务的servers(简称S),一个进行分布式映射的中间层lib(其实这个也可以当作客户端的一部分,简称L),和进行 memcache请求的客户端(简称C).在memcache工作时,有以下四个步骤:1. C通过带有特性化的Key值的命令串,向L请求memcache服务,L将命令串进行分解,并通过对key的某种Hash算法决定S的地址2. L将分解的(Comm Key-Value)或者(Comm Key)向相关的S请求memcache服务.3. 相关的S根据memcache协议向L返回服务结果.4. L将结果进行聚集包装后返回给C一个人性化的响应.从上面的分析可以看出,分布式的memcache服务是需要很大的网络开销的.对于一般的应用而言,是否都要进行memcache的优化,甚至是否需要用到memcache,都需要进行权衡分析.如果只是本地小规模的应用,在数据库可承受的范围内,是宁愿采用数据库+文件缓存的方式.1.1版本的 memcache走TCP模式在本地应用的处理速度甚至比不上Mysql数据的Unix域套接口的处理速度的一半,当然会更加比不上在程序内部直接操作内存了.虽然1.2版本的memcache已经提供了-s参数指定Unix域套口和-u指定udp模式.而且如果不需要用到分布式的话,不推荐使用 memcache,除非你的内存足够大到浪费的程度.优化可以从以下几个方面进行:5.1. 命中率对于缓存服务而言,命中率是至关重要的.命中率的提升可以通过多种方案实现.其一,提高服务获取的内存总量.这无疑是增加命中的最直接的办法,将缓存数据完全放入数据池中.只要连接不失效,就一定命中.其二,提高空间利用率,这实际上也是另一种方式的增加内存总量.具体实现在下一个方面给出.其三,对于一些很特别的memcache应用,可以采用多个memcache服务进行侦听,分开处理,针对服务提供的频繁度划分服务内存,相当于在应用一级别上再来一次LRU.其四,对于整体命中率,可以采取有效的冗余策略,减少分布式服务时某个server发生服务抖动的情况.如,14台机器实现分布式memcache,划分两组服务,其中一组13台做一个分布式的memcache,一组1台做整个的memcache备份.对于update操作,需要进行两边,get操作只需要一遍,一旦访问失效,则访问备份服务器.这样,对于备份服务器需要内存比较大,而且只适应于读操作大于写操作的应用中.这可以认为是RAID3,当然,也可以采用RAID1完全镜像.5.2. 空间利用率对于使用memcache做定长数据缓存服务而言,是可以在空间利用率上进行优化.甚至最简单的办法可以不用更改memcache的源码遍可以完成由 -f和-n参数的配合可以做到定长优化,不过极可能需要浪费掉预分配的199M内存空间.当然前提是memcache的版本是1.2,同时如果使用的是 1.2.0和1.2.1的话,需要更改掉一个BUG,那就是getopt时将opt串中最后一个”s”改成”n”,希望memcache能在以后的版本发现这个BUG.例如,如果key是一个定长id(如一个8位的流水号00000001),value是一个定长的串(如16位的任意字符串),对应于一个 chunk_size可以这么计算:chunk_size = sizeof(item) + nkey + *nsuffix + nbytes = 32 + 9 + (flag的数位长度 )2+ (16)的数位长度) 2+(两换行的长度)4 + 17 = 40 + 10 + 16 = 66,那么可以通过 -f 1.000001 -n `expr 66 - 32`,即 -f 1.000001 -n 34 来启动memcache.这种情况下,会浪费掉memcache预先分配的200M空间中的199M.从第2个预分配等级到第200个预分配等级将不会用到.然而,存在解决办法,那就是在编译memcache是加入编译参数-DDONT_PREALLOC_SLABS,或者在源代码中加入#define DONT_PREALLOC_SLABS即可,只是会去除memcache的预分配内存机制.如果需要memcache的预分配内存机制,那么需要对其源代码进行修改.修改如下:引用1. 在slabs.c中,将函数slabs_clsid改成:unsigned int slabs_clsid(size_t size){ unsigned int res = POWER_SMALLEST;if(size==0)return 0;res = (size)%power_largest;return res;}2. 在item.c中,将函数 item_make_header改为:int item_make_header(char *key, uint8_t nkey, int flags, int nbytes,char *suffix, int *nsuffix){*nsuffix = sprintf(suffix, " %u %u\r\n", flags, nbytes - 2);return sizeof(item)+ nkey + *nsuffix + nbytes + hash(key,nkey,0);}3. 在item.c中,将函数 item_free改为:void item_free(item *it){ unsigned int ntotal = it->slabs_clsid;assert((it->it_flags & ITEM_LINKED) == 0);assert(it != heads[it->slabs_clsid]);assert(it != tails[it->slabs_clsid]);assert(it->refcount == 0);it->slabs_clsid = 0;it->it_flags |= ITEM_SLABBED;slabs_free(it, ntotal);}做一个轮流存储的机制使用预分配的内存,这样的好处是其他地方不需要做任何修改就可以了,当然你可以在源代码中加入上面的代码,并将它们放在一个自定义的宏后面.5.3. 加速比加速比,也即事件的处理效率.是否可以修改libevent的事件处理效率,需要研究.如果内存空间很大,可以将freeconn的数值调大,增加预分配的conn内存大小.5.4. 安全性能memcache还存在一个比较显著的问题,那就是其安全性能.只要了解memcache监听的端口,对于能够使用分布式memcache进行数据通信的网络环境的机器,都可以通过memcache协议于memcache服务器进行通信,获取或种植数据.不能保证种植进内存里的数据不会被别有用心的人再利用.也不能保证服务器的内存不被漫天遍地的垃圾数据所堆积,造成命中极低.memcache的设计理念在一个轻字,如果对每次Client的通讯需要校验身份,那么恐怕memcache也就达不到其想要的效果了.存在解决办法缓解这个问题,一般而言,需要使用memcache服务的机器,可以在Server维持一张红色列表.这张表上的机器便可以获取服务.很显然,memcache并非任意Client都能访问,只有信任的机器访问,那么为什么不将这些信任的机器放在一个/etc/mem_passwd下呢.还有,memcached走udp时,很大几率接受到upd时,都会使服务死掉,特别是set,add,replace时,这个问题需要去考究一下.不过没有时间了.6. memcached的测试分析服务器端memcache在命令行运行的参数:memcached –d –m 512 –l *.*.*.* -u ** -f 1.00001 –n 16 –c 10000 –vv6.1. 读写memcache指令测试6.2. 服务端系统负载通过自己编写的服务器端,对单结点的memcache进行了连接压力测试.其中测试用例的编写是这样的:启用七个客户端,每个客户端串行运行1000个进程,每个进程开3000线程,每个线程执行10次memcache的读操作或者写操作(操作相同).客户端并发连接.1. 客户端(7)的环境:Intel(R) Xeon(R) CPU 5120 @ 1.86GHz,4G memory.2. 服务器端(1)的环境:Intel(R) Xeon(R) CPU 5120 @ 1.86GHz,4G memory.3. 网络环境:100M网卡,Cisco交换机.很显然,memcache的运行在系统cpu的消耗上占十分少的比重,即便是很恐怖的并发连接也不会给系统带来多大的负载,因为其磁盘IO free(所有操作都在内存中)和相应的内存分配机制决定其占用cpu的极少,而相反,在网络IO上却花费很大的时间.6.3. 空间分配,命中率由于本地测试的get数据非常固定,因此命中率基本为100%.在10.68.1.31上运行了一个有前端应用的memcachce服务器,运行时间已经有364个多小时了.因此通过10.68.1.31上的数据说明(版本为1.1.13).通过memcache的统计协议可以清楚的看到其命中率高达95.9%7. memcached的中间层客户端编写省略8. libevent简介libevent是一个事件触发的网络库,适用于windows,linux,bsd等多种平台,内部使用iopc/epoll/kqueue 等系统调用管理事件机制,而且根据libevent官方网站上公布的数据统计,似乎也有着非凡的性能.从代码中看,libevent支持用户使用三种类型的事件,分别是网络IO,定时器,信号三种,在定时器的实现上使用了红黑树(RB tree)的数据结构,以达到高效查找,排序,删除定时器的目的,网络IO 上,libevent的epoll居然用的EPOLLLT水平触发的方式,不容易出错,但是在效率上可能比EPOLLET要低一些.跟网络无关的,libevent也有一些缓冲区管理的函数,libevent没有提供缓存的函数.而且libevent 的接口形式非常值得参考.9. memcached应用原文:Scaling memcached at Facebook作者:Paul Saab翻译:ShiningRay如果你翻阅过一些关于大型网站扩展(Scaling)的资料,那么你可能听说过一个叫memcached的东西。

相关文档
最新文档