Кэш Янусграфа

#caching #transactions #guava #tinkerpop #janusgraph

Вопрос:

Я читал о кэше Janusgraph в документации Janusgraph. У меня мало сомнений относительно кэша транзакций. Я использую встроенный сервер janusgrah в своем приложении.

  1. Если я выполняю только запрос на чтение, например. — g. V().имеет(«имя»,»ABC»), используя конечную точку HTTP gremlin, будет ли это значение кэшироваться в кэше транзакций или в кэше на уровне базы данных? потому что здесь я не открываю никаких транзакций.
  2. Если он хранится в кэше транзакций, как будут извлекаться обновленные значения для этой вершины, если у меня многоузловое развертывание?

Ответ №1:

Что касается вопроса 1:
Если транзакции не созданы явно, они создаются автоматически. Из справочных документов JanusGraph:

Каждая графическая операция в JanusGraph выполняется в контексте транзакции. Согласно спецификации транзакций TinkerPop, каждый поток открывает свою собственную транзакцию в базе данных graph с помощью первой операции (т. е. извлечения или мутации) на графике.

Вершина, полученная во время транзакции, хранится как в кэше транзакций, так и в кэше базы данных. После закрытия транзакции вершина все еще находится в кэше базы данных (но обратите внимание, что начиная с janusgraph-0.5.x кэш базы данных по умолчанию отключен).

Что касается вопроса 2:
Действительно, экземпляр JanusGraph не может знать об изменениях вершин в кэшах транзакций других экземпляров. Только после того, как эти транзакции будут закрыты и сохранены в бэкэндах хранилища и индекса, другие экземпляры смогут считывать измененные вершины из бэкэндов. Это также означает, что кэши в других экземплярах JanusGraph могут устареть, поэтому, если вы хотите быть уверены, что у вас есть последние данные из бэкендов, вам следует начать новую транзакцию и отключить кэш базы данных (настройка по умолчанию).

Дополнительные комментарии (добавлено 12 сентября):

Кэши вершин являются закрытыми членами JanusGraph и нигде не доступны пользователю (даже в журнале отладки). Попадания в кэш при обходе видны только с быстрого (менее миллисекунды) времени возврата.

Если для вас важна согласованность данных между транзакциями или экземплярами janusgraph, вы можете взглянуть на:

Комментарии:

1. Есть ли способ проверить, попадает ли запрос в внутреннее хранилище или кэш на уровне транзакций/БД?

2. Обновляет ли Janusgraph напрямую значение во внутреннем хранилище? Просто хотел понять, какую стратегию они используют для обновления значения во внутреннем хранилище, а также в кэше. Я попытался обновить свойство вершины из одного узла, получил доступ к нему из другого узла и смог прочитать обновленное свойство.