MVC 使用自定义缓存

MVC使用自定义缓存:首先我是在一个工具类库中新建一个缓存帮助类,比如这里我在Itcast.CMS.Common 类库中新建了一个CacheHelper.cs类

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web;

namespace Itcast.CMS.Common
{
    /// <summary>
    /// 缓存辅助类
    /// </summary>
    public class CacheHelper
    {
        //在类库中使用Caching,或者HttpRuntime都需要添加System.Web引用
        //private static System.Web.Caching.Cache Cache = System.Web.HttpContext.Current.Cache;

        //也可以用下面这句代码代替上面这句代码
        private static System.Web.Caching.Cache Cache = HttpRuntime.Cache;
        /// <summary>
        /// 设置数据缓存
        /// </summary>
        /// <param name="key">键</param>
        /// <param name="val">值</param>
        /// <returns></returns>
        public static object SetCache(string key, object val)
        {
            if (Cache[key] == null)
                Cache.Insert(key, val, null, DateTime.Now.AddDays(1), TimeSpan.Zero);
            return Cache[key];
        }
        /// <summary>
        /// 设置数据缓存
        /// </summary>
        /// <param name="key">键</param>
        /// <param name="val">值</param>
        /// <param name="minute">缓存的时间长度(单位:分钟)</param>
        /// <returns></returns>
        public static object SetCache(string key, object val, double minute)
        {
            if (Cache[key] == null)
                Cache.Insert(key, val, null, DateTime.Now.AddMinutes(minute), TimeSpan.Zero);
            return Cache[key];
        }
        /// <summary>
        ///  获取数据缓存
        /// </summary>
        /// <param name="key">键</param>
        /// <returns></returns>
        public static object GetCache(string key)
        {
            return Cache[key];
        }
        /// <summary>
        /// 移除指定数据缓存
        /// </summary>
        /// <param name="key">要移除缓存的键</param>
        public static void RemoveCache(string key)
        {
            if (Cache[key] != null)
                Cache.Remove(key);
        }
        /// <summary>
        /// 移除全部缓存
        /// </summary>
        public static void RemoveAllCache()
        {
            //Cache.GetEnumerator()方法是检索用于循环访问包含在缓存中的键设置及其值的字典枚举数。
            IDictionaryEnumerator CacheEnum = Cache.GetEnumerator();
            // MoveNext()方法是将枚举数推进到集合的下一个元素。
            while (CacheEnum.MoveNext())
            {
                Cache.Remove(CacheEnum.Key.ToString());
            }
        }
    }
}

在项目中的控制器的方法里直接使用缓存

HomeController.cs控制器

using Itcast.CMS.Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace Itcast.CMS.WebApp.Controllers
{
    public class HomeController : Controller
    {

        public ActionResult Index()
        {

            Itcast.CMS.BLL.T_UserInfoService userinfo = new BLL.T_UserInfoService();

            //如果key为“T_User_list”的这个缓存为空,我们就去数据库获取数据
            if (Itcast.CMS.Common.CacheHelper.GetCache("T_User_list") == null)
            {
                //从BLL层中要数据(BLL层又会去DAL层要数据,DAL会调用数据库获取数据)。
                List<T_UserInfo> list = userinfo.GetUserInfo();

                //将要过来的数据存入key为“T_User_list”的这个缓存中,设置过期时间为1分钟
                Itcast.CMS.Common.CacheHelper.SetCache("T_User_list", list, 1);
                return View(list);
            }
            else
            {
                //如果如果key为“T_User_list”的这个缓存里存在数据,那么就将缓存里的数据给Model
                return View(Itcast.CMS.Common.CacheHelper.GetCache("T_User_list"));
            }           

        }      

    }
}

当用户第一次访问我的时候,缓存是不存在的,那么就从数据库里查询数据,并数据保存到缓存里, 当用户第二次来访问我的时候,因为缓存已经存在了(前提,没有超过我们设置的过期时间)那么就直接从缓存里取得数据,给用户,这样就不必请求数据库了。

Home控制器下的Index视图

@model IEnumerable< Itcast.CMS.Model.T_UserInfo>
@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <div>
        <table>
            <tr><th>编号</th><th>网名</th><th>姓名</th><th>年龄</th><th>性别</th><th>电话</th><th>邮箱</th><th>地址</th><th>备注</th></tr>
            @foreach (var v in Model)
            {
                <tr><td>@v.Id</td><td>@v.UserName</td><td>@v.Name</td><td>@v.Age</td><td>@v.Gender</td><td>@v.Mobile</td><td>@v.Email</td><td>@v.Addres</td><td>@v.Remarks</td><td>@v.Id</td></tr>
            }
        </table>
    </div>
</body>
</html>

项目组成图:



时间: 2024-10-12 13:51:12

MVC 使用自定义缓存的相关文章

借鉴dubbo实现自定义缓存

