如何在.NET中使用有效的缓存?

时间:2011-04-05 11:15:25

标签: c# .net visual-studio multithreading caching

我尝试使用有效的缓存,但我面临着一个问题。例如;我有5个用户他们使用我的应用程序。 user1,2,3,4只通过searcing填充网格(运行缓存!!!)。另一方面user5添加新行。我想在添加新行时刷新我的cach数据。我阅读多线程来做到这一点

code>using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Threading;
using System.Collections;

namespace WebApp.Caching.Threading
{
    public partial class _Default : System.Web.UI.Page
    {

        protected void Page_Init(object sender, EventArgs e)
        {

            FillCache();

        }
        void FillCache()
        {
            using (var myCtx = new DataClasses1DataContext())
            {
                if (!(FlyAntCache.Exists("test")))
                {
                    List<Table_1> toolStoreList = myCtx.Table_1s.ToList();
                    FlyAntCache.Add(toolStoreList, "test");
                }
            }
        }
        protected void Page_Load(object sender, EventArgs e)
        {

                WaitCallback method1 = new WaitCallback(ControlAllChanging);
                bool isQueued = ThreadPool.QueueUserWorkItem(method1, new ManualResetEvent(false));

        }

        protected void ControlAllChanging(object state)
        {
            if (FlyAntCache.Exists("test"))
            {
                using (var myCtx = new DataClasses1DataContext())
                {
                    List<Table_1> list;
                    list = myCtx.Table_1s.ToList();
                    List<Table_1> listCache = FlyAntCache.Get<List<Table_1>>("test");
                    bool IsIntersect = list.Except(listCache).Count() > 0;

                    if (IsIntersect)
                    {
                        FlyAntCache.Clear("test");
                        FillCache();
                    }

                }
            }
        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            // Search
            using (var  myCtx = new DataClasses1DataContext())
            {
                var Qry = myCtx.Table_1s.
                                  FromCache<Table_1>("test").
                                  AsQueryable().Where(t => t.ad == TextBox1.Text.Trim());
                GridView1.DataSource = Qry;
                GridView1.DataBind();
            }

        }
     }
}

我的场景:

请看:http://i53.tinypic.com/20pdc41.png enter image description here

我真的控制着另一个用户是否更改了我的数据,我必须刷新我的缓存。是否有任何敏感性CAPTURE任何新的更改更新新行保存。例如 : 1)我必须捕获新的更新。这种机制必须在发生变化时运行 2)我必须捕获新的保存。当新行添加

时,此机制必须运行

2 个答案:

答案 0 :(得分:2)

我仍然不太确定你在问什么。我最好的猜测是,听起来你正试图让缓存知道它的数据何时过时。

大多数缓存实现都内置了它。基本上,您可以在更新缓存项时使其缓存(通常是从缓存中删除)。

例如,如果您只是使用ASP.net附带的普通旧内置缓存:

private static Cache Cache;

public void AddItem(string data)
{
    //Do a database call to add the data

    //This will force clients to requery the source when GetItems is called again.
    Cache.Remove("test");  
}

public List<string> GetItems()
{
    //Attempt to get the data from cache
    List<string> data = Cache.Get("test") as string;

    //Check to see if we got it from cache
    if (data == null)
    {
        //We didn't get it from cache, so load it from 
        // wherever it comes from.
        data = "From database or something";

        //Put it in cache for the next user
        Cache["test"] = data;
    }

    return data;
}

UPDATE 我更新了代码示例以返回字符串列表而不仅仅是字符串。这应该使发生的事情变得更加明显。

重申一下,GetItems()调用检索字符串列表。如果该列表位于缓存中,则返回缓存列表。否则,将检索并缓存/返回列表。

AddItem方法显式地从缓存中删除列表,强制重新查询数据源。

答案 1 :(得分:0)

不确定但是你在寻找活动吗?您可以在缓存机制中设置事件,以便在发生更新时触发。

Here is a googled example