Сохранить объект как значение в Redis, используя его HashTable - PullRequest
0 голосов
/ 01 декабря 2019

Я новичок в Redis и пытаюсь написать простой проект, который собирает информацию из базы данных SQL и кэширует в Redis. Так как мне удобнее с C #, я выбрал StackExchange.Redis , чтобы сделать это.

Допустим, у меня есть таблица в моей БД со схемойкак это Персоны (ID, имя, адрес, возраст, дата рождения) . В моем проекте есть класс Person с соответствующими полями. У меня также есть функция GetPersonByID (ID) , которая запрашивает Redis, если ключ с идентификатором не существует, он выполняет другую функцию, называемую GetPersonByID_SQL (ID) , когда выполняется sql-запрос, после получения информации из db он создает объект Person , добавляет этот объект в Redis (используя hashTable) и возвращает объект. Если ключ существует в Redis, функция просто получает информацию от Redis, создает объект Person , сопоставляет значения соответствующих значений с полями и возвращает этот объект.

Вот код того, как ясделайте это.

public static Person GetPersonByID(string ID)
        {
            redis = ConnectionMultiplexer.Connect("127.0.0.1");
            IDatabase db = redis.GetDatabase();
            Person p;

            if (!db.KeyExists(key))
            {
                p = Person.GetPersonByID_SQL(ID);
                db.HashSet(key, "Name", p.Name);
                db.HashSet(key, "Address", p.Address);
                db.HashSet(key, "Age", p.Age);
                db.HashSet(key, "BirthDate", p.BirthDate); 
            }
            else
            {
                HashEntry[] values = db.HashGetAll(key);
                p = new Person();

                for (int i = 0; i < values.Length; i++)
                {
                    HashEntry hashEntry = values[i];
                    switch (hashEntry.Name)
                    {
                        case "Name": p.Name = hashEntry.Value; break;
                        case "Address": p.Address = hashEntry.Value; break;
                        case "Age": p.Age = hashEntry.Value; break;
                        case "BirthDate": p.BirthDate = hashEntry.Value; break;
                    }
                }
            }

            return p;
        } 

Мой вопрос таков: могу ли я каким-либо образом автоматически связать значение Redis (по-моему, HashTable) с существующим объектом?

1 Ответ

0 голосов
/ 02 декабря 2019

У меня вопрос: есть ли способ, которым я могу автоматически связать значение Redis (по-моему, HashTable) с моим существующим объектом?

Нет, это не такособенность StackExchange.Redis - значения могут храниться только как самые основные типы (строки и числа). От вас ожидают, что вы сами преобразуете в более сложные значения.

Таким образом, вы можете либо сохранить свой объект person в виде нескольких хеш-полей (как вы это сделали в своем коде), либо вы можете сохранить свой объект person. как отдельная сериализованная строка для ключа (вместо этого вы можете использовать структуру данных STRING). Затем вы можете выполнить необходимую десериализацию, когда хотите получить значение.

Если вы всегда хотите извлечь каждое значение из вашей структуры данных Person, я бы рекомендовал перейти ко второму варианту. Вам только тогда нужно будет использовать одну команду для каждого get / set:

// SET
_redis.StringSet(key, serializedPerson);

// GET
string serializedPerson = _redis.StringGet(key);
...