第1章 memcached的基础

1.1 memcached是什么?

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

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

1.2 memcached的特征

  • 协议简单:使用简单的基于文本行的协议
  • 基于libevent的事件处理
  • 内置内存存储方式
  • memcached不互相通信的分布式:通过客户端实现分布式

1.3 安装memcached

  • memcached的安装:默认安装到 /usr/local/bin 下
  • memcached的启动:前台启动 /usr/local/bin/memcached -p 11211 -m 64m -vv;作为 daemon后台启动 /usr/local/bin/memcached -p 11211 -m 64m -d

1.4 用客户端连接

许多语言都实现了连接memcached的客户端,其中以Perl、PHP为主。

1.5 使用 Cache::Memcached

  • 使用 Cache::Memcached 连接 Memcached
  • 保存数据:向 memcached 保存数据的方法有 add,replace 和 set。向 memcached 保存数据时可以指定期限。不指定期限时,memcached 按照 LRU 算法保存数据。
  • 获取数据:可以使用 get 和 get_multi 方法。
  • 删除数据:使用 delete 方法。set 方法会忽视 delete 方法设置的阻塞时间,执行保存数据。
  • 增一和减一操作:应注意进行错误检查。

第2章 理解 memcached 的内存存储

2.1 Slab Allocation 机制:整理内存以便重复利用

Slab Allocation 的基本原理是按照预先分配的内存大小(Page),将其分割成特定的块(Chunk),并把尺寸相同的块分成组(Slab Class),以完全解决内存碎片问题。另外,slab allocation 还能重复使用已分配的内存。

2.2 在 slab 中缓存记录的原理

memcached 根据收到的数据的大小,选择最适合数据大小的 slab,并缓存到 chunk 中。

2.3 Slab Allocation 的缺点

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

2.4 使用Growth Factor 进行调优

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

2.5 查看 memcached 的内部状态

使用 memcached 的 stats 命令,可以查看 slabs 的利用率等各种信息。

2.6 查看 slabs 的使用状况

第3章 memcached 的删除机制和发展方向

3.1 memcached在数据删除方面有效利用资源

  • 数据不会从memcached真正消失
  • Lazy Expiration:memcached不会从内部监视记录是否过期,而是在get时查看记录的时间戳,检查是否过期。

3.2 LRU:从缓存中有效删除数据的原理

3.3 memcached的最新发展方向

  • 二进制协议:不需要文本协议的解析处理,提升memcached的性能和安全性。协议的包为24字节的帧,其后面是键和无结构数据。头部Header的长度为16字节,分为Request Header 和 Response Header。头部包含了表示包的有效性的Magic字节、命令种类、键长度、值长度等信息。
  • 外部引擎的加载功能

3.4 外部引擎支持

  • 外部引擎支持的必要性:外部引擎的加载机制能封装memcached的网络功能、事件处理等复杂操作。
  • 简单API设计成功的关键
  • 重新审视现在的体系:将内存存储的代码从核心服务器中独立出来,才能灵活地支持外部引擎。

第4章 memcached的分布式算法

4.1 memcached的分布式

memcached的分布式,是完全由客户端程序库实现的。

memcached的分布式是什么意思?

向memcached添加数据时,客户端的算法会根据键来选择要保存数据的memcached服务器;从memcached获取数据时,客户端会通过与数据保存时相同的算法,根据键来选择memcached服务器。

4.2 Cache::Memcached的分布式方法

根据余数计算分散

首先求得键的整数哈希值,再除以服务器台数,根据其余数来选择服务器。

当选择的服务器无法连接时,Cache::Memcached会将连接次数添加到键之后,再次计算哈希值并尝试连接。

根据余数计算分散的缺点

  • 影响缓存的命中率,给数据库服务器带来极大的负载

4.3 Consistent Hashing

Consistent Hashing的简单说明

首先求出memcached服务器(节点)的哈希值,并将其配置到0~2^32的圆上,再用同样的方法求出存储数据的键的哈希值,并映射到圆上。然后从键映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器上。如果超过2^32仍然找不到服务器,就会保存到第一台memcached服务器上。

在添加一台memcached服务器之后,只有在圆上增加服务器的地点和逆时针方向第一台服务器之间的键会受到影响。

如果使用虚拟节点的思想,为每个物理节点在圆上分配100~200个点,就能抑制服务器的分布不均匀,最大限度地减小服务器增减时的缓存重新分布。

支持Consistent Hashing的函数库

PHP客户端:libketama

Perl客户端:Cache::Memcached::Fast和Cache::Memcached::libmemcached

