2016年1月17日
摘要: 为了方便测试,给出一个C客户端libmemcached链接:https://launchpad.net/libmemcached/ 以及memcacheclient-2.0 : http://code.jellycan.com/files/memcacheclient-2.0.zip(已生成 sln 阅读全文
posted @ 2016-01-17 23:47 duanxz 阅读(998) 评论(0) 推荐(0)
摘要: Memcached在1.2.4版本后新增了CAS(Check and Set)协议,主要用于并发控制:memcached中同一个item同时被多个线程(多个客户端)更改的并发问题。CAS协议最本质的东西——版本号,即将每个item都关联一个全局唯一的编号,从而利用该唯一的编号来判断item数据在某个 阅读全文
posted @ 2016-01-17 23:46 duanxz 阅读(1935) 评论(0) 推荐(0)
摘要: 首先对状态机中的各种状态做个简单总结,具体可见状态转换示意图: 1.listening:这个状态是主线程的默认状态,它只有这一个状态:负责监听socket,接收客户连接,将连接socket派发给工作线程。 2.conn_new_cmd:每个工作线程的接收到新连接的初始状态,为处理该连接socket准 阅读全文
posted @ 2016-01-17 23:45 duanxz 阅读(745) 评论(0) 推荐(0)
摘要: 上节已经分析到了主线程中监听socket注册事件和工作线程中连接socket注册事件的回调函数都是event_handler,且event_handler的核心部分都是一个有限状态机:drive_machine。因此接下来将对该状态机具体的业务处理进行深入的剖析。 memcached将每个socke 阅读全文
posted @ 2016-01-17 23:44 duanxz 阅读(748) 评论(0) 推荐(0)
摘要: 整个状态机的基本流程如下图所示,后续分析将按该流程来进行。 接上节分解,主线程将接收的连接socket分发给了某工作线程,然后工作线程从任务队列中取出该连接socket的CQ_ITEM,开始处理该连接的所有业务逻辑。这个过程也就是上图中的第一个状态conn_listening。 而工作线程首先进入的 阅读全文
posted @ 2016-01-17 23:44 duanxz 阅读(716) 评论(0) 推荐(0)
摘要: 在前面工作线程初始化的分析中讲到Memcached采用典型的Master_Worker模式,也即半同步/半异步的高效网络并发模式。其中主线程(异步线程)负责接收客户端连接,然后分发给工作线程,具体由工作线程完成客户端的求情任务。 在memcached中,主线程负责监听所有socket上的事件,当so 阅读全文
posted @ 2016-01-17 23:43 duanxz 阅读(932) 评论(0) 推荐(0)
摘要: 前两节中对工作线程的工作流程做了较为详细的分析,现把其主要流程总结为下图: 接下来本节主要分析主线程相关的函数设计,主函数main的基本流程如下图所示: 对于主线程中的工作线程的初始化到启动所有的工作线程前面已经做了分析,后面的创建监听socket、注册监听socket的libevent事件、启动主 阅读全文
posted @ 2016-01-17 23:43 duanxz 阅读(642) 评论(0) 推荐(0)
摘要: 上节在分析slab内存管理机制时分析Memcached整个Item存储系统的初始化过程slabs_init()函数:分配slabclass数组空间,到最后将各slab划分为各种级别大小的空闲item并挂载到对应大小slab的空闲链表slots上。本节将继续分析对slab和item的主要操作过程。 s 阅读全文
posted @ 2016-01-17 23:42 duanxz 阅读(655) 评论(0) 推荐(0)
摘要: 在前面slab数据存储部分分析了Memecached中记录数据的具体存储机制,从中可以看到所采用的内存管理机制——slab内存管理,这也正是linux所采用的内存高效管理机制,对于Memchached这样的内存cache服务器,内存高效管理是其最重要的任务之一。 Linux 所使用的 slab 分配 阅读全文
posted @ 2016-01-17 23:41 duanxz 阅读(680) 评论(0) 推荐(0)
摘要: Memcached采用典型的Master-Worker模式,其核心思想是:有Master和Worker两类进程(线程)协同工作,Master进程负责接收和分配任务,Worker进程负责处理子任务。当各Worker进程将各个子任务处理完成后,将结果返回给Master进程,由Master进程做归纳和汇总 阅读全文
posted @ 2016-01-17 23:40 duanxz 阅读(659) 评论(0) 推荐(0)
摘要: 缓存数据以item为基本单元,以双链表形式存放在对应级别大小的slabclass结构的chunk中。同时该item还存放在链式hashtable中bucket中,用于提供快速查找的索引。 首先是理解缓存的基本数据单元item结构: typedef struct _stritem { struct _ 阅读全文
posted @ 2016-01-17 23:39 duanxz 阅读(861) 评论(0) 推荐(0)
摘要: memcached 中有两张hash 表,一个是“主hash 表”(primary_hashtable),另外一个是“原hash 表”(old_hashtable)。一般情况下都在主表中接受操作,在插入新item时判断是否需要进行扩;每次操作的时候,先会检测表是否正处于扩展(expanding)状态 阅读全文
posted @ 2016-01-17 23:39 duanxz 阅读(787) 评论(0) 推荐(0)
摘要: 分布式缓存出于如下考虑,首先是缓存本身的水平线性扩展问题,其次是缓存大并发下的本身的性能问题,再次避免缓存的单点故障问题(多副本和副本一致性)。分布式缓存的核心技术包括首先是内存本身的管理问题,包括了内存的分配,管理和回收机制。其次是分布式管理和分布式算法,其次是缓存键值管理和路由。 什么是Memc 阅读全文
posted @ 2016-01-17 23:38 duanxz 阅读(1486) 评论(0) 推荐(0)
摘要: 最近遇到一个需求,需要上传音频文件, 服务端使用webService 通过spring3 进行文件上传。代码完成后使用 html 通过post 方式请求接口成功了,但不知道如何使用Fiddler2工具进行模拟测试,经过一番努力终于成功了,在此分享一下! spring3文件上传开以参考:http://... 阅读全文
posted @ 2016-01-17 23:18 duanxz 阅读(2185) 评论(0) 推荐(0)
摘要: Mysql存储过程查询结果赋值到变量的方法 把查询结果赋值到变量,大部分情况下使用游标来完成,但是如果明确知道查询结果只有一行(例如统计记录的数量,某个字段求和等),其实可以使用set或into的方式来实现赋值。示例代码: drop table if exists test_tbl; create 阅读全文
posted @ 2016-01-17 23:17 duanxz 阅读(10328) 评论(0) 推荐(1)
摘要: 郑重声明:本篇博客是自己学习 Leveldb 实现原理时参考了郎格科技系列博客整理的,原文地址:http://www.samecity.com/blog/Index.asp?SortID=12,只是为了加深印象,本文的配图是自己重新绘制的,大部分内容与原文相似,大家可以浏览原始页面 :-),感兴趣的 阅读全文
posted @ 2016-01-17 22:58 duanxz 阅读(486) 评论(0) 推荐(0)
摘要: 几天前淘宝量子恒道在博客上分析了HBase的Cache机制,本篇文章,结合LevelDB 1.7.0版本的源码,分析下LevelDB的Cache机制。概述 LevelDB是Google开源的持久化KV单机存储引擎,据称是HBase的鼻祖Bigtable的重要组件tablet的开源实现。针对存储面对的... 阅读全文
posted @ 2016-01-17 22:12 duanxz 阅读(1629) 评论(0) 推荐(0)
摘要: 本文主要介绍大型分布式系统中缓存的相关理论,常见的缓存组件以及应用场景。 缓存概述 缓存的分类 缓存主要分为四类,如下图: CDN 缓存 CDN(Content Delivery Network 内容分发网络)的基本原理是广泛采用各种缓存服务器,将这些缓存服务器分布到用户访问相对集中的地区或网络中。 阅读全文
posted @ 2016-01-17 22:10 duanxz 阅读(1458) 评论(0) 推荐(0)
摘要: FW : http://xulingbo.net/?p=434 版权归许令波所有。此处只是一个转载。 后面介绍的不同方式都有测试数据,这些测试数据都是在同一的测试环境下得出的测试结果: 测试机器的配置如下: 64位5核CPU, E5620 @ 2.40GHz,内存8G CDN端缓存 由 于计数器的价 阅读全文
posted @ 2016-01-17 21:29 duanxz 阅读(4945) 评论(0) 推荐(0)