2017-01-24 8 views
0

Я пытаюсь реализовать некоторый подход кэширования на моей странице MVC следующим образом.Кэширующий подход к статическим переменным и MVC

private static List<T> DATA = new List<T>() 

    public ActionResult Index() 
    { 
     if(DATA.Count()==0) 
      { 
      FillGlobalVaribles(); 
      } 
    } 

    public JsonResult GC() 
    { 
     DATA = new List<T>(); 
    } 

    private static FillGlobalVariables() 
    { 
     DATA = entityObject.foo.ToList(); 
    } 

    public JsonResult ListItems(string FilterString) 
    { 
     DATA.OrderBy(c=>c.ID).ToList(); 
    return Json(new {Result="OK",RecordSet = Data}); 
    } 

Я заполняю свою статическую переменную на моем методе индекса контроллера. И если пользователь сделает некоторые сортировки, некоторые фильтры будут применяться к переменной DATA.

И я реализую пользовательский метод GC, если пользователь меняет страницу (щелкните другой тег) ajax вызовите метод GC и очистите переменные.

Так что мой вопрос,

если переменная DATA была заполнены и применяются некоторые фильтрации (некоторые примеры: чистые переменные данные содержат 3000 элементов и результат фильтрации 200 результата), а другой пользователь пришел к переменной странице DATA содержит 200 пунктов , Но я хочу создать новые экземпляры объектов для каждого пользователя.

ответ

0

вам нужно быть осторожным, используя статику, подобную этой. Если вы не используете оператор lock {} или мьютекс, несколько разных потоков могут попытаться инициализировать или использовать ваш список одновременно. Если вы не будете осторожны, у вас будет беспорядок.

Посмотрите на Redis - это может предоставить вам то, что вам нужно - https://redis.io/.

Redis является кэш-памяти, которую можно использовать для хранения отдельных элементов и списков в Вот небольшой пример:.

using StackExchange.Redis; 

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 


namespace RedisTest 
{ 

    class Program 
    { 

     #region Diagnostics 

     static void w(string msg = "") 
     { 
      System.Console.WriteLine(msg); 
     } 

     static void w(string fmt, params object [] p) 
     { 
      string msg = string.Format(fmt, p); 
      w(msg); 
     } 

     #endregion Diagnostics 




     // 
     // Use of redis: 
     // 
     // https://github.com/StackExchange/StackExchange.Redis/blob/master/Docs/Basics.md 
     // https://redis.io/commands 
     // 


     static string string_key = "key_string"; 
     static string string_val = "Mary had a little lamb. She ate it."; 

     static string int_key = "key_int"; 
     static string int_val = "100"; 

     static string non_existent_key = "sdlfhsfhshdfhsdf"; 


     static void Main(string[] args) 
     { 
      ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost"); 
      w("Connected to Redis."); 
      w(); 

      IDatabase redis_db = redis.GetDatabase(); 

      // Storage and retrieval of a string 
      redis_db.StringSet(string_key, string_val); 
      var redis_val = redis_db.StringGet(string_key); 
      string sval = (string) redis_val; 
      w("String value retrieved: {0}", sval); 


      // Storage of an int; decrementing and incrementing it 
      redis_db.StringSet(int_key, int_val); 
      redis_db.StringDecrement(int_key, 15); 
      redis_val = redis_db.StringGet(int_key); 
      int iVal = (int)redis_val; 
      w("Int retrieved: {0}", iVal); 

      redis_db.StringIncrement(int_key, 55); 
      redis_val = redis_db.StringGet(int_key); 
      iVal = (int)redis_val; 
      w("Int retrieved: {0}", iVal); 


      // Retrieving a non-existent value 
      redis_val = redis_db.StringGet(non_existent_key); 
      if (redis_val.IsNull) 
      { 
       w("Null value retrieved."); 
      } 


      // Check for existence of a key 

      bool b = redis_db.KeyExists(int_key); 
      if (b) 
      { 
       w("Key {0} exists.", int_key); 
      } 

      b = redis_db.KeyExists(non_existent_key); 
      if (!b) 
      { 
       w("Key {0} does not exist.", int_key); 
      } 




      // Delete a key 
      redis_db.KeyDelete(string_key); 
      redis_db.KeyDelete(int_key); 

      // Delete all keys - only available from command line: https://redis.io/commands/flushdb 


      w(); 
      redis.Close(); 
      redis.Dispose(); 
      w("Disconnected from Redis."); 

      w(); 
      w("Hit RETURN to end."); 
      System.Console.ReadLine(); 
     } 

    } // class Program 

} // namespace RedisTest 

Красота этого является то, что если у вас есть более чем один сервер вашего веб-сайт те же данные могут быть кэшированы между всеми из них, используя его. Поэтому все заботы о том, чтобы несколько потоков обращались к тем же данным, обрабатываются для вас.

Надеюсь, что это поможет,

Adam.

+0

Hi. Спасибо, что ответили на мой вопрос. Я пробовал использовать функцию lock {}, но я думаю, что это не работает. Как я могу использовать оператор блокировки? Можете ли вы дать небольшой образец? Я пробовал redis, но я не понимаю принцип работы redis. – Toygar

+0

Hi Toygar. Как правило, вы намного лучше избегаете статики для MVC, если сможете это сделать. Я не могу сказать, что никогда не использовал их, но сначала должен искать другие способы. Я отредактировал свой первоначальный ответ, чтобы включить небольшой пример использования Redis - обратите внимание, что вы должны сначала установить его. –

+0

Привет, Adam, я уже знаю, что у него есть выбор для обмена. Но как я могу сохранить свой список на redis? Как redis.push (список данных); – Toygar

 Смежные вопросы

  • Нет связанных вопросов^_^