自定义缓存一般基于ConcurrentMap实现,实现缓存需要注意的点是缓存容器对象 本身依赖于 static final去存储对象,样例: ConcurrentMap<String, GenericServiceCache> cacheHolder = new ConcurrentHashMap<String, GenericServiceCache>();.虚拟机会在内存加载时 有特殊的初始化,如果通过类似单例方式创建对象会导致需要同步,而同步在高并发下导致性能变差, 更好的缓

MVC路由自定义及视图找寻规则

这篇关于MVC路由及视图规则本来是昨天要发的,但是本人真的有点懒,终于今天忍无可忍了.初学MVC的时候比现在还菜一点(现在也很菜),想着会用就行,但是有时还是会好奇,为什么它能找到控制器?为什么控制器return View();就能找到视图,而为什么视图一定要建在Views文件下?好像说的有点多了,接下来一边上例子,一边分析! MVC路由自定义 相信对于MVC路由的配置大家也都了解过一些,其实,这也不是本章的重点. 创建MVC项目的时候,根目录下>>App_Start>>Route

Spring MVC JSON自定义类型转换(续)

前面提到了两种转换类型的方法(Spring MVC JSON自定义类型转换),这里针对Json转换提供一种更简便的方法. 通过配置全局的日期转换来避免使用麻烦的注解. 首先用到了一个简单的日期工具类DateUtil.java /** * DateUtil类 * * @author liuzh */ public class DateUtil { public static final String Y_M_D = "yyyy-MM-dd"; public static final St

asp.net mvc输出自定义404等错误页面,非302跳转。

朋友问到一个问题,如何输出自定义错误页面,不使用302跳转.当前页面地址不能改变. 还要执行一些代码等,生成一些错误信息,方便用户提交反馈. 500错误,mvc框架已经有现成解决方法: filters.Add(new HandleErrorAttribute()); 404错误目前想到的解决方法: 先上代码 Global.asax: 1 protected void Application_Error(object sender, EventArgs e) 2 { 3 var ex = Serv

自定义缓存Memcache 以及Cache

*****缓存存储配置项(读缓存和appsetting配直节点的问题 )***** MemCache经常用于数据不用经常改动的数据 不用每次都去数据库中读取,可以防止在系统的缓存中,缓存在内存中读取速度快,但是memcache(是可以分布的缓存)没有保存机制,服务器挂掉,memcache丢失 系统的配置节放在了appsettings配置节下  <add key=”mingzi” value=”assas” /> ConfigurationManager.appsetting[“mingzi”]

[转]MVC之 自定义过滤器(Filter)

本文转自:http://www.cnblogs.com/kissdodog/archive/2013/01/21/2869298.html 一.自定义Filter 自定义Filter需要继承ActionFilterAttribute抽象类,重写其中需要的方法,来看下ActionFilterAttribute类的方法签名. //表示所有操作-筛选器特性的基类. [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inh

【.net 深呼吸】自定义缓存配置(非Web项目)

在前一篇烂文中,老周简单讲述了非Web应用的缓存技术的基本用法.其实嘛,使用系统默认方案已经满足我们的需求了,不过,如果你真想自己来配置缓存,也是可以的. 缓存的自定义配置可以有两种方案,一种是用代码在应用程序中配置,即实例化MemoryCache对象时,可以向构造函数传递一个NameValueCollection实例,数据结构就是key-value形式,这些配置项的名字其实就是MemoryCacheElement类的以下三个属性:CacheMemoryLimitMegabytes.Physic

.net mvc中的缓存

今天我们聊一聊在.net mvc中的缓存是什么以及如何来实现缓存? 1.首先我们看一看什么缓存? 缓存就是数据交换的缓冲区(称作Cache),当某一硬件要读取数据时,会首先从缓存中查找需要的数据,如果找到了则直接执行,找不到的话则从内存中找.由于缓存的运行速度比内存快得多,故缓存的作用就是帮助硬件更快地运行.这里是指在电脑中的缓存,那么我们在看看在程序的中的缓存的是什么定义? 在程序中的缓存指的就是:客户端在第一次向服务器请求的数据的时候,服务器会根据客户端的请求来响应客户端所需要的数据,并同时

转:【译】Asp.net MVC 利用自定义RouteHandler来防止图片盗链

[译]Asp.net MVC 利用自定义RouteHandler来防止图片盗链 你曾经注意过在你服务器请求日志中多了很多对图片资源的请求吗?这可能是有人在他们的网站中盗链了你的图片所致,这会占用你的服务器带宽.下面这种方法可以告诉你如何在ASP.NET MVC中实现一个自定义RouteHandler来防止其他人盗链你的图片. 首先,我们来回顾一下当一个请求发往ASP.net MVC站点时的情景,IIS收到请求并将请求转到ASP.net,然后根据URL,或者更确切来说:被请求文件的扩展名.在IIS