복붙노트

[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. ==============================

    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 다음 레디 스 클라이언트 실제로 [시리얼] 속성을 필요로하지 않는다.

  2. from https://stackoverflow.com/questions/5342609/redis-expire-does-not-work by cc-by-sa and MIT license