キャッシュ編~第7回Redisメソッド署名によるデータセットキャッシュ(制御可能更新,分散型データキャッシュ)を実現

17651 ワード

ディレクトリに戻る
この文章は第6回マイクロソフトPractices.EnterpriseLibrary.Cachingはメソッド署名に基づくデータセットキャッシュ(制御可能更新,WEB側データキャッシュ)を実現するの続編と言えるが、実際にはEnterpriseLibraryがある.Cachingもキャッシュの持続化を実現する方法の一つにすぎないが、Redisは成熟した分散型ストレージミドルウェアとして、このデータセットキャッシュ機能を実現することはより適切であり、大規模なウェブサイトの設計規則をより満たしている.(マルチウェブサーバの場合(ウェブ側で負荷等化、逆エージェントを実現)、EnterpriseLibrary.Cachingは何もしていないように見えますが、この場合、分散キャッシュが活躍し、キャッシュサーバをサードパーティサーバに簡単に配備でき、上記の問題を解決できます)
1つの標準、多種の実現、オブジェクト向けの真の意味:多態性、もしあなたが私にインタフェースが何の役に立つかと聞いたら、この文章はあなたに答えを教えてあげることができます:異なる場合によって、異なる持続化の方式を使ってデータを保存します.
次はキャッシュ標準インタフェースICacheProviderです
 /// <summary>
    //////           
    /// </summary>
    public interface ICacheProvider
    {
        #region Methods
        /// <summary>
        ////// </summary>
        /// <param name="key">     ,                 。</param>
        /// <param name="valKey">      ,                      。</param>
        /// <param name="value"></param>
        void Add(string key, string valKey, object value);
        /// <summary>
        ////// </summary>
        /// <param name="key">     ,                 。</param>
        /// <param name="valKey">      ,                      。</param>
        /// <param name="value"></param>
        void Put(string key, string valKey, object value);
        /// <summary>
        ////// </summary>
        /// <param name="key">     ,                 。</param>
        /// <param name="valKey">      ,                      。</param>
        /// <returns></returns>
        object Get(string key, string valKey);
        /// <summary>
        ////// </summary>
        /// <param name="key">     ,                 。</param>
        void Remove(string key);
        /// <summary>
        ///     <see cref="Boolean"/> ,                 。
        /// </summary>
        /// <param name="key"></param>
        /// <returns>      ,   true,    false。</returns>
        bool Exists(string key);
        /// <summary>
        ///     <see cref="Boolean"/> ,                      。
        /// </summary>
        /// <param name="key"></param>
        /// <param name="valKey"></param>
        /// <returns>      ,   true,    false。</returns>
        bool Exists(string key, string valKey);
        #endregion
    }

今回はRedisを用いて永続化を実現する方法として、互換性のためにDictionaryタイプをDictionaryタイプに変更したRedisCacheProviderコードを見てみましょう.この設計は多くのエラーを回避します.データが送信されるとシーケンス化され、互換性があることを知っています.
セキュリティ、パフォーマンスなどの最適な方法がバイナリなので、データを格納するために使用します.
    /// <summary>
    ///  redis         
    /// </summary>
    internal class RedisCacheProvider : ICacheProvider, IDisposable
    {
        private readonly IRedisClient _cacheManager = Redis.Client.RedisManager.GetClient();
        static byte[] Serialize(object data)
        {
            BinaryFormatter formatter = new BinaryFormatter();
            MemoryStream rems = new MemoryStream();
            formatter.Serialize(rems, data);
            return rems.GetBuffer();
        }
        static object Deserialize(byte[] data)
        {
            BinaryFormatter formatter = new BinaryFormatter();
            MemoryStream rems = new MemoryStream(data);
            data = null;
            return formatter.Deserialize(rems);
        }
        public void Add(string key, string valKey, object value)
        {
            byte[] byteValue = Serialize(value);
            using (var tbl = _cacheManager.GetTypedClient<Dictionary<string, byte[]>>())
            {
                Dictionary<string, byte[]> dict = null;
                if (tbl.ContainsKey(key))
                {
                    dict = (Dictionary<string, byte[]>)tbl.Lists[key][0];
                    dict[valKey] = byteValue;

                }
                else
                {
                    dict = new Dictionary<string, byte[]>();
                    dict.Add(valKey, byteValue);
                }
                Remove(key);
                tbl.Lists[key].Add(dict);
            }

        }

        public void Put(string key, string valKey, object value)
        {
            Add(key, valKey, value);
        }

        public object Get(string key, string valKey)
        {
            using (var tbl = _cacheManager.GetTypedClient<Dictionary<string, byte[]>>())
            {
                if (tbl.ContainsKey(key))
                {
                    Dictionary<string, byte[]> dict = (Dictionary<string, byte[]>)tbl.Lists[key][0];
                    if (dict != null && dict.ContainsKey(valKey))
                        return Deserialize(dict[valKey]);
                    else
                        return null;
                }
            }
            return null;

        }

        public void Remove(string key)
        {
            using (var tbl = _cacheManager.GetTypedClient<Dictionary<string, byte[]>>())
            {
                tbl.Lists[key].RemoveAll();
            }
        }

        public bool Exists(string key)
        {
            using (var tbl = _cacheManager.GetTypedClient<Dictionary<string, byte[]>>())
            {
                return tbl.ContainsKey(key);
            }
        }

        public bool Exists(string key, string valKey)
        {
            using (var tbl = _cacheManager.GetTypedClient<Dictionary<string, byte[]>>())
            {
                return tbl.ContainsKey(key) &&
                 ((System.Collections.Generic.Dictionary<string, byte[]>)tbl.Lists[key][0]).ContainsKey(valKey);
            }
        }

        public void Dispose()
        {
            _cacheManager.Dispose();
        }
    }

実際、ここまで書くと、私たちのredis方法の署名ストレージが完成し、前の文章と協力して、あなたは自分のキャッシュシステムを設計することができます.
の、完全な機能の実現はすべてinternalを修飾子として使って、外部に対して隠します.
ディレクトリに戻る