본문 바로가기

   
Programming/ASP.NET(4.0)

ASP.NET Cache란?

반응형

ASP.NET Cache란?

캐시(Cache)

  - 웹서버측의 임시 메모리 공간

  - 용도 : 서버의 효율성


1. 출력 캐시(Output Cache)

 메모리일부에 임시페이지를 빼놓는다. 임시페이지를 잠시 저장해놓은 공간을 캐쉬라한다. 반응속도가 최상!!!!!!이다.

 인터넷이 좀느릴땐 캐시페이지를 정리만 해도 속도가 많이 향상된다.

 - 사용자가 페이지를 요청했을때 서버에서 만든 임시페이지를 저장해 놓았다가 다음번 동일한 페이지를 요청할때 페이지 처리 단계를 거치지 않고 미리 저장해놓은 임시페이지를 돌려줌으로써 응답 속도와 자원 관리 등 여러가지 잇점을 취하는 기술


데이터베이스를 사용하게되면 100명이 오면 100명에 것을 데이터베이스를 가져와야 하지만 캐쉬를 사용하면 첫번째 사용만 들어오게 되면 나머지 사람들은 속도가 빠른 것을 볼수 있다.

 - 단, 내용이 변화가 없는 페이지에 한해서...

 - 짧은 시간에 내용이 자주 변화는 페이지는 캐시를 사용했을때 실시간 데이터 갱신이 불가능하기 때문에... 사용 자제..

 - 되도록 동시 접속이 짧은 시간내에 많은 경우에 사용..

 - 접속 간격이 길거나 동시 요청 수가 적은 경우에는 효과가 없다.

 - 페이지 요청시 num이라는 매개변수가 get / post 방식으로 전송이 되면.. 임시 페이지를 별도로 관리

2. 영역 캐시(Control Cache)

 - 사용자 정의 컨트롤이 반드시 따라온다.

 - 출력 캐시와 유사한 방법

 - 페이지 전체를 재사용하는것이 아니라 페이지의 일부만을 재사용

 - ascx 페이지를 캐싱


3. 데이터 캐시(Data Cache)

 - 1, 2번과 다른 성격의 캐시

 - Application 변수와 유사 : 공용 : 전역

 - Application + 몇가지 기능 = 데이터 캐시


a. Lock, Unlock 불필요(자동으로 처리)

b. 만료 시간 지정 가능(특정 시간이 되면 데이터가 스스로 소멸)

c. 조건에 따라서 강제로 데이터 소멸(종속성)

d. 서버 메모리가 꽉차면 자동으로 오래된 캐시부터 소멸

e. 저장된 데이터 캐시가 소멸되는 순간 이벤트 발생 -> 콜백함수(CallBack)



여러번 눌러도 시간이 다되지 않을때까지 메모리에 값만 읽어온다.

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Ex72_Cache.aspx.cs" Inherits="Ex72_Cache" %>

<%--출력캐쉬를 쓰겠습니다.~--%>

<%--30초 이후 요청하게되면 단계를 거치지 않고 임시저장해 놓은 캐시를 보낸다.--%>

<%@ OutputCache VaryByParam="none" Duration="30" %>

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

 

<html xmlns="http://www.w3.org/1999/xhtml">

<head runat="server">

    <title></title>

</head>

<body>

    <form id="form1" runat="server">

    <div>

   

       <h2>

                    Ex72_Cache.aspx</h2>

             <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>

             <br />

             <br />

             <asp:Button ID="Button1" runat="server" Text="포스트백용" Width="92px" />

             <br />

             <br />

             <br />

             <asp:Label ID="Label2" runat="server" Text="Label"></asp:Label>

             <br />

             <br />

             <asp:Button ID="Button2" runat="server" onclick="Button2_Click" Text="Button"

                    Width="92px" />

             <br />

             <br />

             <br />

             <br />

             <br />

   

    </div>

    </form>

</body>

</html>

 



using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;

 

public partial class Ex72_Cache : System.Web.UI.Page

{

    protected void Page_Load(object sender, EventArgs e)

    {

             Label1.Text = DateTime.Now.ToString();

    }

       protected void Button2_Click(object sender, EventArgs e)

       {

             Label2.Text = DateTime.Now.ToString();

       }

}

 



현재 캐쉬가 막고있어 데이터베이스상 인서트한값이 안보여진다. 시간이 지나면 첫유저가 다시 디비의 값을 셀렉트함.

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Ex73_Cache.aspx.cs" Inherits="Ex73_Cache" %>

<%@ OutputCache Duration="60" VaryByParam="none" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

 

<html xmlns="http://www.w3.org/1999/xhtml">

<head runat="server">

    <title></title>

</head>

<body>

    <form id="form1" runat="server">

    <div>

   

       <br />

             <br />

             <br />

             <asp:DataGrid ID="DataGrid1" runat="server" DataSourceID="SqlDataSource2">

             </asp:DataGrid>

             <asp:SqlDataSource ID="SqlDataSource2" runat="server"

                    ConnectionString="<%$ ConnectionStrings:ADONETConStrConnectionString %>"

                    SelectCommand="SELECT * FROM [tblAddress]"></asp:SqlDataSource>

             <asp:SqlDataSource ID="SqlDataSource1" runat="server"

                    ConnectionString="<%$ ConnectionStrings:pubsConnectionString %>"

                    SelectCommand="SELECT * FROM [titles]"></asp:SqlDataSource>

             <br />

             <br />

   

    </div>

    </form>

</body>

</html>

 

 




페이지 주소에 get 방식에서 num=1 or num=2 에 따라 Cache 에 저장된 값이 다르게 인식된다.


<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Ex74_Cache.aspx.cs" Inherits="Ex74_Cache" %>

<%@ OutputCache Duration="30" VaryByParam="num" %>

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

 

<html xmlns="http://www.w3.org/1999/xhtml">

<head runat="server">

    <title></title>

</head>

<body>

    <form id="form1" runat="server">

    <div>

   

       <h2>

                    Ex74_Cache.aspx</h2>

             <h2>

                    <br />

                    <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>

             </h2>

             &nbsp; aspx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2:30:30 A.aspx<br />

             &nbsp;aspx?num=1 -&gt;&nbsp; 2:30:40 B.aspx<br />

             &nbsp;aspx?num=2 -&gt;&nbsp; 2:30:50 C.aspx<br />

             &nbsp;aspx?num=1 -&gt;&nbsp; 2:30:40 B.aspx<br />

             <br />

             <asp:Button ID="Button1" runat="server" Text="포스트백" Width="152px" />

             <br />

             <br />

   

    </div>

    </form>

</body>

</html>

 

 


using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;

 

public partial class Ex74_Cache : System.Web.UI.Page

{

    protected void Page_Load(object sender, EventArgs e)

    {

             Label1.Text = DateTime.Now.ToString();

    }

}

 






price로 입력받은 값을 조회시에 지정해놓은 Cache 시간 만큼 유지후 다시 db를 들른다.


<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Ex75_Cache.aspx.cs" Inherits="Ex75_Cache" %>

<%@ OutputCache Duration="60" VaryByParam="TextBox1" %>

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

 

<html xmlns="http://www.w3.org/1999/xhtml">

<head runat="server">

    <title></title>

</head>

<body>

    <form id="form1" runat="server">

    <div>

   

       <h2>

                    Ex75_Cache.aspx</h2>

             <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>

