asp.net mvc3.0 集成memcached

memcached 同时被 2 个专栏收录
1 篇文章 0 订阅
1 篇文章 0 订阅

     
        memcached 的强大,不用说了!我这里对它的应用也只是冰山一角。都是些基本运用.

       可以先从  memcached官方 下载 。最新版本应该是1.4.15。我这里下载的是windows稳定版 版本是1.4.14.

        下载下来后.直接解压然后将memcached里面文件拷贝到你想创建的目录下即可

           

       

        

    然后dos下安装一下就OK了!至于一些基本参数可以再dos中设置,也可以再项目中设置,比如最大连接数,最小连接数,超时时间等等.(我的虚拟机又不工作了!FK.具体参数设置就不说了!)。参数信息可以参考一下下面我在网上找的一个列表.


         -p 监听的端口


         -l 连接的IP地址, 默认是本机


         -d start 启动memcached服务


         -d restart 重起memcached服务


         -d stop|shutdown 关闭正在运行的memcached服务


         -d install 安装memcached服务


         -d uninstall 卸载memcached服务


         -u 以的身份运行 (仅在以root运行的时候有效)


         -m 最大内存使用,单位MB。默认64MB


         -M 内存耗尽时返回错误,而不是删除项


         -c 最大同时连接数,默认是1024


         -f 块大小增长因子,默认是1.25


         -n 最小分配空间,key+value+flags默认是48


         -h 显示帮助


         mvc3.0项目搭建好后,会自动生成Global.asax文件,项目的一个全局文件! 我们在这里面设置memcached 的启动参数!


        

        public static void cachePool()
        {
            string poolname = "default";
            String[] serverlist = { "127.0.0.1:11211" };          ->这里如果需要部署分布式, 继续在后面追加ip即可!例如String[] serverlist = { "192.168.1.1:11211","192.168.1.2:11211" };
            SockIOPool pool = SockIOPool.GetInstance(poolname);
            pool.SetServers(serverlist); //设置服务器列表
            //各服务器之间负载均衡的设置
            pool.SetWeights(new int[] { 1 });                  ->这里部署分布式的时候是个很重要的参数,  相当于设置cache 值的主次!
            //socket pool设置
            pool.InitConnections = 5; //初始化时创建的连接数
            pool.MinConnections = 5; //最小连接数
            pool.MaxConnections = 2000; //最大连接数

            //连接的最大空闲时间,下面设置为6个小时(单位ms),超过这个设置时间,连接会被释放掉
            pool.MaxIdle = 1000 * 60 * 60 * 6;
            //通讯的超时时间,下面设置为3秒(单位ms),.NET版本没有实现
            pool.SocketTimeout = 1000 * 3;
            //socket连接的超时时间,下面设置表示连接不超时,即一直保持连接状态
            pool.SocketConnectTimeout = 0;
            pool.Nagle = false; //是否对TCP/IP通讯使用Nalgle算法,.NET版本没有实现
            //维护线程的间隔激活时间,下面设置为60秒(单位s),设置为0表示不启用维护线程
            pool.MaintenanceSleep = 60;
            //socket单次任务的最大时间,超过这个时间socket会被强行中断掉(当前任务失败)
            pool.MaxBusy = 1000 * 10;

            pool.Failover = true;

            pool.Initialize();
        }
        protected void Application_Start()      //这里调用
        {             
            cachePool();
        }
            

                OK,基本设置已经完成,下一步 我们需要下载两个dll 。用于集成net。 一个是Memcached.ClientLibrary 还有 MemcachedProviders.然后引用一下!

               

                 接下来我们写一个cache的操作类DataCache

                 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using Memcached.ClientLibrary;
using System.Security.Cryptography;

