Asp.Net Memcached安装配置使用、安全性

Memcached安装配置使用

 一,准备
        你需要有一下软件:
       VS.NET(05/08)
       SQLSERVER
       memcached服务器端以及客户端类库(开源软件,下载即可)
其中,客户端类库包括以下几个DLL:
       Memcached.ClientLibrary.dll
       ICSharpCode.SharpZipLib.dll

二,Windows下的Memcache安装:
1. 下载memcache的windows稳定版,解压放某个盘下面,比如在c:\memcached
2. 在终端(也即cmd命令界面管理员身份安装,首先找出cmd.exe的原文件(在c:\windows\system32\cmd.exe),
右击以管理员进入,接下来的步骤就和xp安装方法一样了)下输入 ‘c:\memcached\memcached.exe -d install’ 安装
3. 再输入: ‘c:\memcached\memcached.exe -d start’ 启动。NOTE: 以后memcached将作为windows的一个服务每次开机时自动启动。这样服务器端已经安装完毕了。
4.监控
e:\memcached\memcached.exe -p 11121 -m 64 -vv

三,建立ASP.NET工程
     创建一个ASP.NETWEB项目,命名为MMCWEB,添加以上提到的几个客户端类库的引用。
四,配置
     memcached使用了log4net,所以我们先配置log4net
在web.config里找到configSections节点,添加以下内容
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />

再在configSections节点之外,增加以下内容:
<log4net>
        <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
            <param name="File" value="LogFiles/"/>
            <param name="AppendToFile" value="true"/>
            <param name="MaxSizeRollBackups" value="10"/>
            <param name="StaticLogFileName" value="false"/>
            <param name="DatePattern" value="yyyy-MM-dd&quot;.txt&quot;"/>
            <param name="RollingStyle" value="Date"/>
            <layout type="log4net.Layout.PatternLayout">
                <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger %ndc - %message%newline"/>
            </layout>
        </appender>
        <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
            <layout type="log4net.Layout.PatternLayout">
                <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger %ndc - %message%newline" />
            </layout>
        </appender>
        <root>
            <level value="ALL" />
            <appender-ref ref="RollingLogFileAppender" />
            <appender-ref ref="ConsoleAppender" />
        </root>
        <logger name="Memcached.ClientLibrary">
            <level value="WARN" />

        </logger>
    </log4net>
启动调试,若没出现配置的出错提示,并且在网站目录下有文件夹LogFiles,就说明log4net配置成功了。

五,初始化SockIOPool
SockIOPool是什么东东?SockIOPool是Memcached客户端提供的一个套接字连接池,通俗讲,就是与Memcached服务器端交换数据的对象。SockIOPool在应用程序启动时初始化一次就可以了,我把这个工作放在 GLOBAL.ASAX.CS的Application_Start方法里
char[] separator = { ',' };
            string[] serverlist = ConfigurationManager.AppSettings["Memcached.ServerList"].Split(separator);

            // initialize the pool for memcache servers
            try
            {
                SockIOPool pool = SockIOPool.GetInstance();
                pool.SetServers(serverlist);

                pool.InitConnections = 3;
                pool.MinConnections = 3;
                pool.MaxConnections = 50;

                pool.SocketConnectTimeout = 1000;
                pool.SocketTimeout = 3000;

                pool.MaintenanceSleep = 30;
                pool.Failover = true;

                pool.Nagle = false;
                pool.Initialize();
            }
            catch (Exception err)
            {
                //这里就可以用Log4Net记录Error啦!
            }

注意AppSettings["Memcached.ServerList"]是在WEB.CONFIG里设置的,所以WEB.CONFIG的appSettings的子节点里需要有以下一行
<add key="Memcached.ServerList" value="127.0.0.1:11211"/>
启动调试服务器,若没有出错的日志记录,说明IO连接池已经开辟成功。

