async def get_by_ids(self, person_ids: List[UUID]) -> Optional[List[Person]]: """ Возвращает персоны по списку id. """ persons = OrderedDict.fromkeys(person_ids, None) # проверяем есть ли полученные жанры в кеше по их ID for person_id in persons.keys(): data = await self.cache.get(person_id) if data: persons[person_id] = Person.parse_raw(data) # не найденные в кеше персоны запрашиваем в эластике и кладём в кеш not_found = [ person_id for person_id in persons.keys() if persons[person_id] is None ] if not_found: docs = await self.storage.get_by_ids(self._index, not_found) for doc in docs: person = Person(**doc) await self.cache.put(person.id, person.json()) persons[person.id] = person return list(persons.values())
async def get_by_id(self, person_id: UUID) -> List[Person]: """ Возвращает объект персоны. Он опционален, так как персона может отсутствовать в базе """ data = await self.cache.get(person_id) if data: return Person.parse_raw(data) docs = await self.storage.get_by_ids(self._index, [ person_id, ]) if not docs: return None person = Person(**docs[0]) await self.cache.put(person.id, person.json()) return person