Как Redis кешировать большой C # объект без сериализации? - PullRequest
0 голосов
/ 31 декабря 2018

В моем приложении мы использовали словарь C # для кэширования в памяти большого бизнес-объекта.

Я сейчас нахожусь в процессе преобразования огромного объекта C # с множественными круглыми ссылками (~ 300 КБ при сериализации JSON) в DTOс целью сериализации / десериализации JSON для кэширования Redis.

Кажется, что некоторые типы в моем бизнес-уровне не могут быть легко инициализированы из-за параметризованных конструкторов.

Есть ли способ, как я могу Redis кешировать без сериализации?Может ли таким образом вернуть тот же объект, который я кешировал.

Ответы [ 2 ]

0 голосов
/ 24 июля 2019

Хорошо.Я знаю, что прошло много времени после того, как я задал этот вопрос.Но мы решили это.Мы использовали BinaryFormatter Serializer, который по существу преобразует объект .NET в карту памяти и сериализует его в виде двоичного массива.Эта карта памяти может быть использована для воссоздания исходного объекта без открытых конструкторов по умолчанию.Эта сериализация BinaryFormatter поддерживается .NET из более ранних версий.

Недостатком этого подхода является то, что мы должны вручную перейти к каждому классу в иерархии объектов и присвоить классу атрибут Serializable.Другим недостатком является то, что сериализуются только те свойства, которые содержат ненулевое значение.Это означает, что если ни один из ваших модульных тестов не инициализирует какое-либо или какое-либо свойство сериализуемого объекта, есть большой шанс, что мы можем получить исключение сериализации во время выполнения, которое можно легко решить, декорировав тип Serializable

Мы также можем использовать другие форматы сериализации, такие как MsgPack и т. Д.

public class TheTypeToBeCached
{
   public OneSubType Property1 {get;set;}
   public SecondSubType Property2 {get;set;}
}

public class OneSubType 
{
    public ThirdSubType Property3 {get;set;}
    public ForthSubType Property4 {get;set;}
    public AnotherSubType Property5 {get;set;}
}
public class SecondSubType
{
    public ForthSubType Property6 {get;set;}
    public AnotherSubType Property7 {get;set;}
}
public class ThridSubType
{
    public SecondSubType Property8{get;set;}
}
public class ForthSubType
{
    public SecondSubType Property9{get;set;}
}
public class AnotherSubType
{
    public OneSubType Property10{get;set;}
}

Приведенную выше иерархию можно сериализовать и десериализовать с помощью BinaryFormatter Serializer, даже если она имеет несколько циклических связей.

[Serializable]
public class TheTypeToBeCached
{
   public OneSubType Property1 {get;set;}
   public SecondSubType Property2 {get;set;}
}

[Serializable]
public class OneSubType 
{
    public ThirdSubType Property3 {get;set;}
    public ForthSubType Property4 {get;set;}
    public AnotherSubType Property5 {get;set;}
}

[Serializable]
public class SecondSubType
{
    public ForthSubType Property6 {get;set;}
    public AnotherSubType Property7 {get;set;}
}

[Serializable]
public class ThridSubType
{
    public SecondSubType Property8{get;set;}
}

[Serializable]
public class ForthSubType
{
    public SecondSubType Property9{get;set;}
}

[Serializable]
public class AnotherSubType
{
    public OneSubType Property10{get;set;}
}
0 голосов
/ 31 декабря 2018

Есть ли способ, как я могу Redis кешировать без сериализации?

Краткий ответ: Нет .

Немного более длинный ответ: Нет, потому что Redis основан на строках.В этих строках вы можете хранить все виды вещей, но в итоге все сводится к строкам.Таким образом, вы не можете выйти из сериализации, когда хотите сохранить что-то в Redis.

Redis не является обычным хранилищем значений ключей, на самом деле это сервер структур данных , поддерживающий различные типы значений.Это означает, что, хотя в традиционных хранилищах значений ключей вы связываете строковые ключи со строковыми значениями, в Redis значение не ограничивается простой строкой, но может также содержать более сложные структуры данных.Ниже приведен список всех структур данных, поддерживаемых Redis, которые будут рассмотрены отдельно в этом руководстве:

  • Бинарно-безопасные строки.
  • Списки: коллекции отсортированных строковых элементовсогласно порядку введения.В основном это связанные списки.
  • Наборы: коллекции уникальных, несортированных строковых элементов.
  • Сортированные наборы, аналогичные наборам, но где каждый строковый элемент связан со значением с плавающей запятой, называемым счетом.Элементы всегда выбираются отсортированными по их количеству, поэтому в отличие от наборов, можно получить диапазон элементов (например, вы можете спросить: дайте мне верхнюю 10 или нижнюю 10).
  • Хэши, которыеявляются картами, состоящими из полей, связанных со значениями.И поле, и значение являются строками.Это очень похоже на хэши Ruby или Python.
  • Битовые массивы (или просто битовые карты): возможно, используя специальные команды, обрабатывать строковые значения как массив битов: вы можете устанавливать и очищать отдельные биты,подсчитать все биты, установленные в 1, найти первый установленный или неустановленный бит и т. д.
  • HyperLogLogs: это вероятностная структура данных, которая используется для оценки мощности набора.Не пугайтесь, это проще, чем кажется ... См. Позже в разделе HyperLogLog этого руководства.

Дополнительная информация: Введение в типы данных Redis иабстракции

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