配置信息:

  1. <?xml version="1.0"?>  
      
    <!--  
      有关如何配置 ASP.NET 应用程序的详细信息,请访问  
      http://go.microsoft.com/fwlink/?LinkId=169433  
      -->  
      
    <configuration>  
      
      <!--Enyim.Caching配置(省略了Log4Net框架)   For Memcached-->  
      
      <!--<configSections>  
        <sectionGroup name="enyim.com">  
          <section name="memcached" type="Enyim.Caching.Configuration.MemcachedClientSection, Enyim.Caching" />  
        </sectionGroup>  
      </configSections>  
      <enyim.com protocol="Binary">  
        <memcached>  
          <servers>  
            <add address="127.0.0.1" port="11121"  />  
          </servers>  
          <socketPool minPoolSize="10" maxPoolSize="100" connectionTimeout="00:00:10" deadTimeout="00:02:00" />  
        </memcached>  
      </enyim.com>-->  
       
      <!--The Enyim.Caching配置 End -->  
      
      <!--MemcachedProviders的配置  -->  
      <configSections>  
      <section name="cacheProvider" type="MemcachedProviders.Cache.CacheProviderSection, MemcachedProviders"  
            allowDefinition="MachineToApplication" restartOnExternalChanges="true"/>  
      <sectionGroup name="enyim.com">  
        <section name="memcached" type="Enyim.Caching.Configuration.MemcachedClientSection, Enyim.Caching" />  
      </sectionGroup>  
      <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>  
      </configSections>  
      <cacheProvider defaultProvider="MemcachedCacheProvider">  
        <providers>  
          <add name="MemcachedCacheProvider"  
         type="MemcachedProviders.Cache.MemcachedCacheProvider, MemcachedProviders"  keySuffix="_MySuffix_" defaultExpireTime="2000"/>  
        </providers>  
      </cacheProvider>  
      <enyim.com>  
        <memcached>  
          <servers>  
            <!-- put your own server(s) here-->  
            <add address="127.0.0.1" port="11121" />  
          </servers>  
          <socketPool minPoolSize="10" maxPoolSize="100" connectionTimeout="00:00:10" deadTimeout="00:02:00" />  
        </memcached>  
      </enyim.com>  
      
      <log4net>  
        <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">  
          <layout type="log4net.Layout.PatternLayout">  
            <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}]- %message%newline" />  
          </layout>  
        </appender>  
        <root>  
          <priority value="WARN"/>  
          <appender-ref ref="ConsoleAppender">  
            <filter type="log4net.Filter.LevelRangeFilter">  
              <levelMin value="WARN"/>  
              <levelMax value="FATAL"/>  
            </filter>  
          </appender-ref>  
        </root>  
      </log4net>  
       
      <!--The MemcachedProviders配置 End-->  
        
      <connectionStrings>  
        <add name="ApplicationServices"  
             connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnetdb.mdf;User Instance=true"  
             providerName="System.Data.SqlClient" />  
      </connectionStrings>  
        
        
      <system.web>  
        <compilation debug="true" targetFramework="4.0" />  
      
        <authentication mode="Forms">  
          <forms loginUrl="~/Account/Login.aspx" timeout="2880" />  
        </authentication>  
      
        <membership>  
          <providers>  
            <clear/>  
            <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices"  
                 enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false"  
                 maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"  
                 applicationName="/" />  
          </providers>  
        </membership>  
      
        <profile>  
          <providers>  
            <clear/>  
            <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/"/>  
          </providers>  
        </profile>  
      
        <roleManager enabled="false">  
          <providers>  
            <clear/>  
            <add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="ApplicationServices" applicationName="/" />  
            <add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/" />  
          </providers>  
        </roleManager>  
      
      </system.web>  
      
        
        
       
      <system.webServer>  
         <modules runAllManagedModulesForAllRequests="true"/>  
      </system.webServer>  
    </configuration>  

     


六,使用Memcached
       终于进入正题了,不过使用之前,我们还需要准备一些数据。
      创建一个实体类People,并加上Serializable属性!!!
      对应的数据库里,增加一张表,字段对应实体类,插入一些测试数据。持久层和业务层的设计就略过了,他们负责向提供一些数据,返回类型可自定,若ILIST,DATASET。
     Memcached使用起来就很简单了,比如后台检索出一组People类型的数据,放在一个叫peopleList的arraylist里,而且这个arraylist要频繁使用,只需要这样
MemcachedClient mc = new MemcachedClient();
mc.EnableCompression = true;
mc.Set(key, peopleList);     
         上面的key是用来访问这个arraylist的键,Memcached里的数据都是保存为键-值对的。
一旦mc.KeyExists(key)为TRUE,就用return mc.Get(key) as ArrayList提取数据,删除时,使用 return mc.Delete(key);等等。可以自己琢磨了。

         以上只是演示,其实数据缓存是一项复杂而繁琐的工作,不仅需要后台代码的分层优化,也需要数据库对大数据量访问的策略和调优。

Memcached 的安全性

如果你了解了 Memcached 的工作流程, 你可能已经注意到了,在访问缓存的过程中,没有任何权限控制的相关流程。如果你的数据不是非常重要的,你大可不必担心这方面的安全问题。如果你需要的话,以下几点可以协助你更完全的使用它:

使用唯一的 Key:因为在 Memcached 中的数据是以一个大的数组形式存在的,所以你应该使用唯一的 key。访问你的数据的唯一办法就是通过你保存数据时的 key,除此之外再没有其它可查询的办法。

保证你的 Memcached 器安全: 因为 Memcached 本身并没有身份验证机制,所以对 Memcached 的服务器查询,都应该通过防火墙进行。你可以在防火墙上设定规则,哪些服务器是允许被访问的,哪些是不允许被访问的。

加密你的数据: 你可以将数据和 Key 通过加密的方式保存在 Memcached 中。 这需要花费一些额外的 CPU 时间,但是为了你的数据安全,在情况允许的情况下,这个方法值得你去尝试。

posted @ 2014-11-10 15:54  郑州-在路上  阅读(404)  评论(0编辑  收藏  举报