Current section
Files
Jump to
Current section
Files
lib/cachex/limit/accessed.ex
defmodule Cachex.Limit.Accessed do
@moduledoc """
Access based touch tracking for LRW pruning.
This module can be used to adapt `Cachex.prune/3` for LRU purposes instead of
the typical LRW. This hook will update the modification time of a cache entry
upon access by a read operation. This is a very basic way to provide LRU policies,
but it should suffice for most cases.
At the time of writing modification times are *not* updated when executing
commands on multiple keys, such as `Cachex.keys/2` and `Cachex.stream/3`, for
performance reasons. Again, this may change in future if necessary.
"""
use Cachex.Hook
# touched actions
@actions [
:decr,
:exists?,
:fetch,
:get,
:incr,
:invoke,
:ttl,
:update
]
##################
# Hook Behaviour #
##################
@doc """
Returns the actions this hook should listen on.
"""
@spec actions :: [atom]
def actions,
do: @actions
@doc """
Returns the provisions this hook requires.
"""
@spec provisions :: [atom]
def provisions,
do: [:cache]
####################
# Server Callbacks #
####################
@doc false
# Handles notification of a cache action.
#
# This will update the modification time of a key if tracked in a successful cache
# action. In combination with LRW caching, this provides a simple LRU policy.
def handle_notify({_action, [key | _]}, _result, cache) do
{:ok, _} = Cachex.touch(cache, key)
{:ok, cache}
end
@doc false
# Receives a provisioned cache instance.
#
# The provided cache is then stored in the cache and used for cache calls going
# forwards, in order to skip the lookups inside the cache overseer for performance.
def handle_provision({:cache, cache}, _cache),
do: {:ok, cache}
end