您的位置:首页 > 数据库 > Memcache

Memcached源码分析之一

2015-06-09 15:49 627 查看

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.chash算法
assoc.h\assoc.cHash表的管理
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帮助文档,参数概念

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: