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

时间:2016-02-17 18:56:33

标签: 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

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

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

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

2 个答案:

答案 0 :(得分:6)

您可以选择在Elixir中保存状态。

如果此方法是运行GenServer的模块的一部分,那么您可以使用state参数来缓存值。

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

答案 1 :(得分:5)

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

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

<强> TL; DR

  

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