Groovy: MultiValueMap с картами в качестве ключей - PullRequest
0 голосов
/ 18 августа 2011

Вот о чем я думаю, и я хочу знать, считаете ли вы, что это хорошая идея или нет.

Я получаю несколько строк из базы данных, которая в groovy дает мне список списков, например:

[
  [ 'Dog', 'M', 'Mutt', 'Sammy' ],
  [ 'Cat', 'F', 'Siamese', 'Pat' ],
  [ 'Dog', 'M', 'Husky', 'Taco' ],
  ...
]

Не мой реальный набор данных, но вы поняли.

Поскольку я буду довольно часто извлекать эти данные и анализировать их перед тем, как представить их в пользовательском интерфейсе, я хочу сохранить их в MultiValueMap с ключами groovy maps (т.е. LinkedHashMaps), поэтому могу получить нужные мне кусочки, не заходя в БД каждый раз. Это своего рода кеш подмножества данных из нескольких таблиц (более сложный, чем приведенные выше данные о животных).

Я мог бы использовать это так:

animals.get([species:'Dog', gender:'M'])

возвращает:

[['Sammy', 'Mutt'], ['Taco', 'Husky'] ]

Я думаю, что у меня есть идея, как это реализовать, поэтому я не очень этого ищу (хотя, если у вас есть новое предложение, пожалуйста, поделитесь). В основном я ищу кого-то, кто скажет мне, что либо это не будет работать по какой-то причине, либо звучит нормально, либо не будет масштабироваться и т. Д. Или, может быть, есть более простой способ получить аналогичную функциональность. Еще одно соображение: весь набор данных иногда может быть довольно большим, например, несколько записей по 100 тыс. Если не это, какой хороший способ справиться с этим, кроме попадания в БД каждый раз?

Я понимаю, что существует множество решений для кэширования ключей / значений, но я не думаю, что мне нужно что-то столь тяжелое для того, что я делаю. Это просто небольшое веб-приложение с довольно низким уровнем использования, в основном для компании, для которой я его создаю.

Ответы [ 2 ]

2 голосов
/ 18 августа 2011

Если подмножество значений, которое вы используете, является статическим / детерминированным, я просто превращаю это в строку и использую это в качестве ключа на вашей карте. Поэтому вместо animals.get([species:'Dog', gender:'M']) я бы использовал animals.get('species:Dog:gender:M').

Я знаю, вы сказали, что думали, что хранилище значений ключей слишком тяжелое, но это также идеальный вариант использования для Redis, который может изначально хранить такие вещи, как хэш-карты .

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

Вы можете использовать плагин grails-redis , чтобы запоминать вызовы вашей базы данных, чтобы он сначала автоматически проверял redis, чтобы увидеть, находится ли он в кэше, если нет, он запрашивает базу данных и придерживается это в кеше, прежде чем вернуть его. См. документы на github для более подробной информации / примеров.

return redisService.memoizeHash('species:Dog:gender:M') {
    // database call that returns object, then you turn that into hash
    Dog d = Dog.findBy...
    [species: d.species, gender: d.gender, breed: d.breed, name: d.name, ...]
}

Таким образом, он запрашивает базу данных, только если Redis еще не имеет ее в кэше. При отсутствии кэша возвращаемое значение сохраняется в redis по указанному ключу.

(Отказ от ответственности, я автор Grails-Redis плагин , поэтому у меня есть некоторые предвзятость)

0 голосов
/ 18 августа 2011

Использование изменяемой карты в качестве ключа - очень плохая идея, потому что если ключ изменится, он не будет найден.

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