查看文章
 
libmemcached学习笔记
2010-12-30 18:52

    libmemcached学习笔记
       
         jingleyang
18:34 2010-12-30

从 memcached.h 开始看
结合帮助
http://docs.tangent.org/libmemcached/


1> memcached_st 类似 数据库连接 conn,
内有协议格式的控制变量
通过behavior修改
如设置tcp/udp , 二进制协议还是文本的,hash的方法

2> memcached_servers_reset

遍历清空 server list

3> memcached_create
分配 memcached_st 结构

4> memcached_free
回收 memcached_st 结构
会自动调用 memcached_server_list_free

5> memcached_reset_last_disconnected_server
 
使 memcached_st 结构中last_disconnected_server
= NULL

6> memcached_clone
深度复制 memcached_st 结构

7> memcached_set_user_data
memcached_st 结构中有一个user_data的void* 结构,
返回旧的

8> memcached_get_user_data
拿到 user_data

9> memcached_push  a <--- b
把b的serverlist 添加进a

会用到memcached_server_push

10> memcached_server_instance_by_position
通过index返回 server 的结构

11> memcached_server_count
返回有多少个 server

12> 提供了一个c++ class 的实现
Memcached
只提供了 构造析构等函数
=============================================

common.h
这里的函数都是供内部实现的
都有 LIBMEMCACHED_LOCAL 宏
最后有一些 malloc, free, realloc, calloc的包装实现

=================================================
memcached.h
的开头包含了很多头文件,接下来依次分析
==================================================
visibility.h
定义 一些控制 导入、导出的宏,
学习跨平台的使用技巧
LIBMEMCACHED_API
LIBMEMCACHED_LOCAL

===================================================
configure.h
定义 版本号
特性支持的宏

===================================================
platform.h
跨平台网络库的头文件声明
#include <winsock2.h>
#include <sys/socket.h>
...
===================================================
constants.h
比较重要
定义了常量
包括 返回值,默认值,分布式算法名字,网络选项,回调选项,hash算法名等
==================================================
types.h
定义了很多 typedef
主要是 回调函数指针的声明
==================================================
string.h
memcached_string_st 的内部实现
==================================================
stats.h
重要 , 内含查询状态有关的API
memcached_stat_st 是状态类

1> memcached_stat_free
释放 memcached_stat_st  的内存
2> memcached_stat_servername
查询指定server的信息,可以用来确认server 是否ok
3> memcached_stat_get_value
取memcached_stat_st 中的某一个变量
4> memcached_stat_st
返回key值
5>memcached_stat_execute 是一个回调
暂时用不到

=================================================
hashkit.h
hash 算法的实现API , 一会回头分析
*******
====================================================
allocators.h
高级功能 自定义内存管理
work with user defined memory allocators
1> memcached_set_memory_allocators
2> memcached_get_memory_allocators
====================================================
analyze.h
分析模块
memcached_analysis_st 存放分析的结构
pool_hit_ratio 可以返回 命中率

==================================================
auto.h
实现 i+n  ,i-n 的操作
一下函数参数的 offset 都是指 n

memcached_increment  i+n
memcached_decrement  i-n

所有的by_key 都是用户自定义主键的API
memcached_increment_by_key
memcached_decrement_by_key
 
带有默认值的操作  initial
memcached_increment_with_initial
expiration 代表超时时间
如果是MEMCACHED_EXPIRATION_NOT_ADD , 就返回错误

===================================================
behavior.h
重要,控制客户端的行为 ***
data 传 1就是开启
1> memcached_behavior_set
详见 behavior.txt
选几个比较重要的

MEMCACHED_BEHAVIOR_USE_UDP 使用UDP , udp 会限制包长度,并没有返回no_reply

MEMCACHED_BEHAVIOR_NO_BLOCK 非阻塞通信

等待的时间 和非阻塞冲突,(毫秒还是秒?)
MEMCACHED_BEHAVIOR_SND_TIMEOUT
MEMCACHED_BEHAVIOR_RCV_TIMEOUT

不组包,直接发
MEMCACHED_BEHAVIOR_TCP_NODELAY

默认md5 ,可以选MEMCACHED_HASH_CRC
MEMCACHED_BEHAVIOR_HASH

最重要,定制分布式的算法,默认是MEMCACHED_DISTRIBUTION_MODULA ,
一致性hash MEMCACHED_DISTRIBUTION_CONSISTENT
MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED 带权重的分配
等 get 时再详细分析
MEMCACHED_BEHAVIOR_DISTRIBUTION

启用二进制协议
MEMCACHED_BEHAVIOR_BINARY_PROTOCOL

尝试失败n次后踢出server
MEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT

不关心结果
MEMCACHED_BEHAVIOR_NOREPLY

副本个数
MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS

启用随机副本验证 , 需要详细分析
MEMCACHED_BEHAVIOR_RANDOMIZE_REPLICA_READ

============================================================
callback.h
定制回调函数,可以实现异步处理

1> memcached_callback_set

等出错的时候调用的函数
MEMCACHED_CALLBACK_GET_FAILURE
MEMCACHED_CALLBACK_DELETE_TRIGGER

=================================================================
delete.h
重要
delete的操作API
如果设置不关心返回结果,就直接返回ok
还可以设置expiration,(需要继续看)
1> memcached_delete
===============================================================
dump.h

可以实现批量条件删除
取得key 列表
需要传回调函数
 /* No support for Binary protocol yet */

1> memcached_dump
传入一个callback数组
  typedef memcached_return_t (*memcached_dump_fn)(memcached_st *ptr, 
                                                  const char *key,
                                                  size_t key_length,
                                                  void *context);

