zoukankan      html  css  js  c++  java
  • Cache的封装和使用

    ICache 接口

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Hzb.Utils.Caching
    {
        /// <summary>
        /// Cache manager interface
        /// </summary>
        public interface ICache
        {
            /// <summary>
            /// Gets or sets the value associated with the specified key.
            /// </summary>
            /// <typeparam name="T">Type</typeparam>
            /// <param name="key">The key of the value to get.</param>
            /// <returns>The value associated with the specified key.</returns>
            T Get<T>(string key);
    
            /// <summary>
            /// Adds the specified key and object to the cache.
            /// </summary>
            /// <param name="key">key</param>
            /// <param name="data">Data</param>
            /// <param name="cacheTime">Cache time</param>
            void Add(string key, object data, int cacheTime = 30);
    
            /// <summary>
            /// Gets a value indicating whether the value associated with the specified key is cached
            /// </summary>
            /// <param name="key">key</param>
            /// <returns>Result</returns>
            bool Contains(string key);
    
            /// <summary>
            /// Removes the value with the specified key from the cache
            /// </summary>
            /// <param name="key">/key</param>
            void Remove(string key);
    
            /// <summary>
            /// Clear all cache data
            /// </summary>
            void RemoveAll();
    
            object this[string key] { get; set; }
    
            int Count { get; }
        }
    }

    CacheManager 管理类

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Hzb.Utils.Caching
    {
        public class CacheManager
        {
            private CacheManager()
            { }
    
            private static ICache cache = null;
    
            static CacheManager()
            {
                ////
    
                //可以创建不同的cache对象
                cache = (ICache)Activator.CreateInstance(typeof(MemoryCache));// 这里可以根据配置文件来选择
                //cache = (ICache)Activator.CreateInstance(typeof(CustomerCache));
            }
    
            #region ICache
    
            /// <summary>
            /// 获取缓存,假如缓存中没有,可以执行委托,委托结果,添加到缓存
            /// </summary>
            /// <typeparam name="T">类型</typeparam>
            /// <param name="key"></param>
            /// <param name="acquire">委托 为null会异常</param>
            /// <param name="cacheTime">缓存时间</param>
            /// <returns></returns>
            public static T Get<T>(string key, Func<T> acquire, int cacheTime = 600)
            {
                if (cache.Contains(key))
                {
                    return GetData<T>(key);
                }
                else
                {
                    T result = acquire.Invoke();//执行委托  获取委托结果   作为缓存值
                    cache.Add(key, result, cacheTime);
                    return result;
                }
            }
    
            /// <summary>
            /// 当前缓存数据项的个数
            /// </summary>
            public static int Count
            {
                get { return cache.Count; }
            }
    
            /// <summary>
            /// 如果缓存中已存在数据项键值,则返回true
            /// </summary>
            /// <param name="key">数据项键值</param>
            /// <returns>数据项是否存在</returns>
            public static bool Contains(string key)
            {
                return cache.Contains(key);
            }
    
            /// <summary>
            /// 获取缓存数据
            /// </summary>
            /// <param name="key"></param>
            /// <returns></returns>
            public static T GetData<T>(string key)
            {
                return cache.Get<T>(key);
            }
    
            /// <summary>
            /// 添加缓存数据。
            /// 如果另一个相同键值的数据已经存在,原数据项将被删除,新数据项被添加。
            /// </summary>
            /// <param name="key">缓存数据的键值</param>
            /// <param name="value">缓存的数据,可以为null值</param>
            public static void Add(string key, object value)
            {
                if (Contains(key))
                    cache.Remove(key);
                cache.Add(key, value);
            }
    
            /// <summary>
            /// 添加缓存数据。
            /// 如果另一个相同键值的数据已经存在,原数据项将被删除,新数据项被添加。
            /// </summary>
            /// <param name="key">缓存数据的键值</param>
            /// <param name="value">缓存的数据,可以为null值</param>
            /// <param name="expiratTime">缓存过期时间间隔(单位:秒) 默认时间600秒</param>
            public static void Add(string key, object value, int expiratTime = 600)
            {
                cache.Add(key, value, expiratTime);
            }
    
            /// <summary>
            /// 删除缓存数据项
            /// </summary>
            /// <param name="key"></param>
            public static void Remove(string key)
            {
                cache.Remove(key);
            }
    
            /// <summary>
            /// 删除所有缓存数据项
            /// </summary>
            public static void RemoveAll()
            {
                cache.RemoveAll();
            }
            #endregion
    
        }
    }

    asp.net 系统缓存封装

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    using System.Runtime.Caching;
    using System.Text.RegularExpressions;
    
    namespace Hzb.Utils.Caching
    {
        /// <summary>
        /// Represents a MemoryCacheCache
        /// </summary>
        public partial class MemoryCache : ICache
        {
            public MemoryCache() { }
    
            protected ObjectCache Cache
            {
                get
                {
                    return System.Runtime.Caching.MemoryCache.Default;
                }
            }
    
            /// <summary>
            /// Gets or sets the value associated with the specified key.
            /// </summary>
            /// <typeparam name="T">Type</typeparam>
            /// <param name="key">The key of the value to get.</param>
            /// <returns>The value associated with the specified key.</returns>
            public T Get<T>(string key)
            {
                if (Cache.Contains(key))
                {
                    return (T)Cache[key];
                }
    
                else
                {
                    return default(T);
                }
            }
    
            public object Get(string key)
            {
                //int iResult=  Get<Int16>("123");
    
                return Cache[key];
            }
    
            /// <summary>
            /// Adds the specified key and object to the cache.
            /// </summary>
            /// <param name="key">key</param>
            /// <param name="data">Data</param>
            /// <param name="cacheTime">Cache time(unit:minute) 默认30秒</param>
            public void Add(string key, object data, int cacheTime = 30)
            {
                if (data == null)
                    return;
    
                var policy = new CacheItemPolicy();
                policy.AbsoluteExpiration = DateTime.Now + TimeSpan.FromSeconds(cacheTime);
                Cache.Add(new CacheItem(key, data), policy);
            }
    
            /// <summary>
            /// Gets a value indicating whether the value associated with the specified key is cached
            /// </summary>
            /// <param name="key">key</param>
            /// <returns>Result</returns>
            public bool Contains(string key)
            {
                return Cache.Contains(key);
            }
    
            public int Count { get { return (int)(Cache.GetCount()); } }
    
    
            /// <summary>
            /// Removes the value with the specified key from the cache
            /// </summary>
            /// <param name="key">/key</param>
            public void Remove(string key)
            {
                Cache.Remove(key);
            }
    
            /// <summary>
            /// Removes items by pattern
            /// </summary>
            /// <param name="pattern">pattern</param>
            public void RemoveByPattern(string pattern)
            {
                var regex = new Regex(pattern, RegexOptions.Singleline | RegexOptions.Compiled | RegexOptions.IgnoreCase);
                var keysToRemove = new List<String>();
    
                foreach (var item in Cache)
                    if (regex.IsMatch(item.Key))
                        keysToRemove.Add(item.Key);
    
                foreach (string key in keysToRemove)
                {
                    Remove(key);
                }
            }
    
            /// <summary>
            /// 根据键值返回缓存数据
            /// </summary>
            /// <param name="key"></param>
            /// <returns></returns>
            public object this[string key]
            {
                get { return Cache.Get(key); }
                set { Add(key, value); }
            }
    
            /// <summary>
            /// Clear all cache data
            /// </summary>
            public void RemoveAll()
            {
                foreach (var item in Cache)
                    Remove(item.Key);
            }
        }
    }

    自定义缓存

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Hzb.Utils.Caching
    {
        /// <summary>
        /// 自定义缓存类
        /// </summary>
        public class CustomerCache : ICache
        {
            private static Dictionary<string, KeyValuePair<object, DateTime>> DATA = new Dictionary<string, KeyValuePair<object, DateTime>>();
    
            /// <summary>
            /// 获取缓存
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="key"></param>
            /// <returns></returns>
            public T Get<T>(string key)
            {
                if (!this.Contains(key))
                {
                    return default(T); //defalut t 是返回默认的T,比如引用就是返回null int返回0
                }
                else
                {
                    KeyValuePair<object, DateTime> keyValuePair = DATA[key];
                    if (keyValuePair.Value < DateTime.Now)//过期
                    {
                        this.Remove(key);
                        return default(T);
                    }
                    else
                    {
                        return (T)keyValuePair.Key;
                    }
                }
            }
    
            /// <summary>
            /// 添加缓存
            /// </summary>
            /// <param name="key"></param>
            /// <param name="data"></param>
            /// <param name="cacheTime">过期时间 默认30秒 </param>
            public void Add(string key, object data, int cacheTime = 30)
            {
                DATA.Add(key, new KeyValuePair<object, DateTime>(data, DateTime.Now.AddSeconds(cacheTime)));
    
               // DATA.Add(key, new KeyValuePair<object, DateTime>(data, DateTime.Now.AddMinutes(cacheTime)));
            }
    
            /// <summary>
            /// 判断包含
            /// </summary>
            /// <param name="key"></param>
            /// <returns></returns>
            public bool Contains(string key)
            {
                return DATA.ContainsKey(key);
            }
    
            /// <summary>
            /// 移除
            /// </summary>
            /// <param name="key"></param>
            public void Remove(string key)
            {
                DATA.Remove(key);
            }
    
            /// <summary>
            /// 全部删除
            /// </summary>
            public void RemoveAll()
            {
                DATA = new Dictionary<string, KeyValuePair<object, DateTime>>();
            }
    
            /// <summary>
            /// 获取
            /// </summary>
            /// <param name="key"></param>
            /// <returns></returns>
            public object this[string key]
            {
                get
                {
                    return this.Get<object>(key);
                }
                set
                {
                    this.Add(key, value);
                }
            }
    
            /// <summary>
            /// 数量
            /// </summary>
            public int Count
            {
                get
                {
                    return DATA.Count(d => d.Value.Value > DateTime.Now);
                }
            }
        }
    }

    调用代码 :拿用户登录做列子

    using Hzb.Model;
    using Hzb.Model.SysEnum;
    using Hzb.PC.Bll.Interface;
    using Hzb.Utils.Caching;
    using Hzb.Utils.Cookie;
    using Hzb.Utils.Regular;
    using Hzb.Utils.Secret;
    using Hzb.Utils.Session;
    using Microsoft.Practices.Unity;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    
    namespace Hzb.Web.Controllers
    {
        public class AccountController : Controller
        {
            private IBaseBLL<User> IUserBLL = null;
    
            /// <summary>
            /// 构造函数注入
            /// </summary>
            [InjectionConstructor]
            public AccountController(IBaseBLL<User> userBLL)
            {
                IUserBLL = userBLL;
            }
    
            /// <summary>
            /// 【视图】 登陆
            /// </summary>
            /// <returns></returns>
            [HttpGet]
            public ActionResult Login(string msg)
            {
                ViewData.Model = msg;
                return View();
            }
    
            /// <summary>
            /// 【处理程序】 登陆
            /// </summary>
            /// <returns></returns>
            [HttpPost]
            public ActionResult PoccLogin(string username, string password)
            {
                bool b = Validator.IsPhoneNumber(username);
    
                User model = null;
                if (b)
                {
                    model = IUserBLL.DBSet().Where(m => m.Account == username).FirstOrDefault();
                }
                else 
                {
                    int _id;
                    if (int.TryParse(username, out _id))
                    {
                         model = IUserBLL.DBSet().Where(m => m.Id == _id).FirstOrDefault();
                    }
                }
    
                if (model != null)
                {
                    password = "hzb_" + password + "_zhonghu";
    
                    if ((UserEnum)model.State == UserEnum.Normal)
                    {
                        if (model.Password == MD5Helper.MD5FromString(password))
                        {
                            //添加cookie值
                            CookieHelper.AddSingleValueCookie("key", model.Id.ToString(), DateTime.Now.AddHours(1));
                            //添加缓存
                            CacheManager.Add(model.Id.ToString(), model, 3600);
                            //获取session
                            string returntUrl = SessionHelper.GetSessionString("ReturntUrl");
                            if (!string.IsNullOrEmpty(returntUrl))
                            {
                                return Redirect(returntUrl);
                            }
                            else
                            {
                                UserTypeEnum type = (UserTypeEnum)model.Type;
                                switch (type)
                                {
                                    case UserTypeEnum.Owner:
                                        return RedirectToAction("Index", "Home", new { area = "User", id = model.Id });
                                    case UserTypeEnum.Company:
                                        return RedirectToAction("Index", "Home", new { area = "Company", id = model.Id });
                                    case UserTypeEnum.Designer:
                                        return RedirectToAction("Index", "Home", new { area = "Designer", id = model.Id });
                                    case UserTypeEnum.Manager:
                                        return RedirectToAction("Index", "Home", new { area = "Manager", id = model.Id });
                                    case UserTypeEnum.Supplier:
                                        return RedirectToAction("Index", "Home", new { area = "Supplier", id = model.Id });
                                    default:
                                        return RedirectToAction("CustomerError", "Shared", new { msg = "程序错误" });
                                }
                            }
                        }
                        else
                        {
                            return RedirectToAction("Login", new { msg = "密码错误" });
    
                        }
                    }
                    else
                    {
                        return RedirectToAction("Login", new { msg = "账号已删除" });
                    }
    
                }
                else
                {
                    return RedirectToAction("Login", new { msg = "账号不存在" });
                }
    
            }
    
            /// <summary>
            /// 【处理程序】 退出
            /// </summary>
            [HttpGet]
            public ActionResult Logout()
            {
                //获取cookie值
                string cookie_value = CookieHelper.GetSingleValueCookieValue("key");
    
                //清除缓存
                CacheManager.Remove(cookie_value);
    
                //清除cookie值
                CookieHelper.DelSingleValueCookie(cookie_value);
    
    
                return RedirectToAction("Login", "Account");
            }
        }
    }

    MVC检验登陆和权限的filter

    using Hzb.Model;
    using Hzb.Utils.Caching;
    using Hzb.Utils.Cookie;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    
    namespace Hzb.Web.Utility.Filter
    {
        /// <summary>
        /// 检验登陆和权限的filter
        /// </summary>
        [AttributeUsage(AttributeTargets.All, Inherited = true)]
        public class AuthorityFilter : AuthorizeAttribute
        {
            /// <summary>
            /// 检查用户登录
            /// </summary>
            /// <param name="filterContext"></param>
            public override void OnAuthorization(AuthorizationContext filterContext)
            {
                //获取cookie值
                string cookie_value = CookieHelper.GetSingleValueCookieValue("key");
                //获取缓存
                var cacheUser = CacheManager.GetData<User>(cookie_value);
    
                if (cacheUser == null) 
                {
                    HttpContext.Current.Session["ReturntUrl"] = filterContext.RequestContext.HttpContext.Request.RawUrl;
                    filterContext.Result = new RedirectResult("/Account/Login");
                    return;
                }
                else
                {
                    //清除缓存
                    CacheManager.Remove(cookie_value);
                    //重新添加缓存
                    CacheManager.Add(cookie_value, cacheUser, 3600);
                    return;
                }
            }
        }
    }

    特性AuthorityFilter验证是否登陆

    using Hzb.Model;
    using Hzb.Model.SysEnum;
    using Hzb.Model.ViewModel;
    using Hzb.PC.Bll.Interface;
    using Hzb.Utils.Caching;
    using Hzb.Utils.Cookie;
    using Hzb.Utils.Session;
    using Hzb.Web.Utility.Filter;
    using Microsoft.Practices.Unity;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    using HzbModel = Hzb.Model;
    
    namespace Hzb.Web.Areas.Company.Controllers
    {
    
        public class HomeController : Controller
        {
            private IUserManagerBll IUserManagerBll = null;
    
            /// <summary>
            /// 构造函数注入
            /// </summary>
            [InjectionConstructor]
            public HomeController(IUserManagerBll userManagerBll)
            {
                IUserManagerBll = userManagerBll;
            }
    
    
            /// <summary>
            /// 【视图】 首页
            /// </summary>
            /// <returns></returns>
            [AuthorityFilter]
            public ActionResult Index(int id = 0)
            {
                //获取cookie
                string cookie_value = CookieHelper.GetSingleValueCookieValue("key");
                //获取缓存
                var obj = CacheManager.GetData<HzbModel.User>(cookie_value);
                if (obj != null) 
                {
                    if (obj.Id == id)
                    {
                        ViewUser model = IUserManagerBll.GetViewUser(id);
                        ViewData.Model = model;
                        return View();
                    }
                    else 
                    {
                        return Redirect("/Account/Login");
                    }
                }
                else 
                {
                    return Redirect("/Account/Login");
                }
            }
    
            /// <summary>
            /// 部分视图【左侧菜单】
            /// </summary>
            /// <param name="id"></param>
            /// <returns></returns>
            public ActionResult Menu(int id)
            {
                ViewData.Model = id;
                return View();
            }
        }
    }

    转自:https://blog.csdn.net/u014742815/article/details/53095925

  • 相关阅读:
    机器学习入门:线性回归及梯度下降
    torch7入门(安装与使用)
    机器学习--详解人脸对齐算法SDM-LBF
    人脸对齐和应用
    如何使用Unity制作虚拟导览(一)
    fatal error C1083: Cannot open include file: 'qttreepropertybrowser.moc': No such file or directory
    在QTreeWidget中删除QTreeWidgetItem
    如何写一个简单的手写识别算法?
    面向对象编程的弊端是什么?
    神舟飞船上的计算机使用什么操作系统,为什么是自研发不是 Linux?
  • 原文地址:https://www.cnblogs.com/wangwust/p/9406671.html
Copyright © 2011-2022 走看看