Как безопасно кэшировать мой результат базы данных в memcache - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть функция, которая возвращает пользователя. Я использую Горм для моей БД ORM:

func (dbs *DbService) GetUser(userId string) User {
  var user = &User{}
  dbs.db..Find(&user)
  return user
}

Если я кеширую результат, то есть пользователя, это вызовет проблемы с выделением памяти, потому что я помещаю пользователя в кеш, который является ссылочным типом, так что это заставит переменную user жить вне области действия этой функции?

Обновление

Итак, учитывая приведенную выше функцию, я хочу обновить ее для кэширования, используя memcache (ниже не приведен фактический код для хранения моего пользователя, просто пример):

mc.Set(&memcache.Item{Key: "foo", Value: []byte("my value")})

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

1 Ответ

0 голосов
/ 05 ноября 2018

Переменные Memcache и Go (указатели Go) не имеют ничего общего друг с другом.

Если вы не используете пакет unsafe, вам (почти) никогда не придется беспокоиться о переменных и указателях Go: сборщик мусора освободит недоступные значения и никогда не освободит достижимые значения. Это невидимое благо, так что вам не нужно об этом думать.

Вы не можете хранить «переменные Go» в memcache. Вы можете хранить байтовые последовательности (байтовые массивы) в memcache, но это не будет зависеть от любых переменных Go. При сохранении байтового массива в memcache последовательность байтов будет «скопирована».

Если вы хотите сохранить значение переменной Go, вам нужно найти способ сериализации значения, которое может быть использовано JSON или gob кодирование, и результирующая последовательность байтов может быть сохранена. Пока закодированная форма находится в memcache, переменная Go может быть освобождена (если на нее нет ссылок).

Когда вам нужно кэшированное значение, вы должны извлечь его из memcache и декодировать фрагмент байта (который в основном является обратным процессом сериализации).

...