如何在elixir模块中创建全局变量

Ksh*_*tal 8 elixir

我在elixir中有以下代码:

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
Run Code Online (Sandbox Code Playgroud)

现在,现在许多函数都在调用get_trackerid函数,每次调用函数时,都会调用数据库.

有没有办法在elixir中编写函数,结果存储在局部变量中.因此,当下次请求同一个imei的trackerid时,我可以从本地变量本身获取数据.

我认为elixir中没有全局变量的概念,所以这不是一个选项,对吧?

Cod*_*nis 8

您有一些选项可以在Elixir中保存状态.

如果此方法是运行GenServer的模块的一部分,则可以使用该state参数来缓存值.

您还可以使用ets表来缓存值.这可以在GenServer内部和外部工作.


Ono*_*cci 5

您所询问的内容称为" memoization ".我提到如果你关心谷歌,看看你是否能找到更多关于这个主题的信息.

这是一篇很棒的博客文章,讨论了Elixir中的记忆技术:https://web.archive.org/web/20161116091132/http://ineverfinishanyth.in/2014/01/20/memoization-in-elixir

TL; DR

当您尝试进行计算以查看答案是否已存在时,构造缓存并检查缓存.在博客发布的情况下,他构建了一个键值存储作为缓存,但显然你应该构造什么样的缓存将高度依赖于你正在缓存的数据.