MVC缓存,使用数据层缓存,添加或修改时让缓存失效
在"MVC缓存01,运用控制器缓存或数据层缓存"中,在数据层中可以设置缓存的有用时刻。但这个还不够"智能",常常期望在修改或创立的时分使缓存失效,加载新的数据。
□ 思路
1、缓存是以键值<string, object="">寄存的,在创立缓存的时分,先把IDictionary<int,t>作为缓存内容存储,int为T的主键。
2、EF上下文保留的时分时分把改变保留到数据库,并更新缓存中的内容。
● 先找出上下文中状况为added或modified的实体:var changeobjects
● 把改变保留数据到数据库:context.SaveChanges()
● 依据缓存key获取类型为IDictionary<int,t>的缓存内容:var cacheData = Cache.Get("vehicles") as Dictionary<int, vehicle="">;
● 最终遍历这些改变的实体,更新缓存项:cacheData[vehicle.Id] = vehicle;
□ 缓存接口
public interface ICacheProvider
{
object Get(string key);
void Set(string key, object data, int cacheTime);
bool IsSet(string key);
void Invalidate(string key);
}
□ 缓存接口完成
环绕using System.Runtime.Caching的MemoryCache.Default回来类型为ObjectCache的缓存特点完成缓存接口:获取缓存项、设置缓存、判别是不是设置缓存、清空缓存。
using System;
using System.Runtime.Caching;
namespace MvcApplication1.Cache
{
public class DefaultCacheProvider : ICacheProvider
{
private ObjectCache Cache
{
get { return MemoryCache.Default; }
}
public object Get(string key)
{
return Cache[key];
}
public void Set(string key, object data, int cacheTime)
{
CacheItemPolicy policy = new CacheItemPolicy();
policy.AbsoluteExpiration = DateTime.Now + TimeSpan.FromMinutes(cacheTime);
Cache.Add(new CacheItem(key, data), policy);
}
public bool IsSet(string key)
{
return (Cache[key] != null);
}
public void Invalidate(string key)
{
Cache.Remove(key);
}
}
}
□ Model
public partial class Vehicle
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
}
□ 对于Vehicle的Repositoy接口:
using System.Collections.Generic;
using MvcApplication1.Models;
namespace MvcApplication1.Repository
{
public interface IVehicleRepository
{
void ClearCache();
IEnumerableGetVehicles();
void Insert(Vehicle vehicle);
void Update(Vehicle vehicle);
void SaveChanges();
}
}
□ 对于Vehicle的Repositoy接口完成:
using System.Collections.Generic;
using System.Data;
using System.Data.Entity.Infrastructure;
using System.Linq;
using MvcApplication1.Cache;
using MvcApplication1.Models;
namespace MvcApplication1.Repository
{
public class VehicleRepository : IVehicleRepository
{
protected DemoEntities DataContext { get; private set; }
public ICacheProvider Cache { get; set; }
public VehicleRepository() : this(new DefaultCacheProvider())
{
}
public VehicleRepository(ICacheProvider cacheProvider)
{
this.DataContext = new DemoEntities();
this.Cache = cacheProvider;
}
public void ClearCache()
{
Cache.Invalidate("vehicles");
}
public System.Collections.Generic.IEnumerable GetVehicles()
{
var vehicles = Cache.Get("vehicles") as IDictionary<int, Vehicle>;
if (vehicles == null)
{
vehicles = DataContext.Vehicle.ToDictionary(v => v.Id);
if (vehicles.Any())
{
Cache.Set("vehicles",vehicles,30);
}
}
return vehicles.Values;
}
public void Update(Vehicle vehicle)
{
if (vehicle != null)
{
DataContext.Set().Attach(vehicle);
DataContext.Entry(vehicle).State = EntityState.Modified;
}
}
public void Insert(Vehicle vehicle)
{
DataContext.Set().Add(vehicle);
}
public void SaveChanges()
{
//获取上下文中EntityState状况为added或modified的Vehicle
var changeobjects = DataContext.ChangeTracker.Entries();
//把改变保留到数据库
DataContext.SaveChanges();
//更新缓存中有关的Vehicle
var cacheData = Cache.Get("vehicles") as Dictionary<int, Vehicle>;
if (cacheData != null)
{
foreach (var item in changeobjects)
{
var vehicle = item.Entity as Vehicle;
cacheData[vehicle.Id] = vehicle;
}
}
}
}
}
在保留缓存Cache.Set("vehicles",vehicles,30)之前,把从上下文获取到的数据转换成IDictionary<int,t>类型vehicles = DataContext.Vehicle.ToDictionary(v => v.Id);
□ HomeController
using System.Linq;
using System.Web;
using System.Web.Mvc;
using MvcApplication1.Models;
using MvcApplication1.Repository;
namespace MvcApplication1.Controllers
{
public class HomeController : Controller
{
public IVehicleRepository Repository { get; set; }
public HomeController(IVehicleRepository repository)
{
this.Repository = repository;
}
public HomeController() : this(new VehicleRepository())
{
}
public ActionResult Index()
{
return View(Repository.GetVehicles());
}
[HttpPost]
public ActionResult Index(FormCollection form)
{
Repository.ClearCache();
return RedirectToAction("Index");
}
public ActionResult Edit(int id)
{
var vehicle = Repository.GetVehicles().Single(v => v.Id == id);
return View(vehicle);
}
[HttpPost]
public ActionResult Edit(Vehicle vehicle)
{
Repository.Update(vehicle);
Repository.SaveChanges();
return RedirectToAction("Index");
}
public ActionResult Create()
{
return View(new Vehicle());
}
[HttpPost]
public ActionResult Create(Vehicle vehicle)
{
Repository.Insert(vehicle);
Repository.SaveChanges();
return RedirectToAction("Index");
}
}
}
□ Home/Index.cshtml
@model IEnumerable
@{
ViewBag.Title = "Index";
Layout = "~/Views/Shared/_Layout.cshtml";
}
"0" cellspacing="0" border="0">
@foreach (var vehicle in Model)
{
}
| 编号 | 车型 | 报价 | |
|---|---|---|---|
| @vehicle.Id.ToString() | @vehicle.Name | @string.Format("{0:c}",vehicle.Price) |
@Html.ActionLink("修改", "Edit", new { id=vehicle.Id })
|
@using (Html.BeginForm())
{
"submit" value="使缓存失效从头获取数据库数据" id="InvalidButton" name="InvalidButton"/>
}
@Html.ActionLink("创立", "Create")
□ Home/Create.cshtml
@model MvcApplication1.Models.Vehicle @{ ViewBag.Title = "Create"; Layout = "~/Views/Shared/_Layout.cshtml"; }
Create
@using (Html.BeginForm()) { @Html.ValidationSummary(true)Vehicle
value="Create" />
} @section Scripts { @Scripts.Render("~/bundles/jqueryval") }
□ Home/Edit.cshtml
@model MvcApplication1.Models.Vehicle @{ ViewBag.Title = "Edit"; Layout = "~/Views/Shared/_Layout.cshtml"; }
Edit
@using (Html.BeginForm()) { @Html.ValidationSummary(true)Vehicle@Html.HiddenFor(model => model.Id)
value="Save" />
} @section Scripts { @Scripts.Render("~/bundles/jqueryval") }
□ 成果:
创立或修改之前: 
修改更新: 
创立: 
修改创立成功后: 
MVC缓存,使用数据层缓存,添加或修改时让缓存失效的更多相关文章
- MVC缓存02,使用数据层缓存,添加或修改时让缓存失效
在"MVC缓存01,使用控制器缓存或数据层缓存"中,在数据层中可以设置缓存的有效时间.但这个还不够"智能",常常希望在编辑或创建的时候使缓存失效,加载新的数据. ...
- MVC缓存01,使用控制器缓存或数据层缓存
对一些浏览频次多.数据量大的数据,使用缓存会比较好,而对一些浏览频次低,或内容因用户不同的,不太适合使用缓存. 在控制器层面,MVC为我们提供了OutputCacheAttribute特性:在数据 ...
- XML中 添加或修改时 xmlns="" 怎么删除
//创建节点时 记得加上 ---> xmldoc.DocumentElement.NamespaceURI XmlElement url = xmldoc.CreateElement(&quo ...
- [NewLife.XCode]数据层缓存(网站性能翻10倍)
NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netcore,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示例代码和 ...
- [开源]OSharpNS 步步为营系列 - 2. 添加业务数据层
什么是OSharp OSharpNS全称OSharp Framework with .NetStandard2.0,是一个基于.NetStandard2.0开发的一个.NetCore快速开发框架.这个 ...
- Caffe实现多标签输入,添加数据层(data layer)
因为之前遇到了sequence learning问题(CRNN),里面涉及到一张图对应多个标签.Caffe源码本身是不支持多类标签数据的输入的. 如果之前习惯调用脚本create_imagenet.s ...
- 程序与CPU,内核,寄存器,缓存,RAM,ROM、总线、Cache line缓存行的作用和他们之间的联系?
目录 缓存 什么是缓存 L1.L2.L3 为什么要设置那么多缓存.缓存在cup内还是cup外 MESI协议----主流的处理缓存和主存数据不一样问题 Cache line是什么已经 对编程中数组的影响 ...
- 给AFNetworking添加请求缓存功能实现在没有网络的情况下返回缓存数据
原理:先给NSURLSession地Configuration设置一个内存和本地代理,原来的网络请求结束后会查找缓存的代理字典,并执行代理对象对应的操作方法,需要做的就是拦截错误的方法,返回缓存的数据 ...
- SpringBoot整合Redis、mybatis实战,封装RedisUtils工具类,redis缓存mybatis数据 附源码
创建SpringBoot项目 在线创建方式 网址:https://start.spring.io/ 然后创建Controller.Mapper.Service包 SpringBoot整合Redis 引 ...
随机推荐
- 使用reuseport和recvmmsg优化UDP服务器
http://skoo.me/system/2014/03/18/udp-server-performance/ http://www.helplib.net/s/linux.die/65_3223/ ...
- 在JNI中新开线程遇到问题
08-03 13:39:30.535 1663-20490/system_process E/RfidReaderService﹕ input RDID CARD ID g_data: ...
- 利用if else判断几点是什么时间段
static void Main(string[] args) { while (true) { int a; ...
- 避免由于Windows Update自动安装安全补丁导致VM意外重启
最近我们遇到一些客户报告他们的Windows VM被意外重启导致了其服务中断,我们查看了Event Log发现这个重启的操作时由于Windows update自动安装了安全补丁导致的重启操作.默 ...
- 使用SQL Server 2014内存数据库时需要注意的地方
作者 王枫发布于2014年7月4日 本文从产品设计和架构角度分享了Microsoft内存数据库方面的使用经验,希望你在阅读本文之后能够了解这些新的对象.概念,从而更好地设计你的架构. 内存数据库,指的 ...
- Sharepoint 2010 之 WebPart
转:http://blog.csdn.net/bestbadgod/article/details/6895542 Sharepoint系列的博客,都是我个人自学过程中的点滴的积累,毕竟没做过C#及A ...
- 数学(数论)BZOJ 3309:DZY Loves Math
Description 对于正整数n,定义f(n)为n所含质因子的最大幂指数.例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007)=1, f(1)=0. 给定正整数a,b, ...
- web调试工具
Fiddler是最强大最好用的Web调试工具之一,它能记录所有客户端和服务器的http和https请求,允许你监视,设置断点,甚至修改输入输出数据. 使用Fiddler无论对开发还是测试来说,都有很大 ...
- 推荐一款自己的软件作品[豆约翰博客备份专家],新浪博客,QQ空间,CSDN,cnblogs博客备份,导出CHM,PDF(转载)
推荐一款自己的软件作品[豆约翰博客备份专 豆约翰博客备份专家是完全免费,功能强大的博客备份工具,博客电子书(PDF,CHM和TXT)生成工具,博文离线浏览工具,软件界面美观大方,支持多个主流博客网站( ...
- JavaScript高级程序设计32.pdf
样式 在HTML中定义样式的方式有3种:通过<link/>元素包含外部样式表文件.使用<style/>元素定义嵌入式样式,以及使用style特性定义针对特定元素的样式,“DOM ...