&nbsp;<asp:Button ID="Button1" runat="server" Text="Button" />

             <br />

             <br />

             <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"

                    BackColor="White" BorderColor="#E7E7FF" BorderStyle="None" BorderWidth="1px"

                    CellPadding="3" DataKeyNames="title_id" DataSourceID="SqlDataSource1"

                    GridLines="Horizontal">

                    <AlternatingRowStyle BackColor="#F7F7F7" />

                    <Columns>

                           <asp:BoundField DataField="title_id" HeaderText="title_id" ReadOnly="True"

                                 SortExpression="title_id" />

                           <asp:BoundField DataField="title" HeaderText="title" SortExpression="title" />

                           <asp:BoundField DataField="type" HeaderText="type" SortExpression="type" />

                           <asp:BoundField DataField="price" HeaderText="price" SortExpression="price" />

                           <asp:BoundField DataField="pubdate" HeaderText="pubdate"

                                 SortExpression="pubdate" />

                    </Columns>

                    <FooterStyle BackColor="#B5C7DE" ForeColor="#4A3C8C" />

                    <HeaderStyle BackColor="#4A3C8C" Font-Bold="True" ForeColor="#F7F7F7" />

                    <PagerStyle BackColor="#E7E7FF" ForeColor="#4A3C8C" HorizontalAlign="Right" />

                    <RowStyle BackColor="#E7E7FF" ForeColor="#4A3C8C" />

                    <SelectedRowStyle BackColor="#738A9C" Font-Bold="True" ForeColor="#F7F7F7" />

                    <SortedAscendingCellStyle BackColor="#F4F4FD" />

                    <SortedAscendingHeaderStyle BackColor="#5A4C9D" />

                    <SortedDescendingCellStyle BackColor="#D8D8F0" />

                    <SortedDescendingHeaderStyle BackColor="#3E3277" />

             </asp:GridView>

             <asp:SqlDataSource ID="SqlDataSource1" runat="server"

                    ConnectionString="<%$ ConnectionStrings:pubsConnectionString %>"

                    SelectCommand="SELECT [title_id], [title], [type], [price], [pubdate] FROM [titles] WHERE ([price] &gt;= @price)">

                    <SelectParameters>

                           <asp:ControlParameter ControlID="TextBox1" DefaultValue="0" Name="price"

                                 PropertyName="Text" Type="Decimal" />

                    </SelectParameters>

              </asp:SqlDataSource>

             <br />

             <br />

             20 -&gt; B<br />

             5 -&gt; C<br />

             10 -&gt; D<br />

             24 -&gt; B<br />

             <br />

   

    </div>

    </form>

</body>

</html>

 






<%@ Control Language="C#" AutoEventWireup="true" CodeFile="Ex_76.ascx.cs" Inherits="Ex_76" %>

<%@ OutputCache Duration="30" VaryByParam="none" %>

<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>

 

 

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;

 

public partial class Ex_76 : System.Web.UI.UserControl

{

    protected void Page_Load(object sender, EventArgs e)

    {

             Label1.Text = DateTime.Now.ToString();

    }

}

 

 

 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Ex76_ControlCache.aspx.cs" Inherits="Ex76_ControlCache" %>

 

<%@ Register src="Ex_76.ascx" tagname="Ex_76" tagprefix="uc1" %>

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

 

<html xmlns="http://www.w3.org/1999/xhtml">

<head runat="server">

    <title></title>

</head>

<body>

    <form id="form1" runat="server">

    <div>

   

       <h2>

                    Ex76_ControlCache.aspx</h2>

             <strong>난유저컨트롤에서왔다.</strong><br />

             <uc1:Ex_76 ID="Ex_761" runat="server" />

             <br />

             <br />

             <strong> aspx에서 왔지..</strong><br />

             <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>

             <br />

             <br />

   

    </div>

    </form>

</body>

</html>

 




using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;

 

public partial class Ex76_ControlCache : System.Web.UI.Page

{

    protected void Page_Load(object sender, EventArgs e)

    {

             Label1.Text = DateTime.Now.ToString();

    }

}

 

 







Check

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Ex77_Check.aspx.cs" Inherits="Ex77_Check" %>

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

 

<html xmlns="http://www.w3.org/1999/xhtml">

<head runat="server">

    <title></title>

</head>

<body>

    <form id="form1" runat="server">

    <div>

   

       <h2>

                    Ex77_Check.aspx<br />

                    <br />

                    <br />

                    <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>

             </h2>

             <br />

             <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" />

             <br />

             <br />

             <br />

   

    </div>

    </form>

