查看: 7083|回复: 0
打印 上一主题 下一主题

学习memcached的心得

[复制链接]
跳转到指定楼层
1#
发表于 2009-7-26 22:50:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
台州网址导航
这一周都在看memcached源代码,看完各个文件再结合一些前人写的心得,昨天再重新过一遍memecached的源代码,总算有了总体上的理解。本来想写篇学习笔记,可是太懒了写了一会又放弃,而且前人写的分析已经很详细了,参考他们的就好了。
新认识了memcache的几个地方,第一就是新增的几个命令:cas append prepend,
cas命令是用来改变一个存在的key的值,但它还带了检查的功能,原文如下:
“cas” is a check and set operation which means “store this data but only if no one else has updated since I last fetched it.”
意思是说如果这个值我最后一次取的没有被修改的话才存储这个值,比如我先获取一个key为”update_time”的值,然后有其他进程修改了这个值,此时我再调用cas设置这个值时则会返回一个EXSISTS的错误表示修改失败。
cas命令的语法是这样:cas key flags exptime cas_unique,
最后一个参数表示这个key的版本,是在调用gets命令获取的时候返回的。
gets uptime
VALUE uptime 0 10 2
2008-03-20
END
最后一个2就是这个key的修改版本,需要用cas更新这个值:
cas uptime 0 0 10 2
2008-03-22

append和prepend是在这个值后面或前面插入新值
append uptime 0 0 10
(18:30:26)
再查看:
get uptime
2008-03-22(19:30:26)

另外在调用stats命令查看memcached服务器具体信息的时候,有这样的一行:
STAT evictions 0
这个evictions是表示因为要腾出新的空间给新的item而移去的合法的item数目,可以参考这个参数状态来决定是否需要给memcached服 务器增加内存,如果后面的那个数值很大那说明分配的内存不够以致memcached不得不挪走当前还有用的item来存放的item.

memcached用了slab allocator(内存分配器)来管理内存,而不是用系统自带的malloc,因为用malloc会产生很多内存碎片。memcached在启动时会申 请一块很大的内存,然后用它的slab allocator来管理内存,这样就不用每存一个item就需要调用一次malloc,删除item的时候也不会free掉这块内存空间,具体的申请内 存的操作可以参考do_slabs_alloc这个函数。当然memcached也支持系统的malloc方式申请内存,只要在编译的时候定义 USE_SYSTEM_MALLOC宏就可以了。

从1.2.2版本以后memcached就开始支持多线程了,在编译的时候定义USE_THREADS宏就可以。默认会创建4个线程,主线程用于监 听客户建立的连接请求、accpet请求,然后通过管道通知子线程,由子线程处理读写请求。memcached的多线程主要是通过实例化多个 libevent实现的,分别是一个主线程和n个workers线程,无论是主线程还是workers线程全部通过libevent管理网络事件,实际上 每个线程都是一个单独的libevent实例。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享 分享淘帖
台州维博网络(www.tzweb.com)专门运用PHP+MYSQL/ASP.NET+MSSQL技术开发网站门户平台系统等。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

网站推广
关于我们
  • 台州朗动科技(Tzweb.com)拥有多年开发网站平台系统门户手机客户端等业务的成功经验。主要从事:政企网站,系统平台,微信公众号,各类小程序,手机APP客户端,浙里办微应用,浙政钉微应用、主机域名、虚拟空间、后期维护等服务,满足不同企业公司的需求,是台州地区领先的网络技术服务商!

Hi,扫描关注我

Copyright © 2005-2026 站长论坛 All rights reserved

Powered by 站长论坛 with TZWEB Update Techonolgy Support

快速回复 返回顶部 返回列表