Chinaunix首页 | 论坛 | 博客
  • 博客访问: 392824
  • 博文数量: 87
  • 博客积分: 2571
  • 博客等级: 少校
  • 技术积分: 920
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-29 13:10
文章分类

全部博文(87)

文章存档

2012年(49)

2011年(7)

2010年(26)

2009年(5)

分类: 服务器与存储

2012-03-28 18:31:51

memcached内存分配方式

点击(此处)折叠或打开

  1. 通过slabs子系统分配(在家里memecached实例时,参数里指定)
  2. 每个slab都是以MB为单位
  3. slab又可以划分为多个page,一个page大小固定为1MB
  4. page可划分为多个chunk,一个page中的chunk大小相同(如,都为64字节、或都为128字节、或。。。都为1MB-最大)
  5. chunk是最终存储数据的单元,合适的chunk大小是最符合数据size的那种,如果该种chunk已经用完,则可能
  6. 1.向系统申请更多内存(memcached有一个上限值)
  7. 2.回收已分配的chunk(LRU算法)

连接

点击(此处)折叠或打开

  1. 客户端通过TCP与服务器连接(同时也提供UDP接口)

会话管理

点击(此处)折叠或打开

  1. 不需要“终止会话”的命令,因为一个客户端会在会话不再有用后关闭连接.
  2. 但是客户端“鼓励”重用已经打开的连接,而不是重新开启新连接.因为客户端一般要
  3. 在对性能要求较高的环境中被使用(数百或上千个连接).
  4. 对连接进行缓存可以消除重新建立连接的操作(?)

数据协议

点击(此处)折叠或打开

  1. memcache协议中有两种数据:text lines和unstructured data.
  2. text lines用于客户端发送命令或者服务器返回响应
  3. unstructured data是在客户端存储或取出数据时发送,服务器会将数据作为字节流原样返回(如同存储时一样),
  4. 对使用的字符没有要求,但服务器和客户端会明确知道数据的长度

点击(此处)折叠或打开

  1. text lines一般由/r/n标识结束
  2. Unstructured data也是如此,或则/r, /n 或任何出现在数据中的8-bit字符
  3. 但当客户端从服务器获取数据时,必须用数据块的“长度”来判别数据块在何处结束,而不是任何特殊字符

命令


点击(此处)折叠或打开

  1. Storage commands有六种:"set", "add", "replace", "append","prepend"和"cas"
  2. 客户端发送1.一行命令;2.数据块
  3. 然后等待1.服务器返回的一行响应(成功或失败)

  4. Retrieval commands有两种:"get" and "gets"
  5. request中可以一次用一个key集合(一个或多个key)
  6. 客户端一次发送的一行command line中包含所有的requested keys
  7. "服务器对每一个key返回一个相关信息,和一个数据库"
  8. 以上过程会持续,知道服务器返回一个内容为"END"的response

  9. 所有其他命令都不带有unstructured data
  10. 此类命令会发送一个一行的命令,期望服务器返回一个一行的response,
  11. 或者返回一个以"END"做为结尾的response

  12. 一个命令总是有命令名开头,跟这参数(由空格符分隔)
  13. 命令名是小写的,大小写敏感
  14. 可用两种格式来设置超时:Unix time(绝对时间)或者秒数(与当前时间的超前秒数)
  15. 在使用后者时,超时时间最大可设置为60*60*24*30(表示30天的秒数),大于此数的,将被认为是从1970-1-1开始的绝对时间


  16. 对于客户端发送的每条命令,服务器都可能会返回一个出错提示,当前有三种类型的提示
  17. - "ERROR/r/n"
  18. 错误/不存在的命令
  19. - "CLIENT_ERROR /r/n"
  20. 客户端发送了存在的命令,但其中有某些错误,比如不符合协议
  21. - "SERVER_ERROR /r/n"
  22. 服务器端错误
  23. 某些严重错误发生时,服务器会在发送该错误提示后关闭,这是“服务器关闭对客户端连接的唯一可能”
  24. 存储命令
  25. set表示"存储数据"
  26. add表示“若服务器尚未使用该key时,存储数据”
  27. replace表示“若服务器已经使用该key,替换原数据”
  28. append表示"将数据加入一个已存在key的数据之后"
  29. prepend表示"将数据加入一个已存在key的数据之前"
  30. append和prepend命令不接收flags或exptime(接受数据操作,忽略对flag和exptime的新设置)
  31. cas是带有检查的操作,表示“若自从上次取出数据后无更新,则存储该数据”
  32. key 由客户端产生
  33. flags 16-bit无符号整形(10进制)
  34. 同数据一起被存储在服务器上,并随数据一起返回
  35. -
  36. exptime为0则永不超时
  37. -
  38. 数据块长度(不包括/r/n),可以为0(数据为空)
  39. -
  40. 数据块是由8字节为单位
  41. - "STORED/r/n", to indicate success.
  42. 成功
  43. - "NOT_FOUND/r/n"
  44. cas 命令失败:原数据不存在
  45. - *
  46. 一个或多个key(空格符分隔)

阅读(1343) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

常虫清2012-03-30 01:21:48

text lines一般由/r/n标识结束啊~