天天看点

Memcached源码分析之一

Memcached介绍

      Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。

Memcached特点

协议简单

基于libevent的事件处理

内置内存存储方式

 memcached不互相通信的分布式

Memcached命令

基本命令

memcached主要分为三种类型的命令:

类型 概念 具体命令 格式
storage commands 

通过key在server端以键值对的 

形式存储数据,完整的操作包含 

两行输入:命令行和数据行 

set,add, replace 

append, prepend, cas

<command name> <key> <flags> <exptime> <bytes> [noreply]\r\n 

cas <key> <flags> <exptime> <bytes> <cas unique> [noreply]\r\n 

Retrieval Commands

用户端通过一个或多个key从 

server端获取key值对应的键值对, 

完整操作为输入key,返回数据

get, gets <command name>  
Other commands

其他不涉及到数据的输入输出 

的命令

delete, incr/decr, touch,

slabs reassign, slabs automove, 

stats, flush_all, version, quit 

各命令的基本使用请参考官方网站,这里主要介绍一些命令的注意事项:

  • add命令必须在memcached中不存在相应key才能作用
  • replace命令要求memcached中必须存在相应key才能作用
  • set命令不管key存在与否,强制进行set操作
  • cas(check and set)命令的使用涉及到一个版本号的概念,这里为cas unique id,即键值对存储到memcached中时,会有一个特定的cas unique id, 使用cas命令时,要求跟随一个cas id作为参数输入,当输入的cas id与key对应的数据目前的cas id一致,才进行键值对的set操作
  • gets命令为根据多个key一次获取多个键值对,用来提高获取数据的效率,但是当这些key映射在不同的server上时,客户端需要同多个server进行通信,gets的意义不大,所以使用gets操作时,用户应该尽量保证多个key映射在同一个server上
  • touch命令涉及到一个过期时间(exptime)的概念,即在将数据存储到memcached中时,会设置一个过期时间,当前时间超过过期时间时,数据将自动失效,touch命令即用来更新数据的过期时间。
  • flush_all用来清除memcached中所有时间,主要采取将所有数据设置为过期的方式实现
  • slabs ressign, slabs automove主要用来在subclass之间转移slab, 后续会做介绍。

Memcached采用一致性hash算法

算法介绍很多,这里给出一个网友的例子吧:http://blog.csdn.net/cywosp/article/details/23397179/

Memcached文件结构

代码文件:
hash.h\hash.c hash算法
assoc.h\assoc.c Hash表的管理
items.h\items.c 服务器端item对象管理
slabs.h\slabs.c 服务器端内存对象管理
memcached.h\memcached.c 主函数及控制逻辑
thread.c 线程机制
stats.h\stats.c 数据统计
util.h\util.c 工具程序
Protocol.txt 帮助文档,参数概念