namespace Common
{
    /// <summary>
    /// memcached 缓存操作类
    /// </summary>
     public class DataCache
    {
        public static void SetMc(object obj, string cacheName)
        {
            string poolname = "default";
            cacheName = GetMD5(cacheName); 
            //客户端实例
            MemcachedClient mc = new Memcached.ClientLibrary.MemcachedClient();
            mc.PoolName = poolname; //如果实例化pool时没有poolname,该行可以不用。
            mc.EnableCompression = true;
            mc.CompressionThreshold = 10240;
            if (obj != null)
                mc.Set(cacheName, obj, DateTime.Now.AddHours(3));
        }
        public static void SetMc(object obj, string cacheName, int minutes)
        {
            string poolname = "default";
            cacheName = GetMD5(cacheName);
            //客户端实例
            MemcachedClient mc = new Memcached.ClientLibrary.MemcachedClient();
            mc.PoolName = poolname; //如果实例化pool时没有poolname,该行可以不用。
            mc.CompressionThreshold = 10240;
            if (obj != null)
                mc.Set(cacheName, obj, DateTime.Now.AddMinutes(minutes));
        }
        public static object GetMc(string cacheName)
        {
            string poolname = "default";
            cacheName = GetMD5(cacheName);
            //客户端实例
            MemcachedClient mc = new Memcached.ClientLibrary.MemcachedClient();
            mc.PoolName = poolname; //如果实例化pool时没有poolname,该行可以不用。
            mc.EnableCompression = true;
            return (object)mc.Get(cacheName);

        }
        public static void UpdateMc(object obj, string cacheName)
        {
            string poolname = "default";
            cacheName = GetMD5(cacheName);
            //客户端实例
            MemcachedClient mc = new Memcached.ClientLibrary.MemcachedClient();
            mc.PoolName = poolname; //如果实例化pool时没有poolname,该行可以不用。
            mc.Delete(cacheName);
            if (obj != null)
            {
                mc.EnableCompression = true;
                mc.Set(cacheName, obj);
            }
        }
        public static void DelMc(string cacheName)
        {
            string poolname = "default";
            cacheName = GetMD5(cacheName);
            //客户端实例
            MemcachedClient mc = new Memcached.ClientLibrary.MemcachedClient();
            mc.PoolName = poolname; //如果实例化pool时没有poolname,该行可以不用。
            mc.Delete(cacheName);
        }
         /// <summary>
         /// Cache MD5
         /// </summary>
         /// <param name="str"></param>
         /// <returns></returns>
        public static string GetMD5(string str)
        {
            int size = Common.PageBase.memcachedMD5Size;
            if (size == 16)
            {//16位
                MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
                str = BitConverter.ToString(md5.ComputeHash(System.Text.UTF8Encoding.Default.GetBytes(str)), 4, 8);
                str = str.Replace("-", "");
            }
            else
            {  //32位
                byte[] b = System.Text.Encoding.Default.GetBytes(str);
                b = new MD5CryptoServiceProvider().ComputeHash(b);
                for (int i = 0; i < b.Length; i++)
                {
                    str += b[i].ToString("x").PadLeft(2, '0');
                }
            }
            return str;
        }
    }
}

                    OK. 可以看到这两个参数。是设置memcached缓存的压缩比。memcached的单个item最多存储1m数据。 
            mc.EnableCompression = true;

                    至于cache  key 用md5加密,有两个原因,1是因为memcached 对于key的长度也是有限制,如果超出限制长度当前这个item会一直处于失效状态,2是因为安全问题。

                      

                    基本设置都已经完成,接下来可以使用我们的DataCache 进行数据缓存了。


                   

        /// <summary>
        /// get Model  by code
        /// </summary>
        /// <param name="OrderCode"></param>
        /// <returns></returns>
        public OrderInfo OrderInfoModelByOrderCode(string OrderCode)
        {
            string cacheKey = "OrderInfoModelByOrderCode_" + OrderCode;
            object objModel = Common.DataCache.GetMc(cacheKey);
            if (objModel == null)
            {
                try
                {
                    OrderInfo orderModel = dal.OrderInfoModelByOrderCode(OrderCode);
                    objModel = orderModel;
                    if (objModel != null)
                    {
                        int cacheTime = Common.PageBase.memcachedTime;            //memcached自动超时时间,比如设置10.当前这个cache item 就会在10分钟后自动失效,如有新请求,则重新add
                        Common.DataCache.SetMc(objModel, cacheKey, cacheTime);
                    }
                }
                catch (Exception ex)
                {

                }
            }
            return (OrderInfo)objModel;
        }


       到这里,基本运用就完成了。


  • 1
    点赞
  • 1
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值