2017-01-24 1 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メソッドを実装しています。ユーザーがページを変更して(別のタグをクリックして)、GCメソッドへのajax呼び出しと変数をクリアするとします。

ようにデータ変数が充填され、いくつかのフィルタリングを適用した場合、私の問題は、

である(いくつかの例:純粋なデータ変数は、3000の項目およびフィルタ結果が含まれている200の結果である)と、ページデータ変数に来て、別のユーザーが200個の項目が含まれています。しかし、ユーザーごとに新しいオブジェクトインスタンスを作成する必要があります。

答えて

0

このような統計情報を使用する場合は注意が必要です。 lock {}ステートメントまたはmutexを使用しない限り、いくつかの異なるスレッドがリストを一度に初期化または使用しようとする可能性があります。あなたが慎重でないならば、あなたは混乱で終わるでしょう。

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 

それの美しさがあること、あなたは、複数のサーバーで実行している場合、あなたのウェブサイトでは、同じデータを使用して、それらの間で同じデータをキャッシュすることができます。したがって、同じデータにアクセスする複数のスレッドの心配はすべてあなたのために処理されます。

希望します。

アダム。

+0

こんにちは。私の質問にお返事いただきありがとうございます。私はlock {}ステートメントを使用しようとしましたが、動作しないと思います。どのように私はロックステートメントを使用できますか?あなたは少しのサンプルを与えることができますか? 私はredisを試みましたが、私はredis働く原則を理解していません。 – Toygar

+0

こんにちは。一般的に、MVCの助けができれば、MVCの統計をはっきりと操る方がはるかに優れています。私は決して*それらを使用してはいけないが、他の方法を最初に探すことはできません。 Redisを使用している小さな例を含めるように元の回答を編集しました。最初にインストールする必要があることに注意してください。 –

+0

こんにちはアダム私はすでにredisのサンプルを共有していただきありがとうございます。しかし、私はどのように私のリストをレディスに保存できますか? redis.push(リストデータ)のように。 – Toygar