복붙노트

[REDIS] 서비스 스택 레디 스 목록 업데이트

REDIS

서비스 스택 레디 스 목록 업데이트

IRedisList를 업데이트하는 올바른 방법이 있나요? 아래의 샘플 코드와 함께, 나는 피자를, 목록을 제거 업데이트 할 수정할 수 있습니다 다시 추가 목록을하지만 잘못 느낀다. 명령 줄 문서는 꽤 thourough이지만, 내가 생각보다 훨씬 더 큰 프로젝트의 나는 완전히 확실 찾고 어디서부터 시작해야 아니에요.

    public void UpdatePizza(Pizza pizza)
    {
        using (var redisClient = new RedisClient(Host, Port))
        {
            IRedisTypedClient<Pizza> redis = redisClient.As<Pizza>();

            IRedisList<Pizza> pizzas = redis.Lists["pizzas:live"];

            var toUpdate = pizzas.First(x => x.Id == pizza.Id);

            toUpdate.State = pizza.State;

            //??How to save 
        }                   
    }

해결법

  1. ==============================

    1.불행하게도 레디 스리스트는 정말이 상황에서 좋은 선택이 아니다. 내가 레디 스를 사용하기 시작했을 때이 같은 문제가 있었다, 그들은 당연한 선택처럼 보인다). 그냥 팝업 푸시 있지만 목록의 중간에있는 항목을 수정하기위한하려는 경우 나, 읽기 전용 세트로 사용하는 경우 레디 스 목록 유용합니다.

    불행하게도 레디 스리스트는 정말이 상황에서 좋은 선택이 아니다. 내가 레디 스를 사용하기 시작했을 때이 같은 문제가 있었다, 그들은 당연한 선택처럼 보인다). 그냥 팝업 푸시 있지만 목록의 중간에있는 항목을 수정하기위한하려는 경우 나, 읽기 전용 세트로 사용하는 경우 레디 스 목록 유용합니다.

    당신은 당신은 항목의 인덱스를 레디 스 목록에서 "업데이트"항목을 알 수있는 경우 만 제거하고 다시 삽입을 요구하고,이 끔찍하게 비효율적 결정하는 인덱스가 있어야합니다. 그것은 거기에 그것을 할 기본 방법은 없으며, 이것은 좋은 생각이 아니다 있기 때문에, 컬렉션을 반복함으로써 그렇게한다. 이것은 RedisClientList 의 같이 IndexOf 방법의 단편이다.

    public int IndexOf(T item)
    {
        //TODO: replace with native implementation when exists
        var i = 0;
        foreach (var existingItem in this)
        {
            if (Equals(existingItem, item)) return i;
            i++;
        }
        return -1;
    }
    

    코드를 완료 그래서, 그것은 것입니다 :

    public void UpdatePizza(Pizza pizza)
    {
        using (var redisClient = new RedisClient(Host, Port))
        {
            IRedisTypedClient<Pizza> redis = redisClient.As<Pizza>();
            IRedisList<Pizza> pizzas = redis.Lists["pizzas:live"];
            var toUpdate = pizzas.First(x => x.Id == pizza.Id);
            toUpdate.State = pizza.State;
    
            // Update by removing & inserting (don't do it!)
            var index = pizzas.IndexOf(toUpdate);
            pizzas.Remove(index);
            pizzas.Insert(index, toUpdate);
        }                   
    }
    

    그러나 이것은 내가 말했듯이 그것을 처리하는 좋은 방법은 아닙니다. 그것은 인덱스 일치 할 때까지 다른 피자의 목록이 그들을 다음으로 반복 객체를 검색합니다. 업데이트 할 두 가지 작업! :( 가장이 상황에서 목록을 방지 할 수 있습니다.

    당신이 다음 각 개체에 대한 고유 피자 키를 생성 할 수 있습니다 그것의 ID로 피자를 액세스하려고,이 당신이 직접 피자에 액세스 할 수 있습니다. 우리가 사용할 수 있습니다 그래서 :

    pizzas:live:{Id}
    

    피자 만들기

    using (var redisClient = new RedisClient())
    {
        IRedisTypedClient<Pizza> redis = redisClient.As<Pizza>();
        var pizzaKey = string.Format("pizzas:live:{0}", 123);
        var pizza = new Pizza { Id = 123, Type = "Mushroom", State = "Cooking" };
        redis.SetEntry(pizzaKey, pizza);
    }
    

    ID로 피자를 가져옵니다

    using (var redisClient = new RedisClient())
    {
        IRedisTypedClient<Pizza> redis = redisClient.As<Pizza>();
        var pizzaKey = string.Format("pizzas:live:{0}", pizza.Id);
        var pizza = redis.GetValue(pizzaKey);
    }
    

    ID로 피자 (단순히 GET 및 SET)를 업데이트

    using (var redisClient = new RedisClient())
    {
        IRedisTypedClient<Pizza> redis = redisClient.As<Pizza>();
        var pizzaKey = string.Format("pizzas:live:{0}", pizza.Id);
        var pizza = redis.GetValue(pizzaKey); // Get
        pizza.State = "Delivery"; // Update
        redis.SetEntry(pizzaKey, pizza); // Save
    }
    

    또 "목록"으로 이동 (아마도 : 피자가 상태를 변경하는 경우)

    using (var redisClient = new RedisClient())
    {
        var pizzaKey = string.Format("pizzas:live:{0}", pizza.Id);
        var deliveredKey = string.Format("pizzas:delivered:{0}", pizza.Id);
        redisClient.RenameKey(pizzaKey, deliveredKey);
    }
    

    피자 삭제

    using (var redisClient = new RedisClient())
    {
        var pizzaKey = string.Format("pizzas:live:{0}", pizza.Id);
        redisClient.Remove(pizzaKey);
    }
    

    모든 라이브 피자를 나열

    using (var redisClient = new RedisClient())
    {
        var livePizzaKeys = redisClient.ScanAllKeys("pizzas:live:*").ToList();
        List<Pizza> livePizzas = redisClient.GetValues<Pizza>(livePizzaKeys);
    }
    

    이게 도움이 되길 바란다.

  2. from https://stackoverflow.com/questions/23838181/updating-service-stack-redis-list by cc-by-sa and MIT license