2017-05-10 11 views
1

まず、ライブラリーへのリンクPutMany、GetManyC#ServiceStack.Redis SETALL期限切れに

問題は、私が多数のレコードを挿入したいときは、プットとは違って、有効期限を追加するオプションがありません。

コードが前方にかなりstreightです:

public void PutMany(ICollection<T> items) 
{ 
    TimeSpan expiration = GetExpiration(); 
    DateTime expire = DateTime.UtcNow.Add(expiration); 

    Dictionary<string, CachedItem<T>> dict = new Dictionary<string, CachedItem<T>>(); 
    foreach (T item in items) 
    { 
     CachedItem<T> cacheItem = new CachedItem<T>(item, expire); 

     if (!dict.ContainsKey(cacheItem.Id)) 
      dict.Add(cacheItem.Id, cacheItem); 
    } 

    // Store item in cache 
    _client.SetAll(dict); 
} 

モデルCachedItem<T>だけで、オブジェクトのいくつかの並べ替えとしてそれを想像して、私のものです。

ご覧のとおり、有効期限を設定するオプションはありません。 これを実現する方法はありますか(_client.Set()を使用して1で1を挿入する以外に)ですか?

TIA。

PS

私は私がすべてのレコードが間違って単一の有効期限を(持っていることをたくない、リストまたはハッシュ内のすべてのレコードを格納することができ、そしていつでも、彼らは非常に深刻なパフォーマンスの問題を引き起こす可能性があります知っています有効期限)

答えて

2

Redisにはset an expiry with a bulk insertを許可するコマンドがありません。また、Expire commandsのいずれも、複数のキーに有効期限を適用することはできません。

、有効期限を個別に各項目を設定し、あなたがqueue multiple SET commands in a Redis Transactionpipelineする必要がありますN + 1つの動作を避けるために例えば:

using (var trans = Redis.CreateTransaction()) 
{ 
    foreach (var entry in dict) 
    { 
     trans.QueueCommand(r => r.SetValue(entry.Key, entry.Value, expireIn)); 
    } 

    trans.Commit(); 
} 
ServiceStack.Redisはまだで複数のSET操作を送信します

bulk Redis transaction

+0

限り、その1つの要求は、大丈夫です。 –

+0

これはまだn + 1コマンドです。あなたはlua btwでも同じことができます。 – MichaC

+0

@MichaC ServiceStack.Redisは、すべてのコマンドを1回のネットワーク書き込みでバッチ処理するので、N + 1要求待ち時間はありません。 LUAはよりオーバーヘッドになります。 – mythz

関連する問題