第一次自己写博客,而且水平有限,请大家多指点。
Memcached是一个高性能的分布式内存对象缓存系统,用于动态web应用已减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态,数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap,其守护进程(daemon)是C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。
此次主要研究的是Memcached的客户端(spymemcached)的源码,所有要首先学习下memcached协议从而才能对客户端源码有个深入了解。
比较详细的Memcached协议可以参考http://blog.s135.com/book/memcached/。
此处我把我认为几点比较重要的写一下。Memcached的客户端使用TCP连接于服务器通讯(udp也可以)。服务器一直监视着一些端口譬如11211端口,客户端编写代码连接该端口进行通信。因为memcached被设计成即使开启很多连接也能够高效的工作,缓存这些连接可以消除建立连接所带来的开销,所有在编写客户端的时候不用每次连接获得数据之后就关闭连接,所以也不用考虑像数据库连接中的连接池的问题,如果每次数据库连接都不进行关闭,而且数据库连接数是有限的,那么当数据库连接数达到一定数量,那么就不能建立新的连接。
在memcached的协议中发送的数据分为两种:文本行和自由数据。文本行被用于客户端的命令和服务器端的回应。自有数据用于客户端从服务器端存放或者获取时发送的。服务器会以字节流的方式传回自有数据。文本行固定以“\r\n”结束。自由数据也是同样以“\r\n”结束,但是 \r(回车符)、\n(换行符),以及任何其他8位字符,均可出现在数据中。因此,当客户端从服务器取回数据时,必须使用数据区块的长度来确定数据区块的结束位置,而不要依据数据区块末尾的“\r\n”,即使它们固定存在于此。此存可以这样理解memcached可以通过telnet 192.168.228.3 9999 这样连接memcached。然后通过get key来获得key值为key对应的数据,而通过tcp连接传递的时候其实是字节流,通过将
get key \r\n
END\r\n
转化为字节流传递给服务器,服务器做出反应返回
VALUE <key> <flags> <bytes>\r\n
<data block>\r\n
不过此处也是对应的字节流,第一行可以认为是文本行,而第二行可以认为是自由数据。其实spymemcached通过socket建立连接,将以上的字符串转化为字节流发送给服务器,然后获得服务器返回的字节流转化为字符串,或者对应的对象。其实<data block>就是我们想要的数据,当然前提是不出现error。
其他具体的信息可以参考http://blog.s135.com/book/memcached/。
对于客户端与服务器端必然要传递数据,传递数据就要考虑到I/O。看了接近一个月的spymemcached的源码,发现收获最大的就是I/O这块。
I/O模型可以分为:同步阻塞,同步非阻塞,异步阻塞,异步非阻塞IO。首先说下阻塞和非阻塞,可以参考下http://javag.iteye.com/blog/221641., http://book.51cto.com/art/201205/339234.htm
总结下就是,阻塞的建立建立之后,进行read,当没有数据是程序会挂起,cpu转而执行其他线程,数据为准备好,read会一直阻塞,那么该线程就无法继续往下运行。而非阻塞,有一个主线程来处理所有的IO,并负责分发,当你建议连接之后,吧你这个链接绑定到主线程下,然后,你这个线程可以继续做其他的事情,这个是通过事件驱动机制来实现,主线程会一直查看到底哪些线程准备好了,那么就执行该线程的读取或写入。java通过选择器selector来实现。当我们建立了连接之后,将连接注册到selector之后,可以进行其他操作,而主线程无限循环来查看selector选择器哪些连接准备好了读写,然后执行读写。也就是说同步程序会一直阻塞到可以进行IO操作,而非阻塞会立刻返回一个状态为,来判断是否可以进行IO。
对于同步于异步的区别可以查看http://skywhsq1987.iteye.com/blog/1663950
同步和异步是针对应用程序和内核的交互而言的,同步指的是用户触发IO操作并等待或者轮询的去查看IO操作是否就绪,而异步是用户触发IO操作之后便开始自己的事情,操作系统操作io当io操作完成时,会告诉应用程序。而spymemcached就是采用的同步非阻塞的IO,我们可以查看文档写到改客户端是单线程,异步的,这个地方的异步是指操作异步而不是IO,譬如,我进行get和set操作,是互不影响的,可以再get操作的时候进行set操作,因为这些操作是放到了队列里的,我们可以在向一个memcached的服务器进行get,另外一个进行set,我是这样认为的,请知道的给个准确的解释。
介绍就这么写,之后研究源码后可以继续体会。
由于本人是个菜鸟,很多都是引用别人的地方,有什么写的不对,请及时指出,大家共同进步。
分享到:
相关推荐
在Java中,我们可以使用各种客户端库与Memcached通信,如Spymemcached、Xmemcached、MemcachedClient等。这些库提供了方便的方法来操作Memcached服务器,包括设置、获取、删除和过期等操作。 3. **源码结构分析** ...
Java通过各种客户端库与Memcached进行通信,如spymemcached、xmemcached等。这里我们主要以spymemcached为例进行介绍。 1. **安装和启动Memcached服务器** 在开始Java编程之前,你需要在本地或服务器上安装并启动...
源码分析部分,你可以深入研究`MyMemcachedCache`类的实现,理解如何使用Memcached客户端API进行数据的存取。此外,`spymemcached`库中的源码也能帮助你理解Memcached与Java的交互过程。 文档方面,`doc`目录下的...
`MemcachedCache`与Memcached服务器通信的部分主要通过`MemcachedClient`实现,这个类使用了Spymemcached库,它是Java连接Memcached的常用工具。 在实际应用中,我们还需要关注缓存的一致性问题,因为Memcached是无...
首先,你需要下载 Memcached 的源码包或预编译二进制包。在Unix/Linux系统中,通常通过包管理器如`apt-get`(Ubuntu/Debian)或`yum`(CentOS/RHEL)进行安装。例如: ```bash sudo apt-get install memcached ``` ...
为了实现更高效、安全的缓存策略,你可以进一步研究Memcached的特性,如CAS(Compare and Swap)操作、持久化、分布式哈希等。同时,了解如何在大型分布式系统中优化Memcached的配置和使用,以充分发挥其性能优势,...
Java社区提供了多个Memcached客户端库,如spymemcached、xmemcached和smallest-epsilon等。这里以spymemcached为例,因为它简洁易用且广泛被采用。 3. **添加依赖** 在你的项目中,通过Maven或Gradle添加...
《深入理解Spymemcached-2.10.3:基于Memcached的高效缓存实践》 Memcached作为一款开源的、高性能的内存分布式缓存系统,被广泛应用于减轻数据库压力,提高服务响应速度。其核心原理是通过将常用数据存储在内存中...
1. **源码**:可能意味着文章会涉及memcached的源代码安装或自定义编译,也可能讨论与Java相关的开源库或API,用于与memcached进行交互。 2. **工具**:可能指的是memcached本身作为一个开发工具,或者在Java开发...
### memcached简介 Memcached是一种轻量级的缓存解决方案,它基于简单的键值对存储,支持多语言接口,设计为通过网络在多个服务器之间共享小块内存。其主要特点包括: 1. **高性能**:memcached的设计目标是高效...
对于源码部分,可能需要阅读和理解与memcached集成的Java客户端库的源代码,以了解如何与memcached通信并处理Session。工具方面,可能包括memcached服务器本身、Tomcat服务器,以及用于连接和调试的工具。 提供的...
安装Memcached通常包括下载源码、编译和配置服务器端,然后在Java应用中添加相应的客户端库,以实现Java应用与Memcached服务器之间的通信。 在实际应用中,Java应用会先尝试从Memcached获取数据,如果数据不存在,...
在Linux操作系统上安装Memcached涉及多个步骤,包括下载源码、编译、配置以及启动服务。以下是详细的过程: 1. **获取源码**: 首先,你需要访问Memcached的官方网站或通过Git克隆其源码仓库来获取最新版本的源码...
总结来说,这个示例涵盖了在CentOS 6.5上从源码安装Memcached,配置开机启动,以及使用Java客户端与Memcached交互的关键步骤。通过这种方式,你可以充分利用Memcached的性能优势,提高你的Web应用的效率。记得在实际...
#### 一、Memcached简介与应用场景 **Memcached**是一种高性能、分布式内存对象缓存系统,用于通过减少数据库负载来加速动态Web应用的速度。它通过在内存中缓存数据来减少对数据库服务器的访问次数,从而提高了网站...
**Spymemcached-2.7.3:Java Memcached 客户端的深度解析** Memcached是一款高性能、分布式内存对象缓存系统,常用于减轻数据库的负载,提高应用程序的性能。而`spymemcached`是Java社区广泛使用的Memcached客户端...
1. **下载**: 从官方网站或者第三方源获取对应版本的Memcached源码,比如`memcached-1.4.5`。 2. **编译安装**: 解压源码,运行配置脚本(如`./configure`),然后进行编译和安装(如`make && make install`)。 3. ...
首先,我们需要引入一个Java库来与Memcached通信,例如spymemcached或xmemcached。这两个库提供了Java客户端,方便我们进行API调用。这里以spymemcached为例,你可以通过Maven或Gradle将依赖添加到项目中: ```xml ...