</body>

</html>

 




using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;

 

public partial class Ex77_Check : System.Web.UI.Page

{

    protected void Page_Load(object sender, EventArgs e)

    {

             if (Cache["time"] != null)

             {

                    DateTime time = (DateTime)Cache["time"];

                    Label1.Text = time.ToString();

             }

             else

             {

                    Label1.Text = "캐시 없음!!";

             }

    }

       protected void Button1_Click(object sender, EventArgs e)

       {

             //데이터 캐시 삭제 - 조건, 만료시간에 상관없이 즉시 삭제

             Cache.Remove("time");

       }

}

 


 

DataCache

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Ex77_DataCache.aspx.cs" Inherits="Ex77_DataCache" %>

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

 

<html xmlns="http://www.w3.org/1999/xhtml">

<head runat="server">

    <title></title>

</head>

<body>

    <form id="form1" runat="server">

    <div>

   

       <h2>

                    Ex77_DataCache.aspx</h2>

             <h2>

                    &nbsp;</h2>

             <h2>

                    <asp:Button ID="Button1" runat="server" Text="Button" Width="191px" />

                    <br />

             </h2>

             <br />

             <br />

   

    </div>

    </form>

</body>

</html>

 


using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.Caching;//** 데이터 캐시

using System.IO;

 

public partial class Ex77_DataCache : System.Web.UI.Page

{

       protected void Page_Load(object sender, EventArgs e)

       {

             //데이터 캐시(데이터를 저장하는 임시 공간)

             // - Application와 유사

             // - 상태유지 가능(페이지 객체의 생성,소멸 관계X)

 

             //Cache["num"] = 100;

 

             //Label1.Text = Cache["num"].ToString();

 

 

             //캐시 생성

             //Cache["num"] = 100;

             //Cache.Add("num", 100);//기존에 num이 존재하면 무시

             //Cache.Insert("num", 100);//기존에 num이 존재하면 덮어쓰기

 

             //1. 만료 시간 지정

             // - 상대시간 vs 절대시간

             //Cache.Insert("time", DateTime.Now, null, DateTime.Now.AddSeconds(30), TimeSpan.Zero);

 

             //Cache.Insert("time", DateTime.Now, null, Cache.NoAbsoluteExpiration, TimeSpan.FromSeconds(30));

 

 

             //2. 종속성

             // - 특정 파일(디렉터리, 다른 캐시)과 종속성 맺음

             // - 해당 종속성 맺은 객체가 수정/삭제가 발생되면 캐시를 자동으로 소멸

 

             //

             //CacheDependency dep = new CacheDependency(@"C:\test.txt");

             //Cache.Insert("time", DateTime.Now, dep);

             //Cache.Insert("txt", "홍길동", dep);

 

             //Cache["txt"] -> 홍길동 -> 소멸

 

 

 

             //3. 우선 순위

             //Cache.Insert("time", DateTime.Now, null, DateTime.Now.AddSeconds(30), TimeSpan.Zero, CacheItemPriority.Normal, null);

 

 

             //4. 콜백 함수

             CacheItemRemovedCallback callback = new CacheItemRemovedCallback(Check);

 

             Cache.Insert("time", DateTime.Now, null, DateTime.Now.AddSeconds(30), TimeSpan.Zero, CacheItemPriority.Normal, callback);

       }

 

       private void Check(string key, object value, CacheItemRemovedReason reason)

       {

             //"time" 가 소멸될때..

             StreamWriter writer = new StreamWriter(Server.MapPath("cache.log"), true);//Append

 

             writer.WriteLine("{0} Callback 함수가 호출됨.", DateTime.Now.ToString());

             writer.WriteLine("\t : " + key);

             writer.WriteLine("\t : " + value);

             writer.WriteLine("\t이유 : " + reason);

 

             writer.WriteLine();

             writer.Close();

       }

}

 



 

반응형