3月18号去一家**文学 公司面试,失败了,面试主要是问些大数据查询,缓存和分布式服务这些事情。因为平时不关注那些PV 千万级数据访问的事情(只是因为工作条件,不太适合去考虑这个问题)。
今天把关于用linq to sql 缓存的东西说下。
因为我一直跟web打交道,所以只说些web缓存常用的东西(三种方式),
1.页面缓存
2.页面参数缓存
3.数据表缓存
其实1和2,是一种类似的方式,只是是否带参数而已。
1,页面缓存(output caching)
在aspx页面加上<%@ OutputCache Duration="60" VaryByParam="none" %> 即可
这里Duration 是指缓存时间,我这里设置为60秒,VaryByParam是参数缓存说明,如果没有就设置为none。另外还有一个重要的参数DiskCacheable="true|false" 意思是要不要把缓存放到硬盘上,如果设为false则缓存数据会放到内存中。
2,页面参数缓存
前面说了VaryByParam是参数缓存说明,除了为none,还可以是*号(任何参数),还有一个具体的带参名,如:Default.aspx?p=1 这里是通过get方法传递参数的,如果这里VaryByParam=“p”,那么p就是缓存参数说明,以后只要p值改变,就会改变缓存里面的内容。
3,数据表缓存
数据表缓存才是要说的重点,如果数据量大,那么数据表缓存就会用到,我这里是用linq to sql 来连接数据库的,缓存的也是List<Table>,有些人喜欢用Ado.net,用dataview也是可以了,看个人喜好。
using System.Web.Caching; //引用数据缓存;
List<Usernamesview> li = new List<Usernamesview>(); //先创建一个list<table>;
protected void Page_Load(object sender, EventArgs e)
{if (!IsPostBack)
{
li=(List<Usernamesview>)Cache["ds"]; //ds cache缓存对象名;
if (li == null)
{
GridviewBingdingAsc();
}
else
{
GridView1.DataSource = li.ToList();
GridView1.DataBind();
}
}
}
private void GridviewBingdingAsc()
{
_100WTestNumberDataContext dc = new _100WTestNumberDataContext();
Table<Usernamesview> tu = dc.GetTable<Usernamesview>();
var s=(from sc in tu select sc).Take(15000).OrderBy(T=>T.Addres);
Cache.Insert("ds",s.ToList(),null,System.Web.Caching.Cache.NoAbsoluteExpiration,TimeSpan.FromSeconds(3));
GridView1.DataSource = s.ToList();
GridView1.DataBind();
dc.Connection.Close();
dc.Connection.Dispose();
}
这里说下Cache这个类, 这个类不仅仅用Insert,还有其他的方法,具体去查找msdn,我这里只说Insert这个方法,Insert包含几个参数,
Cache.Insert (String, Object, CacheDependency, DateTime, TimeSpan)
1是缓存的名称,2是缓存的数据对象,3是缓存键依赖项,通常为Null,4是过期时间,如果使用相对过期时间则设为NoAbsoluteExpiration,5是可调过期时间,
1:如果参数4使用了固定过期时间,参数5要设成NoSlidingExpiration。
如:Cache.Insert("ds", s.ToList(), null,DateTime.Now.AddMinutes(5) , System.Web.Caching.Cache.NoSlidingExpiration);
2:如果参数4是相对时间,
如:Cache.Insert("ds", s.ToList(), null, System.Web.Caching.Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(5));
那么他就把缓存相对延后,如,有人在3分20秒时访问数据库,那么应该在8分20秒后过期,但是有人在5分20秒时访问数据库,那么过期时间就延迟到10分20秒了。