[REDIS] 레디 스 만료 작업을하지 않습니다
REDIS레디 스 만료 작업을하지 않습니다
나는 (: https://github.com/ServiceStack/ServiceStack.Redis/tree/master/src 최신 버전의 소스에서 빌드) ServiceStack.Redis를 사용합니다.
나는 같은 것을 할 :
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. 내가 validityPeriodInMinutes에 할당되는 값 문제가 나던.
나는 aswell, 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);
}
}
}
}
해결법
-
==============================
1.미안하지만 난 정말 당신이 잘못하고있는 일 경우 / 알기 위해 아주 잘 코드를 읽을 수 없습니다.
미안하지만 난 정말 당신이 잘못하고있는 일 경우 / 알기 위해 아주 잘 코드를 읽을 수 없습니다.
내가 ExpireAt 작업을 만료에 대한 공정한 몇 가지 검사가 여기에있는 다음과 같은 몇 가지가 더 잘 사용하는 방법을 보여 수 있습니다 :
https://github.com/ServiceStack/ServiceStack.Redis/blob/master/tests/ServiceStack.Redis.Tests/RedisClientTests.cs
[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); }
여전히 문제가 발생하는 경우 더 나은 코드를 읽을 수 있도록, 당신은 실행 가능한 코드 또는 요점을 게시하시기 바랍니다 수 있습니다.
편집 : 코드 예제에 응답
형식화 클라이언트를 사용하는 경우, 궁극적으로 레디 스에 저장된 가져옵니다 키는 다음과 같습니다
'urn:CacheRecord:' + p_sParentKey
어떤 당신이 당신의 예제에서 사용하는 것과 다른 키입니다 :
redisClient.Expire(p_sParentKey, validityPeriodInMinutes * 60);
그래서 레디 스에서 사용되는 항아리 키를 얻을 수있는 몇 가지 방법이있다. 당신은 실체가있는 경우는 ToUrn () 확장 방법을 사용할 수 있습니다, 예를 들어,
var cacheKey = foundKey.ToUrn();
그냥 '이드'가 그렇지 않은 경우에, 당신은 같은 항아리 키를 생성 할 수 있습니다 :
var cacheKey = IdUtils.CreateUrn<CacheRecord>(p_sParentKey);
거기에서 당신은 당신의 항목을 만료 할 수 있습니다 :
redisClient.Expire(cacheKey, validityPeriodInMinutes * 60);
나는이 직관적으로 이해가되지 않는다면 방법을 이해하지만, 그래서 나는 당신을 위해 자동으로 수행 할 미래의 버전에 RedisTypedClient.ExpiryIn 방법을 추가 찾을 것입니다. 이것은 다음과 같은 일을 할 수 있도록해야합니다 :
cacheRecords.ExpireIn(p_sParentKey, TimeSpan.FromMinutes(validityPeriodInMinutes));
편집 : 추가 방법 과부하 :
나는 당신이 여기에서 다운로드 할 수있는 레디 스 클라이언트 (v2.07)의 최신 버전에서 위의 방법을 추가했습니다 : https://github.com/ServiceStack/ServiceStack.Redis/downloads
당신의 CacheRecord를 사용하여 테스트를.
BTW 다음 레디 스 클라이언트 실제로 [시리얼] 속성을 필요로하지 않는다.
from https://stackoverflow.com/questions/5342609/redis-expire-does-not-work by cc-by-sa and MIT license
'REDIS' 카테고리의 다른 글
[REDIS] 센티넬로 Jedis 예 구함 [폐쇄] (0) | 2020.01.06 |
---|---|
[REDIS] 해야 내가 사용은 바이너리 많은 수의 파일을 저장하기 위해 레디 스? [닫은] (0) | 2020.01.06 |
[REDIS] PHP 애플리케이션에서 페이지 요청 데이터 로깅의 확장 방법은? (0) | 2020.01.06 |
[REDIS] --pipe를 사용하여 대량 가져 오기를 레디 스 (0) | 2020.01.06 |
[REDIS] Laravel 5.2 - 자신의 모든 장치에서 사용자를 로그 아웃하는 방법 (0) | 2020.01.06 |