缓存:前端页面缓存、服务器缓存(依赖SQL)MVC3
缓存依赖数据库
第一步
1通过vs里面带的命令提示窗口。
2或者.NET Framework 版本 4(64 位系统)条件,%windir%\Microsoft.NET\Framework64\v4.0.30319目录下找到aspnet_regsql.exe, 执行下面cmd命令
aspnet_regsql -S .\LK -E -ed -d CommunicationPlatformByLK -et -t UserInfor
-S 服务器,-E windows认证方式 -ed -d缓存的数据库 -et -t缓存的数据表。
如果你想查为起的缓存表起名,或者改变认证方式等要求,查一查。毕竟咱们做的是例子。
这样命令之后,在缓存的数据库中会建立一个数据表,具有触发功能。

第二步
配置文件:注意第一个连接节点是EF帮我们生成的,用这个是不行的,第二个是我手动加上的,用这个才行。所以用ef或者其他的朋友注意这点。
<connectionStrings>
<add name="ModelContainer" connectionString="metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;provider=System.Data.SqlClient;provider connection string="data source=LIKE-PC\LK;initial catalog=CommunicationPlatformByLK;user id=sa;password=sa;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
<add name="CommunicationPlatformByLK" connectionString="data source=.\LK;Integrated Security=SSPI;
initial catalog=CommunicationPlatformByLK;" />
</connectionStrings>
system.web>
<caching>
<sqlCacheDependency enabled="true" >
<databases>
<add name="Test" connectionStringName="CommunicationPlatformByLK" pollTime="" />
//name随便起,后面的connectStringName是新添加连接字符串的键名,500以ms为单位,采用的轮询机制,程勋每0.5s问检测数据库是否发上变化
</databases>
</sqlCacheDependency>
</caching>
第三步
记得SqlDependency里面的值是,配置文件的值=name:起缓存的数据表名
[OutputCache(Duration = 60, SqlDependency = "Test:UserInfor",Location=System.Web.UI.OutputCacheLocation.ServerAndClient)]
public ActionResult GetAllUserInfos()
{
int pageIndex = int.Parse(Request["page"]);
int pageSize = int.Parse(Request["rows"]);
int rowcount = 0;
IQueryable<UserInfor> pageEntityList = userInforService.SelectPageEntityList<int>(u => u.ID, u => u.ID > 0, pageIndex, pageSize, false, out rowcount);
var result = new { total = rowcount, rows = pageEntityList };
return Json(result, JsonRequestBehavior.AllowGet); }
注意:理解:既然有的polltime,为什么打的标签还有duration参数。
答案:在duration时间内,只要数据库表没有变化,会一直读取服务器缓存(不会执行action方法体),但是只要数据库发生变化,并且保证polltime已经到了,duration时间就不起作用了。
所以我们一般蛇者polltime很小,设置duration很长。
有人说duration没什么用,去掉不行吗?答案是不行的~~因为duration是必须的参数。虽然没什么主要用途。
页面缓存
注意1
前台读取客户端缓存,用get,非post。因为get请求方式参数不变的情况下,默认会读取浏览器缓存。但post方式不会如此。
注意2
OutputCache的参数有默认值,location默认客户端和服务端都有,varyby..默认根据参数。
VaryByHeader = "User-Agent"换浏览器读取数据库,VaryByParam = "a"随便定义一个参数,就防止随着参数值变化而变化。
注意3
google显示正确,读取客户端缓存,但是ie firefox并没有。但是服务器缓存都是正常读取的。
读取服务器缓存本质:(当第一次请求执行一个action,会执行里面的方法体,在duration时间内,多次请求这个action,不再执行里面的方法体,而直接从服务器端的缓存发来)
在controller或者action上面写上[OutputCache(Duration=20....)],因为controller有很多action,如果单在controller上面写,所有action都会建立对应的页面的缓存,并一定适用,所以一般用到哪一个action,就在上面打上此标签便可。
那实际开发中的项目写一个例子。
action
1 [OutputCache(Duration = 60)]
2 public ActionResult GetAllUserInfos()
3 {
4 int pageIndex = int.Parse(Request["page"]);
5 int pageSize = int.Parse(Request["rows"]);
6 int rowcount = 0;
7 IQueryable<UserInfor> pageEntityList = userInforService.SelectPageEntityList<int>(u => u.ID, u => u.ID > 0, pageIndex, pageSize, false, out rowcount);
8 var result = new { total = rowcount, rows = pageEntityList };
9 return Json(result, JsonRequestBehavior.AllowGet);
10 }
前台easyui:注意一定是get方式,非post方式。因为get请求方式参数不变的情况下,默认会读取浏览器缓存。但post方式不会如此。
function initGrid() {
$('#tt').datagrid({
url: '/UserInfor/GetAllUserInfos',
title: '演示表格使用',
width: 900,
method:'get',
height: 400,
//*****省略

google response
IE

IE response

IE 响应正文

google显示304而ie显示200,其余cache-control 都有max-age(服务器的剩余缓存时间),都有从数据库的缓存中返回数据。
确定的是,ie和google都在duration时间内,action的代码不会被执行。google返回304,读取了客户端缓存,但是服务器缓存返回了数据。
ie返回200,没有读取客户端缓存(是没在客户端形成缓存吗?)。也返回了服务器缓存。
按照网上资料,在action中添加Response.Cache.SetOmitVaryStar(true);,最终结果没卵用。有毛病这是.
google变成了200,但是action代码在duration时间内不会执行里面方法体。也返回了数据。但是max-age一直是服务器的缓存时间,木有减少等变化。

ie
ie也是200,也返回了服务器缓存数据,action方法体没执行,没有读取客户端缓存(还是没有创建客户端缓存?)

就将就依靠服务器缓存来做缓存吧。
缓存:前端页面缓存、服务器缓存(依赖SQL)MVC3的更多相关文章
- 强制JSP页面刷新,防止被服务器缓存(可用于静态include强制刷新)
对于jsp页面,为了防止页面被服务器缓存.始终返回同样的结果. 通常的做法是在客户端的url后面加上一个变化的参数,比如加一个当前时间. 我现在使用的方法是在jsp头部添加以下代码: <% ...
- Django缓存机制以及使用redis缓存数据库
目录 Django 配置缓存机制 缓存系统工作原理 Django settings 中 默认cache 缓存配置 利用文件系统来缓存 使用Memcache来缓存: 使用Local-memory来缓存: ...
- ASP.NET MVC3系列页面缓存、缓存依赖SQL(真实项目注意细节)
缓存依赖数据库 第一步 1通过vs里面带的命令提示窗口. 2或者.NET Framework 版本 4(64 位系统)条件,%windir%\Microsoft.NET\Framework64\v4. ...
- [Asp.net]缓存之页面缓存,控件缓存,缓存依赖
写在前面 上篇文章介绍了缓存的基本概念及用途,另外也举了一个简单的例子,数据缓存(将一些耗费时间的数据加入到一个对象缓存集合中,以键值的方式存储.可以通过使用Cache.Insert()方法来设置缓存 ...
- Nginx针对前端静态资源的缓存处理
当用户上报一个线上的bug后,开发者修改前端代码的bug上新后,用户反映问题依旧存在的问题...这种情况是不是曾经遇到过,这个问题跟浏览器的缓存机制有很大关系(强制缓存和协商缓存,这里我就不介绍具体的 ...
- .Net Core 跨平台开发实战-服务器缓存:本地缓存、分布式缓存、自定义缓存
.Net Core 跨平台开发实战-服务器缓存:本地缓存.分布式缓存.自定义缓存 1.概述 系统性能优化的第一步就是使用缓存!什么是缓存?缓存是一种效果,就是把数据结果存在某个介质中,下次直接重用.根 ...
- 前端学HTTP之缓存
前面的话 Web缓存是可以自动保存常见文档副本的HTTP设备.当Web请求抵达缓存时,如果本地有“已缓存的”副本,就可以从本地存储设备而不是原始服务器中提取这个文档.本文将详细介绍缓存的相关内容 功能 ...
- 基于Html5缓存的页面P2P技术可行性探讨
P2P技术,在分享大文件(你懂的)是现在必不可缺的技术,现在的人,已经很难想象在没有这玩意的互联网早期,人们是怎样的艰难求生.想当年,不要说电影,下一个稍大点的文件,都是很吃力的事情. 后来牛人科恩, ...
- HTTP 笔记与总结(7)HTTP 缓存(配合 Apache 服务器)
在网络上,有一些缓存服务器,另外浏览器自身也有缓存功能. 例如: <!DOCTYPE html> <html lang="en"> <head> ...
随机推荐
- python selenium Chrome模拟手机浏览器(十七)
在做移动端页面测试时可以利用Chrome mobile emulation 辅助完成页面的适配问题,但是目前手机市场上的型号居多我们也没有办法通过人工的模式一一的去适配,所以这里考虑到通过自动化的模式 ...
- LOJ 2550 「JSOI2018」机器人——找规律+DP
题目:https://loj.ac/problem/2550 只会写20分的搜索…… #include<cstdio> #include<cstring> #include&l ...
- 在SAS数据步中执行过程步的简单示例
SAS中的许多过程步都是封装好的,而且SAS的编程特点决定了只能是DATA步执行完之后再执行PROC步,或者PROC步执行完之后再执行DATA步.因此有时候DATA步只能利用PROC步执行完之后的结果 ...
- redis订阅发布消息操作本地缓存
Redis 本地缓存+远程缓存方案 使用纯java的ehcache作为本地缓存 Reids 作为远程分布式缓存 解决redis缓存压力过大,提高缓存速度,以及缓存性能. Redis和ehcache缓存 ...
- 重置SQLSERVER表的自增列,让自增列重新计数
SQL的自增列挺好用,只是开发过程中一旦删除数据,标识列就不连续了 写起来 也很郁闷,所以查阅了一下标识列重置的方法 发现可以分为三种: --- 删除原表数据,并重置自增列truncate table ...
- 更新 TeX Live 软件包
这个 TeX Live 软件,你得时常更新一下,不然会遇到一些由软件包自身 Bug 导致的编译问题.比如,这次我使用 Beamer 软件包写演示文稿,就遇到问题了,结果发现是软件包自身存在的问题.安装 ...
- Azkaban实战,Command类型单一job示例,任务中执行外部shell脚本,Command类型多job工作flow,HDFS操作任务,MapReduce任务,HIVE任务
本文转载自:https://blog.csdn.net/tototuzuoquan/article/details/73251616 1.Azkaban实战 Azkaba内置的任务类型支持comman ...
- gridview使用小知识
1.列改变为select,不能使用gridview.SelectedRow.Cells[0].Text 2.事件执行顺序 RowCommandPageIndexChangingPageIndexCha ...
- 操作系统实现线程的几种模式 和 java创建线程的3个方式
操作系统实现线程的几种模式 和 java创建线程的3个方式 这是两个概念 在操作系统中,线程可以实现在用户模式下,也可以实现在内核模式下,也可以两者结合实现. 1.实现线程的三种方式: (1)继承t ...
- Intellij IDEA超好用的快捷键
1.首推 Ctrl+Shift+Enter,自动跳出括号,在行尾添加分号,并自动回车. 2.Ctrl+Shift+J,将多行代码折叠成一行. 当你遇到的时候,这个快捷键非常实用.比如你在写painle ...