Current section
Files
Jump to
Current section
Files
lib/memoize/cache_strategy/default.ex
if Memoize.CacheStrategy.configured?(Memoize.CacheStrategy.Default) do
defmodule Memoize.CacheStrategy.Default do
@moduledoc false
@behaviour Memoize.CacheStrategy
@ets_tab __MODULE__
def init() do
:ets.new(@ets_tab, [:public, :set, :named_table, {:read_concurrency, true}])
end
def tab(_key) do
@ets_tab
end
def cache(_key, _value, opts) do
expires_in = Keyword.get(opts, :expires_in, :infinity)
expired_at =
case expires_in do
:infinity -> :infinity
value -> System.monotonic_time(:millisecond) + value
end
expired_at
end
def read(key, _value, expired_at) do
if expired_at != :infinity && System.monotonic_time(:millisecond) > expired_at do
invalidate(key)
:retry
else
:ok
end
end
def invalidate() do
:ets.select_delete(@ets_tab, [{{:_, {:completed, :_, :_}}, [], [true]}])
end
def invalidate(key) do
:ets.select_delete(@ets_tab, [{{key, {:completed, :_, :_}}, [], [true]}])
end
def garbage_collect() do
expired_at = System.monotonic_time(:millisecond)
:ets.select_delete(@ets_tab, [
{{:_, {:completed, :_, :"$1"}},
[{:andalso, {:"/=", :"$1", :infinity}, {:<, :"$1", {:const, expired_at}}}], [true]}
])
end
end
end