大数据、高并发这是最近一段时间内被IT行业提的最为火热的概念,看过《大数据时代》的同窗应该不会陌生大数据的概念,尤为是对于互联网行业来讲,大数据是天天都要接触的问题,简单通俗地说,天天得大数据,就给系统的性能带来了新的要求---高并发,有了这样一个技术应用的实际背景,对技术人员就提出了要求,随着java环境下的Hadoop,PHP的Memcached,包括Redis的产生和技术的扩散,咱们就开始接触这些应用与大数据高并发领域的架构理念,Memcached基于C语言编写,天生的跨平台,让这个技术很容易产生了Windows平台的版本,.NET环境对Memcached玩转就显得让人兴奋不已了。前端
个人环境:java
Thinkpad T430 I5/2.8GHZ 8G/DDR3git
Windows 8 Enterprise X64github
首先,下载Memecached服务端安装包,据我所知官方不提供windows版本的安装包,须要本身编译,不过在github上有MSI安装包能够下载。web
服务端:http://code.jellycan.com/memcached/数据库
客户端:http://sourceforge.net/projects/memcacheddotnet/ 编程
固然还存在一些其它较好的客户端,这里我实现一个分布式缓存实现单点登陆的功能,就使用了这个客户端。下载完成后,含exe安装包文件夹解压copy到自定义目录。个人环境中,我把它放到了E盘根目录。命令行安装windows
完成安装后,使用start命令来启动memcached,这样memcached就会做为一个windows服务进程在运行缓存
服务端运行完成后,能够基本了解一下这个版本的Memcahced在windows平台下的一些基本特性:服务器
Memcached默认使用端口是11211
默认最大链接数是1024个
默认最大使用内存是64M
默认每一个键值对,值存储空间为1M
服务端准备工做完成后,咱们须要支持进行memcached编程的客户端,对于net技术来讲,就是须要支持的DLL,固然,若是对Memcached特别有研究的同窗,能够本身写Dll,Memecahed服务端会暴露相应的API供客户端调用,使用Sockt链接来进行数据交互。我使用的是Memcacheddotnetclient_1.1.5的客户端 。
全部的准备工做完成以后,就要进入咱们的代码阶段了。打开visual studio新建一个项目(控制台、web、win均可以),而后项目引入客户端DLL就能够进行编程了。为了方便单点登陆的Session数据共享的功能,我新建的是Web MVC程序。
程序目录结构:
实现单点登陆毫无疑问,首先使用MVC框架创建Login页面
View Login前端
一个密码输入框,一个用户名输入框,简单模拟登陆。当用户输入用户名密码以后,进行校验,校验经过将生成SessionID,经过Respons写入客户端,并将用户登陆信息存入Memecached,在下次用户直接请求Index页面的时候,首先经过Cookie存入的SessionId查找Memecached,若是查找到而且验证合格则直接跳转到Index,不然继续进入Login要求用户信息验证。
HomeControll代码以下:
[HttpPost] public ActionResult LoginAction(FormCollection values) { string name = values["txtName"]; string password = values["txtPass"]; if (name == myname && password == mypassword) { string sessionId = Guid.NewGuid().ToString(); MemcachHelper.Set(sessionId, name + "$" + password, DateTime.Now.AddDays(1)); Response.Cookies["SessionId"].Value = sessionId; return View("Index"); } return View("Login"); }
使用POST方式提交用户页面信息进行验证,我这里放了2个静态变量,真实的环境中,这个数据应该是从数据库中查询到的。
当用户直接请求非身份验证的页面的时候,咱们首先是查找Cookie中是否有咱们在登陆的时候写入的SessionID,存在SessionId则直接去Memecached拉取前次登陆的信息。
代码实现以下:
public ActionResult Index() { if (Request.Cookies["SessionId"] == null || string.IsNullOrEmpty(Request.Cookies["SessionId"].ToString())) { return View("Login"); } else { string key = Request.Cookies["SessionId"].Value.ToString(); string[] arrUserInfo = MemcachHelper.Get(key).ToString().Split('$'); if (arrUserInfo.Length >= 2) { if (arrUserInfo[0] == myname && arrUserInfo[1] == mypassword) { return View("Index"); } return View("Login"); } } return View("Login"); }
实现起来的业务逻辑并不复杂了,这里两次操做了Memecached,因此在Model中加入了一个操做Memecached的帮助类,类代码以下:
public class MemcachHelper { private static MemcachedClient mclient; static MemcachHelper() { string[] serverList = new string[] { "127.0.0.1:11211" }; SockIOPool pool = SockIOPool.GetInstance("First"); pool.SetServers(serverList); pool.Initialize(); mclient = new MemcachedClient(); mclient.PoolName = "test"; mclient.EnableCompression = false; } public static bool Set(string key, object value, DateTime expiry) { return mclient.Set(key, value, expiry); } public static object Get(string key) { return mclient.Get(key); } }
干脆利索的三个功能,因为使用的是静态类的静态方法,因此构造函数中对Memcached进行来了初始化,在类进行静态方法调用的时候,第一次回调用静态构造函数,将Memecached须要进行初始化的信息进行写入。其次,定义了Get和Set两个方法,一个读取,一个写入数据。操做Memecached就这么简单。
这里稍微解释一下静态构造函数中的代码:serverList实际上就是咱们说的服务器集群列表,这个列表直接告诉了咱们那台服务器,经过那个端口,加入这个memecached集群。创建SockIOPool链接,初始化链接池,并设置相应的过时时间。
抛砖引玉,欢迎吐槽学习!贴上个人源代码:http://files.cnblogs.com/aspnetdream/MemcachedMVC.rar