gpt4 book ai didi

elixir - 在 Elixir 中缓存昂贵的计算

转载 作者:行者123 更新时间:2023-12-04 13:48:24 25 4
gpt4 key购买 nike

我在 elixir 中有一个看起来像这样的 Web 应用程序

defmodule Test do
use Plug.Router

plug :match
plug :dispatch

def expensiveComputation() do
// performs an expensive computation and
// returns a list
end

get "/randomElement" do
randomElement = expensiveComputation() |> Enum.random
send_resp(conn, 200, randomElement)
end

end

每当我发出 GET请求 /randomElement , expensiveComputation被调用。 expensiveComputation函数需要很长时间才能运行,但每次调用都会返回相同的内容。缓存结果以使其仅在启动时运行一次的最简单方法是什么?

最佳答案

您可以使用 ETS 来缓存昂贵的计算。这是我最近写的东西,它可能不是一个成熟的缓存解决方案,但对我来说效果很好:

defmodule Cache do
@table __MODULE__

def start do
:ets.new @table, [:named_table, read_concurrency: true]
end

def fetch(key, expires_in_seconds, fun) do
case lookup(key) do
{:hit, value} ->
value
:miss ->
value = fun.()
put(key, expires_in_seconds, value)
value
end
end

defp lookup(key) do
case :ets.lookup(@table, key) do
[{^key, expires_at, value}] ->
case now < expires_at do
true -> {:hit, value}
false -> :miss
end
_ ->
:miss
end
end

defp put(key, expires_in_seconds, value) do
expires_at = now + expires_in_seconds
:ets.insert(@table, {key, expires_at, value})
end

defp now do
:erlang.system_time(:seconds)
end
end

首先您需要调用 Cache.start某处,因此将创建 ETS 表(例如在您的应用程序的 start 函数中)。然后你可以像这样使用它:
value = Cache.fetch cache_key, expires_in_seconds, fn ->
# expensive computation
end

例如:
Enum.each 1..100000, fn _ ->
message = Cache.fetch :slow_hello_world, 1, fn ->
:timer.sleep(1000) # expensive computation
"Hello, world at #{inspect :calendar.local_time}!"
end
IO.puts message
end

关于elixir - 在 Elixir 中缓存昂贵的计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35218738/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com