2016-02-17 5 views
5

У меня есть следующий код в эликсира:Как создать глобальную переменную в эликсира модуле

def get_trackerid(imei) do 
    client = get_new_client() 
    {:ok, result} = :cqerl.run_query(client, "SELECT * FROM trackers_by_imei where imei = \'#{imei}\';") 
    row = :cqerl.all_rows(result) 
end 

Теперь, теперь многие функции вызова get_trackerid функции и каждый раз, когда функция вызывается, вызов базы данных производится.

Есть ли способ написать функцию в elixir, такой результат сохраняется в локальной переменной. Итак, когда запрашивается следующий трекер для того же imei, я могу получить данные из самой локальной переменной.

Я думаю, что в эликсире нет понятия глобальной переменной, так что это не вариант, не так ли?

ответ

4

У вас есть несколько вариантов экономии состояния в Elixir.

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

Вы также можете использовать ets table для кэширования значений. Это будет работать как внутри, так и вне GenServer.

5

То, о чем вы просите, называется «memoization». Я упоминаю, что если вы заинтересованы в Google и узнаете, можете ли вы найти больше по этому вопросу.

Это отличный блог проводки обсуждают технику запоминания в Elixir: https://web.archive.org/web/20161116091132/http://ineverfinishanyth.in/2014/01/20/memoization-in-elixir

TL; DR

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

+0

Ссылка предоставлена ​​сломанной. – tuned

+1

@tunedconsulting Я изменил ссылку, чтобы указать версию кеша google на веб-странице. –

+1

новая ссылка здесь http://ineverfinishanyth.in/2014/01/20/memoization-in-elixir (: – tuned

Смежные вопросы