質問
ServiceStack.redisを使用しています(最新のソースからのビルド: https://github.com/servicestack/servicestack.redis/tree/master/src).
私はこのようなことをします:
CacheRecord foundKey = cacheRecords.GetById(p_sParentKey);
...
CacheRecord cacheRecord = cacheRecords.Store(foundKey);
...
redisClient.Expire(p_sParentKey, validityPeriodInMinutes * 60);
使用をデバッグしようとしましたConsole.WriteLine(cacheRecords.GetTimeToLive(p_sParentKey));
戻ります -00:00:01
。有効性のペリオディンマインスに割り当てる価値は関係ありません。
私も試してみました Expire
, ExpireAt
, ExpireEntryAt
, ExpireEntryIn
. 。私もこのようなことを試しました:
int epoch = (int)(DateTime.UtcNow.AddSeconds(validityPeriodInMinutes) - new DateTime(1970, 1, 1)).TotalSeconds;
redisClient.ExpireAt(p_sParentKey, epoch);
何か案が?
[Serializable]
public class CacheRecord
{
public CacheRecord()
{
this.Children = new List<CacheRecordChild>();
}
public string Id { get; set; }
public List<CacheRecordChild> Children { get; set; }
}
#endregion
#region public class CacheRecordChild
[Serializable]
public class CacheRecordChild
{
public string Id { get; set; }
public string Data { get; set; }
}
public void AddKey(string p_sParentKey, string p_sChildKey, string p_sData, int validityPeriodInMinutes)
{
using (ServiceStack.Redis.RedisClient redisClient = new ServiceStack.Redis.RedisClient())
{
using (var cacheRecords = redisClient.GetTypedClient<CacheRecord>())
{
CacheRecord foundKey = cacheRecords.GetById(p_sParentKey);
if (foundKey == null)
{
foundKey = new CacheRecord();
foundKey.Id = p_sParentKey;
CacheRecordChild child = new CacheRecordChild();
child.Id = p_sChildKey;
child.Data = p_sData;
foundKey.Children.Add(child);
CacheRecord cacheRecord = cacheRecords.Store(foundKey);
//redisClient.Expire(p_sParentKey, validityPeriodInMinutes);
redisClient.Expire(p_sParentKey, validityPeriodInMinutes * 60);
}
else
{
CacheRecordChild child = new CacheRecordChild();
child.Id = p_sChildKey;
child.Data = p_sData;
foundKey.Children.Add(child);
CacheRecord cacheRecord = cacheRecords.Store(foundKey);
// redisClient.Expire(p_sParentKey, validityPeriodInMinutes);
// redisClient.Expire(p_sParentKey, validityPeriodInMinutes * 60);
// int epoch = (int)(DateTime.UtcNow.AddSeconds(validityPeriodInMinutes) - new DateTime(1970, 1, 1)).TotalSeconds;
redisClient.Expire(p_sParentKey, validityPeriodInMinutes * 60);
}
}
}
}
解決
申し訳ありませんが、あなたが間違っていることを知るためにあなたのコードを非常によく読むことはできません。
私は期限切れのためのかなりのテストをいくつか持っています、操作の有効期限はあります、以下はそれを使用する方法をよりよく示すかもしれません:
[Test]
public void Can_Expire()
{
Redis.SetEntry("key", "val");
Redis.Expire("key", 1);
Assert.That(Redis.ContainsKey("key"), Is.True);
Thread.Sleep(2000);
Assert.That(Redis.ContainsKey("key"), Is.False);
}
[Test]
public void Can_ExpireAt()
{
Redis.SetEntry("key", "val");
var unixNow = DateTime.Now.ToUnixTime();
var in1Sec = unixNow + 1;
Redis.ExpireAt("key", in1Sec);
Assert.That(Redis.ContainsKey("key"), Is.True);
Thread.Sleep(2000);
Assert.That(Redis.ContainsKey("key"), Is.False);
}
まだ問題が発生している場合は、実行可能なコードスニペットまたは要点を投稿してください。
編集:コードの例に回答します
タイプ化されたクライアントを使用すると、最終的にRedisに保存されるキーは次のように見えます。
'urn:CacheRecord:' + p_sParentKey
これは、例で使用しているものの違う鍵です。
redisClient.Expire(p_sParentKey, validityPeriodInMinutes * 60);
したがって、取得する方法はいくつかあります urnキー それはRedisで使用されています。エンティティをお持ちの場合は、Tourn()拡張法を使用できます。
var cacheKey = foundKey.ToUrn();
それ以外の場合は、「ID」を持っている場合、 urnキー お気に入り:
var cacheKey = IdUtils.CreateUrn<CacheRecord>(p_sParentKey);
そこからあなたはあなたのエントリを期限切れにすることができます:
redisClient.Expire(cacheKey, validityPeriodInMinutes * 60);
私はこれがどのように直感的ではないことを理解していますが、私は追加することを検討します redistypedclient.expiryin これを自動的に行う将来のバージョンの方法。これにより、次のようなことをする必要があります。
cacheRecords.ExpireIn(p_sParentKey, TimeSpan.FromMinutes(validityPeriodInMinutes));
編集:追加メソッドオーバーロード:
上記のメソッドをRedisクライアント(v2.07)の最新バージョン(v2.07)に追加しました。https://github.com/servicestack/servicestack.redis/downloads
ところで:Redisクライアントは実際には[Serializer]属性を必要としません。