Является ли возвращаемое значение redis копией или ссылкой - PullRequest
0 голосов
/ 28 мая 2018

Я слышал о redis, но он слишком тяжел для моего проекта.Я решил сам написать некоторый объектный кеш, как показано ниже:

private List<Specification> _lsSpecification...// the object need cache, I will use R/W lock to protect it

Поскольку время чтения намного больше, чем запись, я не хочу блокировать код try-catch-finally каждый раз, когда мне нужно прочитать объект,как показано ниже:

        try
        {
            RWLock.EnterReadLock();
            // do anything about _lsSpecification
        }
        catch (Exception ex)
        {

        }
        finally
        {
            RWLock.ExitReadLock();
        }

Точно, что я хочу получить, это указанный объект «Спецификация» или весь список.Поэтому я кодирую метод, как показано ниже:

    public Specifiction getSpecification(int id)
    {
        RWLock.EnterReadLock();
        Specification specification = _lsSpecification.Find(c => c.ID == id).Clone;// assume a clone method is exist
        RWLock.ExitReadLock();
        return specification;
    }

    public List<Specification> getSpecifications()
    {
        RWLock.EnterReadLock();
        List<Specification> lsAll = _lsSpecification.ToList();
        RWLock.ExitReadLock();
        return lsAll ;
    }

Как показано выше, я вызываю эти методы для получения объекта, а затем использую его значение копирования, он должен быть безопасным.Но я все еще чувствую, что это пустая трата для копирования.Мне интересно знать, может ли redis возвращать объект или список, если это возможно, значение является копией или ссылкой?

1 Ответ

0 голосов
/ 28 мая 2018

Прежде всего, Redis совсем не тяжелый.Это очень просто установить и использовать.Вы получите его и запустите практически без усилий.Я настоятельно рекомендую вам попробовать, когда сможете.С StackExchange.Redis у вас есть простая, хорошо разработанная и широко используемая библиотека C # для доступа к вашему серверу Redis.

Redis - это хранилище значений ключей, где значением может быть один из пяти различных типов данных.В вашем случае вы можете сохранить сериализованный Specifiction как String с идентификатором в качестве ключа, например, spec:1.

. Вам придется десериализовать ваш Specification после вызова GET.Этот Specification -объект не будет иметь ссылки на объекты, установленные на него или с него, поэтому он является копией.

В SET вы можете хранить все идентификаторы.Вы можете получить идентификаторы с помощью SMEMBERS, получить все элементы с помощью MGET и снова десериализовать их для новых объектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...