我在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中没有全局变量的概念,所以这不是一个选项,对吗?
答案 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 强>
构建缓存并在尝试执行计算时检查缓存,以查看答案是否已存在。在博客发布的情况下,他构建了一个键值存储作为缓存,但显然你应该构造什么样的缓存将高度依赖于你正在缓存的数据。