Как использовать эффективное кэширование в .NET? - PullRequest
0 голосов
/ 05 апреля 2011

Я пытаюсь использовать эффективное кэширование, но сталкиваюсь с проблемой. Например; У меня есть 5 пользователей, они использовали мое приложение. user1,2,3,4 только заполняет сетку поиском (кеширование запущено !!!). с другой стороны, user5 добавляет новую строку. я хочу обновить данные кэша при добавлении новой строки. Я прочитал Multi Threading, чтобы сделать это

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 ]

2 голосов
/ 05 апреля 2011

Я все еще не совсем уверен, что вы спрашиваете.Я думаю, это звучит так, будто вы пытаетесь сообщить кешу, когда его данные устарели.

В большинстве реализаций кэширования это встроено. По сути, вы можете удалить элемент кеша (обычно его удаляют изкеш), когда он был обновлен.

Например, если вы просто используете простое старое встроенное кэширование, которое поставляется с 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;
}

ОБНОВЛЕНИЕ Я обновил образец кода довернуть список строк, а не просто строку.Это должно сделать более очевидным, что происходит.

Чтобы повторить, вызов GetItems () возвращает список строк.Если этот список находится в кеше, возвращается кешированный список.В противном случае список извлекается и кэшируется / возвращается.

Метод AddItem явно удаляет список из кэша, вызывая запрос источника данных.

0 голосов
/ 05 апреля 2011

Не уверен, но вы ищете события? Вы можете настроить события в вашем механизме кэширования так, чтобы они запускались при обновлении.

Вот пример с гуглом

...