Ну, я думаю, тебе придется с этим жить. Memcahced будет работать лучше всего, если вы действительно не делаете вещи партиями. Например, он отлично подходит для таких вещей, как «где вещи для этого пользователя? Вот несколько вещей для этого пользователя». Это на самом деле не означает, что этот запрос не делает пакетов. Конечно, так и будет - если некоторые вещи пользователя такие же, как его / ее сообщения.
Я полагаю, что проблема, с которой вы столкнетесь, - это случаи, когда вы смешиваете запросы, которые должны получить элемент из БД самостоятельно, и те, которые получают кучу того же вида предыдущих элементов.
Всегда есть обратная сторона ситуации. Если вы действительно хотите помешаться на своей реализации, вы можете изменить свои пакетные запросы, чтобы они не включали элементы, уже присутствующие в memcached. Очень уродливо ...
По моему мнению, это всегда сводится к тому, "какие запросы я действительно хочу кэшировать?"
EDIT:
Я бы сказал об этом так:
- Запрос по одному элементу - если используется memcached, используйте его, в противном случае извлекайте из БД и обновляйте memcached.
- Пакетный запрос - не беспокойтесь о том, какие элементы находятся в memcached, просто получите все и обновите memcached.
Это, конечно, предполагает, что пакетные запросы уже занимают чертовски много времени для завершения, и поэтому я уже трачу столько времени, что могу жить с внешними поисками уже кэшированных элементов.
Однако, в конце концов, ваш кеш будет содержать много элементов, если вы будете часто использовать пакетные запросы. Поэтому вам нужно будет соблюсти баланс для определения того, в какой момент вы все еще хотите выполнить поиск в базе данных. Хорошо, если пакетный запрос находится на более раннем этапе жизненного цикла ваших приложений, тогда все будет кэшировано раньше. После первого пакетного запроса вы можете сказать себе, что вам больше не нужно извлекать данные из БД, если только данные в кэше не будут признаны недействительными в результате обновлений или удалений.