ホームページ > バックエンド開発 > C#.Net チュートリアル > 高性能キャッシュシステム(Memcached)の導入事例

高性能キャッシュシステム(Memcached)の導入事例

零下一度
リリース: 2017-06-23 15:05:22
オリジナル
2114 人が閲覧しました

Memcached のエンティティ タイプはシリアル化せずに Memcached にキャッシュできないため、エンティティ クラスをキャッシュする前に処理する必要があります。

Memcached は、データベースを削減するための動的 Web アプリケーション用の高性能分散メモリ オブジェクト キャッシュ システムです。負荷。データとオブジェクトをメモリにキャッシュしてデータベースの読み取り回数を減らすことにより、動的なデータベース駆動型の Web サイトの速度が向上します。 Memcached は、キーと値のペアを格納するハッシュマップに基づいています。そのデーモンは C で書かれていますが、クライアントは任意の言語で書くことができ、memcached プロトコルを通じてデーモンと通信します。

Memcached を使用して文字列型や内部でシリアル化されたその他の型をキャッシュできますが、カスタム型の場合、Memcached はシリアル化されたデータのみをキャッシュできるため、Memcached にキャッシュすることはできません。したがって、ここではカスタム エンティティ タイプをシリアル化し、 Memcached に保存します。

まず、Windows プラットフォームで memcached をダウンロードし、インストールします。インストール後、cmd で dos コマンドを入力するか、[コンピューターの管理] -> [サービス] -> [memcached] -> [開始] でサービスを開始できます。

その後、関連情報をプロジェクトに導入できます。 dll:
Commons.dll、ICSharpCode.SharpZipLib.dll、log4net.dll、Memcached.ClientLibrary.dll
プロジェクト リファレンスに Memcached.ClientLibrary.dll を導入します

次に、プログラムを作成します。ここで MVC プログラムを作成します。
Models フォルダーにクラスを作成します:

[Serializable]
public class VIP
{
public string UserName { get; set; }

public int? Vip { get; set; }

public DateTime? VipEndDate { get; set; }

public string Mail { get; set; }

public string QQ { get; set; }
}
ログイン後にコピー

シリアル化可能としてマークされていない場合、後でプログラムを実行するときにエラーが報告されます。

次に、プログラミングを支援する MemcachedHelper クラスを作成します。

public class MemcachedHelper
{
public static MemcachedClient mclient;

static MemcachedHelper()
{
string[] serverlist = new string[] { "127.0.0.1:11211" };

SockIOPool pool = SockIOPool.GetInstance("First");
pool.SetServers(serverlist);
pool.Initialize();
mclient = new MemcachedClient();
mclient.PoolName = "First";
mclient.EnableCompression = false;
}

public static bool set(string key, object value, DateTime expiry)
{
return mclient.Set(key, value, expiry);
}

public static object Get(string key)
{
return mclient.Get(key);
}

}
ログイン後にコピー

最後に、コントローラーでの特定の実装:

public class EntityMemcachedController : Controller
    {
        //
        // GET: /EntityMemcached/
        /// <summary>
        /// 序列化实体类为字节数组,将其存储到Memcached中,以缓存数据,从而减轻访问压力....
        /// </summary>
        /// <returns></returns>
        public ActionResult Index()
        {
            var vipInfo = new List<VIP>{
                new VIP{ UserName="张三", Vip=1, QQ="3123456", Mail="3123456", VipEndDate=(DateTime?)DateTime.Now.AddDays(1) },
                new VIP{ UserName="李四", Vip=1, QQ="4123456", Mail="4123456", VipEndDate=(DateTime?)DateTime.Now.AddDays(2) },
                new VIP{ UserName="王五", Vip=1, QQ="5123456", Mail="5123456", VipEndDate=(DateTime?)DateTime.Now.AddDays(3) },
                new VIP{ UserName="赵六", Vip=1, QQ="6123456", Mail="6123456", VipEndDate=(DateTime?)DateTime.Now.AddDays(4) },
                new VIP{ UserName="刘七", Vip=1, QQ="7123456", Mail="7123456", VipEndDate=(DateTime?)DateTime.Now.AddDays(5) }
            };

            
            if (Request.Cookies["_EntityMemcached"] == null)
            {
                string sessionId = Guid.NewGuid().ToString();
                Response.Cookies["_EntityMemcached"].Value = sessionId;
                Response.Cookies["_EntityMemcached"].Expires = DateTime.Now.AddMinutes(1);//设置cookie过期时间

                MemcachedHelper.set(sessionId, vipInfo, DateTime.Now.AddMinutes(1));//设置缓存过期时间

                return Content("Memcached分布式缓存设置成功!!!");
            }
            else
            {
                string key = Request.Cookies["_EntityMemcached"].Value.ToString();

                object obj = MemcachedHelper.Get(key);
                List<VIP> info = obj as List<VIP>;

                if (info != null)
                {
                    return View(info);
                }

            }

            return Content("若显示则有&#39;bug&#39;");
        }
ログイン後にコピー

実装を確認します:

その後、終了して [Implement] をクリックします。 memcached 「もう一度キャッシュ」

キャッシュを 1 分以内に設定したので、このインターフェイスは常にこの 1 分以内になります。memcached はまだ優れていると言わざるを得ません。次に、OutputCached + Monogodb のキャッシュ戦略を検討します

以上が高性能キャッシュシステム(Memcached)の導入事例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート