キャッシュ編~第7回Redisメソッド署名によるデータセットキャッシュ(制御可能更新,分散型データキャッシュ)を実現
17651 ワード
ディレクトリに戻る
この文章は第6回マイクロソフトPractices.EnterpriseLibrary.Cachingはメソッド署名に基づくデータセットキャッシュ(制御可能更新,WEB側データキャッシュ)を実現するの続編と言えるが、実際にはEnterpriseLibraryがある.Cachingもキャッシュの持続化を実現する方法の一つにすぎないが、Redisは成熟した分散型ストレージミドルウェアとして、このデータセットキャッシュ機能を実現することはより適切であり、大規模なウェブサイトの設計規則をより満たしている.(マルチウェブサーバの場合(ウェブ側で負荷等化、逆エージェントを実現)、EnterpriseLibrary.Cachingは何もしていないように見えますが、この場合、分散キャッシュが活躍し、キャッシュサーバをサードパーティサーバに簡単に配備でき、上記の問題を解決できます)
1つの標準、多種の実現、オブジェクト向けの真の意味:多態性、もしあなたが私にインタフェースが何の役に立つかと聞いたら、この文章はあなたに答えを教えてあげることができます:異なる場合によって、異なる持続化の方式を使ってデータを保存します.
次はキャッシュ標準インタフェースICacheProviderです
今回はRedisを用いて永続化を実現する方法として、互換性のためにDictionaryタイプをDictionaryタイプに変更したRedisCacheProviderコードを見てみましょう.この設計は多くのエラーを回避します.データが送信されるとシーケンス化され、互換性があることを知っています.
セキュリティ、パフォーマンスなどの最適な方法がバイナリなので、データを格納するために使用します.
実際、ここまで書くと、私たちのredis方法の署名ストレージが完成し、前の文章と協力して、あなたは自分のキャッシュシステムを設計することができます.
の、完全な機能の実現はすべてinternalを修飾子として使って、外部に対して隠します.
ディレクトリに戻る
この文章は第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
セキュリティ、パフォーマンスなどの最適な方法がバイナリなので、データを格納するために使用します.
/// <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を修飾子として使って、外部に対して隠します.
ディレクトリに戻る