看看mina和memcached的联姻(适合不同语言客户端,高并发?)

[size=medium]/**
* 作者:张荣华
* 日期:2008-07-21
**/

看看mina和memcached的联姻

先来解释一下这两个东东的身世

Mina,是什么?
Minan是一个network 应用框架,她能很方便的帮助用户开发出高性能和高可扩展性的网络应用程序。官方地址请看:http://mina.apache.org/

Memcached是什么?
memcached一个remote cache,它只提供数据存储服务,不过它得java客户端比较不错,还有很多其他语言的客户端,也就是说其周边比较丰富。Memcached的文章太多了,随便一搜一大堆。

现在相信大家对这两个东西有点了解了,接着转入正题吧,我估计猛一看标题,很多童鞋估计都有那么一点云中子的感觉(因为云中子一般在云里或者雾里,所以云中子==云里雾里),从上面的解释来看mina和memcached好像是八竿子打不到一起去的东西。这两个东西怎么能走到一起呢。先看他们能解决什么样的需求。

需求:我们知道,所有的互联网服务几乎都离不开connection这个东东,比如我们打开一个网页,从浏览器发起请求到tomcat接受请求并返回数据,这个过程就开启了一个短连接,数据返回之后这个连接就关闭了,也就是说每个请求其实都是一个新连接的开启和关闭。然后,tomcat中的application向数据库发送一个查询语句,它需要从连接池中拿到一个connection,这个connection一直在pool中,显然这个connection是一个长连接,由此可见一次请求,从浏览器到db再到浏览器既经过了短连接有经过了长连接,我们的生活是离不开连接的。

上面说的这个例子是一个请求的最简单模型,因为我们的application可不只是依赖数据库,尤其在互联网应用中,通常我们的application还依赖于其他的server,比如说我们的互联网应用可能还连接着memcached server,通常,这里也有一个连接池,维护着一堆长连接,那么结束了吗,不,再通常我们的application还依赖于其他的application。好及了,一个相对有点复杂的应用网络,接着往下说,快到重点了

重点:
一般情况下,我们的application依赖于其他application的的时候我们会直接使用http协议,或者再次封装过的http协议(诸如webservice之流),而且这种情况是大多数情况,但是不是全部情况,因为在互联网上我们会遇到各种各样的需求。因为http连接是短连接,每次发起连接的3次握手不可避免,这是造成其并发量不高的重要原因之一(有的人也许会说,即使http并发高有什么用,你的application还是撑不住,但是我想说的是不是所有的应用都是这样的,只是你没有遇到过而已)。那么假设我有一个数据中心,这个数据中心可以提供common数据的服务,这些common的数据会被网站的各个地方获取,这些common的数据之间可能还有一些计算,我可以通过请求的参数来执行对应的操作,比如查询,统计等等(哇,看来能有效的降低数据库的压力啊),那么看来memcached是不行了(不能定制计算),只能自己写这样的应用了,不过以什么样的形势发布接口呢,短连接不行,并发量有限,只能长连接,还要考虑到一点,我的服务的客户端是不定的,有可能是php,也有可能是java,也有可能是python,也有可能是ruby,如何是好啊。

首先长连接是不二选择,高并发,高连接数是我们最中意的,有了这两个特性,我们这个application就可以被其他很多app使用了,就象共享memcached server一样。

其次支持多客户端语言最好是能够有效利用现有资源,比如说不需要自己去开发客户端。

这时候memcached就可以抱着mina出场了。理由:
1 Memcached有众多的客户端,可谓周边齐全,看来非它莫数。
2 mina可以非常方便的开发出server端程序,好姑娘啊。

来吧,看看最简单的示例:
Server端主类:

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.charset.Charset;
import org.apache.mina.common.ByteBuffer;
import org.apache.mina.common.IoAcceptor;
import org.apache.mina.common.SimpleByteBufferAllocator;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.nio.SocketAcceptor;
import org.apache.mina.transport.socket.nio.SocketAcceptorConfig;
/**
* @author ahuaxuan(aaron zhang)
* @since 2008-7-21
* @version $Id$
*/
public class MinaServer {
private static final int PORT = 11211;
public static void main(String[] args) throws IOException {
// code will go here next
ByteBuffer.setUseDirectBuffers(false);
ByteBuffer.setAllocator(new SimpleByteBufferAllocator());
IoAcceptor acceptor = new SocketAcceptor();
SocketAcceptorConfig cfg = new SocketAcceptorConfig();
// cfg.getFilterChain().addLast("logger", new LoggingFilter());
cfg.getFilterChain().addLast(
"codec",
new ProtocolCodecFilter(new TextLineCodecFactory(Charset
.forName("UTF-8"))));
acceptor.bind(new InetSocketAddress(PORT), new ServerHandler(), cfg);
System.out.println("------------ Mina Server start up -----------");
}
}

