zoukankan      html  css  js  c++  java
  • 分布式缓存Memcached

             大数据、高并发这是最近一段时间内被IT行业提的最为火热的概念,看过《大数据时代》的同学应该不会陌生大数据的概念,尤其是对于互联网行业来说,大数据是每天都要接触的问题,简单通俗地说,每天得大数据,就给系统的性能带来了新的要求---高并发,有了这样一个技术应用的实际背景,对技术人员就提出了要求,随着java环境下的Hadoop,PHP的Memcached,包括Redis的产生和技术的扩散,我们就开始接触这些应用与大数据高并发领域的架构理念,Memcached基于C语言编写,天生的跨平台,让这个技术很容易产生了Windows平台的版本,.NET环境对Memcached玩转就显得让人兴奋不已了。

    我的环境:

         Thinkpad T430  I5/2.8GHZ  8G/DDR3

         Windows 8 Enterprise X64

    首先,下载Memecached服务端安装包,据我所知官方不提供windows版本的安装包,需要自己编译,不过在github上有MSI安装包可以下载。

    服务端:http://code.jellycan.com/memcached/

    客户端:http://sourceforge.net/projects/memcacheddotnet/    

    当然还存在一些其它较好的客户端,这里我实现一个分布式缓存实现单点登录的功能,就使用了这个客户端。下载完成后,含exe安装包文件夹解压copy到自定义目录。我的环境中,我把它放到了E盘根目录。命令行安装

    完成安装后,使用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

    转:http://www.cnblogs.com/aspnetdream/

  • 相关阅读:
    第三次作业
    第二实验
    第一次作业
    yii2 Modal的使用
    yii2 显示列表字段 的技巧
    YII2在使用activeForm设置默认值
    html基础1
    tomcat+redis实现session共享缓存
    linux部署mongodb及基本操作
    hadoop 常用命令
  • 原文地址:https://www.cnblogs.com/jasonlny/p/3247985.html
Copyright © 2011-2022 走看看