================================================================
fetch.h

传入callback数组
memcached_fetch_execute

批量处理 和 memcached_fetch_result有关,后面分析context

=================================================================
flush.h
1> memcached_flush
清空所有缓冲,会依次处理serverlist 的

==================================================================
flush_buffers.h
 如果启用了MEMCACHED_BEHAVIOR_BUFFER_REQUESTS , 这个命令会强制命令执行
memcached_flush_buffers

=======================================================================
get.h
重要****
1> memcached_get
注意 用完了切记 free val

多个key 同时取
2> memcached_mget

例子
Fetching multiple values

  memcached_return_t rc;
  char *keys[]= {"fudge", "son", "food"};
  size_t key_length[]= {5, 3, 4};
  unsigned int x;
  uint32_t flags;
  char return_key[MEMCACHED_MAX_KEY];
  size_t return_key_length;
  char *return_value;
  size_t return_value_length;
  rc= memcached_mget(memc, keys, key_length, 3);
  x= 0;
  while ((return_value= memcached_fetch(memc, return_key, &return_key_length,
                                        &return_value_length, &flags, &rc)))
  {
    free(return_value);
    x++;
  }

 

3> memcached_fetch_execute
相当高级的功能,暂时内搞清楚
If you try to perform a really large multiget with memcached_mget()
you may encounter a deadlock in the OS kernel (we fail to write data to the socket because the input buffer is full).
memcached_mget_execute() solves this problem by processing some of the results before continuing sending out requests.
 Please note that this function is only available in the binary protocol.

===========================================================================
hash.h
返回hash值
1> memcached_generate_hash_value
2> memcached_generate_hash 使用memcached_st 内置的hash算法
常见的hash   算法
  MEMCACHED_HASH_MD5,
  MEMCACHED_HASH_CRC,

3> memcached_get_hashkit
返回当前的hash call_back function

===========================================================================
parse.h
1> memcached_servers_parse
解析 ip:port
============================================================================
quit.h
1> memcached_quit
This function is called automatically when you call memcached_free()
on the memcached_st structure.
===========================================================================
result.h
内置的返回数据结构memcached_result_st
提供了一组操作它的接口,和char* 的操作接口相似

1> memcached_result_value
和char* 转换
2> memcached_result_length
得到长度
3> memcached_result_set_value
===========================================================================
server.h
1> memcached_server_cursor
遍历server list
An error return from any callback will terminate the loop

2> memcached_server_by_key
用key 选一个server
返回memcached_server_instance_st 结构
可以拿到  memcached_socket_t fd; //socket

3> memcached_server_add_udp
添加一个udp的server

4> memcached_server_add  ***
添加一个TCP的server

5> memcached_server_add_unix_socket
添加一个unix socket , 传入文件名

6> 添加服务器的函数还有 _with_weight版本 默认是0
默认localhost:11211

7>memcached_server_name , memcached_server_port
返回server的信息 , 针对一个单独的server

========================================================
server_list.h
提供对server list 的操作
1> memcached_server_push
serverlist --> memc
2> memcached_server_list_append / memcached_server_list_append_with_weight
向serverlist 添加一个server
3> memcached_server_list_count
返回server的个数

==========================================================
storage.h
重要 负责存储部分的操作

1> memcached_set
time_t expiration,的特殊处理,应该测试一下 0 , (unsigned int)-1, time(NULL)
memcached_set() with non-blocking IO is the fastest way to store data on the server
2> memcached_add

memcached_set() will write an object to the server.
If an object already exists it will overwrite what is in the server.
If the object does not exist it will be written.
If you are using the non-blocking mode this function will always return true unless a network error occurs.


memcached_replace()
replaces an object on the server.
If the object is not found on the server an error occurs.

memcached_add() adds an object to the server.
If the object is found on the server an error occurs, otherwise the value is stored.


3>memcached_prepend 添加前缀和后缀
memcached_prepend() places a segment of data before the last piece of data stored. Currently expiration and key are not used in the server.
memcached_append() places a segment of data at the end of the last piece of data stored. Currently expiration and key are not used in the server.

 

4> 对于cas 目前还没有什么需求,略过
存储函数都有by_key 版本

===============================================================
strerror.h
1> memcached_strerror
返回错误字符串

===============================================================
version.h

1> memcached_lib_version
返回版本号
#define LIBMEMCACHED_VERSION_STRING "0.44"

===============================================================
sasl.h

sasl方面目前没有需求
暂不分析

====================================================================
选择服务器的分析

[storage.c]
server_key= memcached_generate_hash_with_redistribution(ptr, master_key, master_key_length);
instance= memcached_server_instance_fetch(ptr, server_key);


hosts.c

dispatch_host

方法:
1> MEMCACHED_DISTRIBUTION_CONSISTENT
一致性hash
用二分法确定环上的值

2> MEMCACHED_DISTRIBUTION_MODULA
取mod
  return hash % memcached_server_count(ptr);

3> MEMCACHED_DISTRIBUTION_RANDOM
随机
 return (uint32_t) random() % memcached_server_count(ptr);

4> 默认 取mod
  default:
    WATCHPOINT_ASSERT(0); /* We have added a distribution without extending the logic */
    return hash % memcached_server_count(ptr);
===========================================
memcached_server_add 添加server 更方便

 

 


类别:linux&unix||添加到搜藏 |分享到i贴吧|浏览(821)|评论 (0)
 
最近读者:
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
     

   
帮助中心 | 空间客服 | 投诉中心 | 空间协议
©2012 Baidu