这样,启动这个main方法,就可以建立一个socket server的实例了,欢迎大家来连!!!
相当简单啊,再看看一个重要的ServerHandler类

其中有一个重要的方法:

public void messageReceived(IoSession session, Object msg) throws Exception {
String str = msg.toString();
String[] parts = str.split(" ");
if (parts != null && "get".equals(parts[0])) {
StringBuilder sb = new StringBuilder();
sb.append("VALUE").append(" key ");
sb.append("1").append(" ");
sb.append(str.length()).append(" \r\n ");
sb.append(str + "\r\n").append("");
//看看这里吧
session.write(sb.toString());
session.write("END\r\n");
System.out.println("Message written..." + sb.toString());
} else {
throw new IOException("unsupportoperation");
}
}

哟,这么多\r\n,还有”END\r\n”这种东西?不好意思,这个是memcached协议定的我也没有办法(说到这里大家终于知道了本文其实只不过是用mina来实现memcached协议而已,前面被我那么多废话解释弄晕了吧,嘿嘿)。

看到这里,我想要提醒一下,msg通常是这样的get aaabbbccc,其中aaabbbccc是key,但是用在我们自己的server上,它就可以不是key了,比如说它可以是/getDistrict.do?name=xx&cc=yy`````````,server拿到这样的字符串之后,一解析就知道客户端要什么了,那么就可以返回数据了,是我的话我会用json序列化我的对象,然后返回。只是一定要告诉客户端我的数据包括哪些内容,又快并发又高(再次提醒,我的application可以高并行计算,比如说大多数数据都在内存中哦),hoho,而且任何一个客户端语言都可以享受这种服务哦。

好了,数据成功返回之后,为了让memcached的客户端能够成功解析,我们必须使用memcacached协议,看一段get协议的解释吧(目前主要是使用这个):

一行取回命令如下:
get <key>*\r\n
<key>* 表示一个或多个键值,由空格隔开的字串
这行命令以后,客户端的等待0个或多个项目,每项都会收到一行文本,然后跟着数据区块。所有项目传送完毕后,服务器发送以下字串:
"END\r\n"来指示回应完毕。

服务器用以下形式发送每项内容:VALUE <key> <flags> <bytes>\r\n
<data block>\r\n
<key> 是所发送的键名
- <flags> 是存储命令所设置的记号
<bytes> 是随后数据块的长度,*不包括* 它的界定符“\r\n”
- <data block> 是发送的数据如果在取回请求中发送了一些键名,而服务器没有送回项目列表,这意味着服务器没这些键名(可能因为它们从未被存储,或者为给其他内容腾出空间而被删除,或者到期,或者被已客户端删除)。

这样就可以了,注意,这里只不过是很简单的测试代码(正式代码不便给出),也只不过是提供一个思路而已,大家如果也需要用到这样的场景可以沿着这个思路走下去。

声明:由于ahuaxuan水平有限,文中难免有不妥之处,希望大家不吝赐教。

ps:如果你没有memcached的客户端,最快的见效的是通过telnet,在windows console里输入telnet localhost 11211,就可以了
[/size]

时间: 2024-11-03 22:58:42

看看mina和memcached的联姻(适合不同语言客户端,高并发?)的相关文章

应对Memcached缓存失效,导致高并发查询DB的几种思路

最近看到nginx的合并回源,这个和下面的思路有点像.不过nginx的思路还是在控制缓存失效时的并发请求,而不是当缓存快要失效时,及时地更新缓存. nginx合并回源,参考:http://blog.csdn.net/brainkick/article/details/8570698 update: 2015-04-23 ====================== 当Memcached缓存失效时,容易出现高并发的查询DB,导致DB压力骤然上升. 这篇blog主要是探讨如何在缓存将要失效时,及时地

应对Memcached缓存失效,导致高并发查询DB的四种思路(l转)

当Memcached缓存失效时,容易出现高并发的查询DB,导致DB压力骤然上升. 这篇blog主要是探讨如何在缓存将要失效时,及时地更新缓存,而不是如何在缓存失效之后,如何防止高并发的DB查询. 解决这个问题有四种思路: 比如一个key是aaa,失效时间是30s.   1.定期从DB里查询数据,再刷到memcached里 这种方法有个缺点是,有些业务的key可能是变化的,不确定的. 而且不好界定哪些数据是应该查询出来放到缓存中的,难以区分冷热数据.   2.当缓存取到为null时,加锁去查询DB

memcached在大负载高并发网站上的应用(一)---简介

大家可能对memcached这种产品早有了解,或者已经应用在自己的网站中了,但是也有一些朋友从来都没有听说过或者使用过. 这都没什么关系,本文旨在从各个角度综合的介绍这种产品,尽量深入浅出,如果能对您现在或以后的工作有所帮助,笔者将感到无比荣幸. 我要介绍的内容包括以下几个方面: 1.memcached的简介 2.memcached的应用场景 3.memcached的安装 4.memcached的使用 5.memcached的部署架构 6.memcached的局限性 7.memcached的改进

mina服务端 C语言客户端,怎样进行TLS 单向认证

问题描述 mina服务端 C语言客户端,怎样进行TLS 单向认证 各位老师好: 因项目中用到socket和第三方公司通讯,选择了mina框架(服务端mina java开发,客户端C语言(第三方)),不加tls 客户端(C语言)可以正常通讯, 现要进行tls 单向认证的操作,因对此不了解,客户端说 服务端用CA认证,他们才能读取证书信息,网上搜了一下.都是 在tomcat配置,用openssl 做ca 证书,可是项目没有通过浏览器,只是底层之间的通讯, 请各位老师,帮忙指点!谢谢了

请问dotnet适合用于开发高并发访问量的应用系统吗?

问题描述 类似于车辆GPS调度管理的系统,所有车辆(假设5000部)定位数据通过无线传回,系统提供GIS服务. 解决方案 解决方案二:才区区5000完全可以并发能上100吗?解决方案三:并发的问题不应该是你选择开发语言着重考虑的问题.解决方案四:才区区5000完全可以解决方案五:绝对可以,只要你能写好,当然可以找一下第三方比较完善的并发框架解决方案六:目前主流的开发语言都可以支撑解决方案七:并发跟语言实质上没什么太大关系吧...看你代码怎么写了..比如类似你这种我随意写10行代码就支持几万并发.

memcached在大负载高并发网站上的应用(二)---应用场景

写这篇文章之前,我也特意跟以前的同事做了一些交流,在此感谢sina xiangdong.kingsoft zhangyan和yahoo luke.另外,还有网上的朋友对我上一 节的文章发表了许多有建设性评论,在这里一并感谢. memcached最吸引人的地方主要在于它的分布式.分布式对于互联网应用来讲 ,按照用途基本上可划分为三种方式:分布式计算.分布式存储和两者兼而有之 .memcached是分布式存储的一种.我们常见的分布式存储大多数是将N台设备( server或者单独的存储)构建成盘阵,而

银行界:PE投资适合风险承受力强高净值人士

私募股权投资(PE)从2008年瞬间"蹿红"至今,高额的利润率.动辄上千万元的门槛,使其成为独特的投资领域.越来越多的银行与 信托公司合作,为高端客户提供PE投资产品.这期汇丰理财圆桌的话题将围绕PE投资展开,参与嘉宾认为,PE投资只适合风险承受能力强的高净值客户. 嘉宾:招商银行私人银行中心(上海)总经理 张印君 民生银行私人银行上海中心总经理 张詠 华宝信托业务总监 刘凌峰 主持人:中国证券报记者 PE投资时间长风险大 中国证券报记者:与投资股票.房产等相比,PE投资有哪些特点?P

Memcached缓存大数据时对服务器内存、CPU的影响及其对硬件的配置需求

最近公司在进行缓存框架方面的调研,我主要对Memcached在缓存大数据量情况下对系统硬件的影响和需求做了调研,以下是一些测试数据和调研结果:  Memcached缓存不同数据量测试情况:           一.测试环境配置信息    1. 缓存服务器配置信息:一共4台 ,三台是公司服务器,一台是本机         node1: 单核 1G内存         node2: 单核 1G内存         node3: 单核 1G内存         node4: 4核  8G内存    2

WebService案例入门(基础篇)

[版权申明:本文系作者原创,转载请注明出处] 文章出处:http://blog.csdn.net/sdksdk0/article/details/52106690 作者:朱培 ID:sdksdk0 邮箱: zhupei@tianfang1314.cn 一.简介 Webservice:跨语言跨平台的远程调用技术.Web service 即web服务,它是一种跨编程语言和跨操作系统平台的远程调用技术即跨平台远程调用技术. JAVA 中共有三种WebService 规范,分别是JAX-WS(JAX-R