第5章 memcached的应用和兼容程序

5.1 mixi案例研究

随着网站访问量的急剧增加,单纯为数据库添加slave已经无法满足需要,因此引入了memcached。

服务器配置和数量

将数据库服务器、应用服务器等换成性能更强大、内存更多的服务器,这样可以抑制服务器数量的剧增,降低管理成本,还可以将换下来的服务器用作memcached服务器。

memcached进程

每台memcached服务器仅启动一个memcached进程。memcached进程的实际内存分配量要比指定的容量大。

memcached使用方法和客户端

现在mixi的服务将200台左右的memcached服务器作为一个pool使用。每台服务器的容量为3GB,那么就有了将近600GB的巨大内存数据库。

通过Cache::memcached::Fast维持连接

公共数据的处理和rehash

Cache::memcached::Fast会在连接服务器失败时,短时间内不再连接该服务器。
mixi还为公共数据的键名设置命名规则,符合命名规则的键名的数据会保存到多台服务器中,取数据时仅从其中一台服务器选取即可。

5.2 memcached应用经验

通过daemontools启动

daemontools可以监视memcached进程,在memcached进程死掉后自动启动它。

监视

memcached的性能

5.3 兼容应用程序

  • repcached
  • Flared
  • memcachedb
  • Tokyo Tyrant

《memcached全面剖析》的更多相关文章

  1. 简单物联网:外网访问内网路由器下树莓派Flask服务器

    最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...

  2. 利用ssh反向代理以及autossh实现从外网连接内网服务器

    前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...

  3. 外网访问内网Docker容器

    外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...

  4. 外网访问内网SpringBoot

    外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...

  5. 外网访问内网Elasticsearch WEB

    外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...

  6. 怎样从外网访问内网Rails

    外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...

  7. 怎样从外网访问内网Memcached数据库

    外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...

  8. 怎样从外网访问内网CouchDB数据库

    外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...

  9. 怎样从外网访问内网DB2数据库

    外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...

  10. 怎样从外网访问内网OpenLDAP数据库

    外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...

随机推荐

  1. hdu5081

    题意有点绕,不过读懂了之后并不难 以Si结尾容易想到ac自动机,建好ac自动机并将fail指针反向即可得到一棵树 那么操作1就是将若干个子树的并中的节点全部权值+1 操作2就是将求若干个节点到根的路径 ...

  2. HDU 1181.变形课-并查集

    变形课 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)Total Submis ...

  3. Verilog的IDE Quartus II

    Quartus II  主要用于Verilog的开发,他是开发FPGA的利器,但他需要和modelsim相互配合,才能实现它的编写和仿真.modelsim是第三方的EDA,需要另外安装,对于Quart ...

  4. mysql主从复制、读写分离

    一.MySql介绍 MySQL作为世界上使用最为广泛的数据库之一,免费是其原因之一.但不可忽略的是它本身的功能的确很强大.随着技术的发展,在实际的生产环境中,由单台MySQL数据库服务器不能满足实际的 ...

  5. python基础之二

    1. 数据类型 1.1 数字 数字的作用:与数字相关,例如:手机号.QQ号.身份证号等,用数字表示 数字分为:整数(int).浮点数(float).复数(了解) 例子: age = 10 print( ...

  6. cookie的secure、httponly属性设置

    cookie的secure.httponly属性设置 转载自:http://www.cnblogs.com/alanzyy/archive/2011/10/14/2212484.html 一.属性说明 ...

  7. 搭建SSH框架–使用篇

    创建如下包: action用于响应请求 service则是提供请求的操作 dao用于操作数据库 entity用于映射数据库表 打开DB Browser –> personalCD(创建篇的数据库 ...

  8. Java下List<Long>转List<String>或者List<Long>转List<Integer>

    说明:很遗憾,没有快速方法,只能遍历然后循环增加进去. 方法: for(String str : list) { int i = Integer.paseInt(str); intList.add(i ...

  9. VUE -- vue.js中$watch的用法示例

    Vue.js 提供了一个方法 watch,它用于观察Vue实例上的数据变动.对应一个对象,键是观察表达式,值是对应回调.值也可以是方法名,或者是对象,包含选项. 在实例化时为每个键调用 $watch( ...

  10. HashMap深度解析(一)

    HashMap可以说是Java中最常用的集合类框架之一,是Java语言中非常典型的数据结构,我们总会在不经意间用到它,很大程度上方便了我们日常 开发.在很多Java的笔试题中也会被问到,最常见的,“H ...