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 | 帮助文档,参数概念 |