Caches another strategy's results in ETS. Useful for directory strategies that query a database.
strategy: {Shardex.Strategy.Cached, inner: MyApp.ShardDirectory, ttl: :timer.minutes(5)}Options:
:inner(required) - the wrapped strategy (module,{module, opts}or function):ttl- entry lifetime in milliseconds or:infinity(default 5 minutes):cache_errors- also cache{:error, _}results (defaultfalse)
Only cache misses reach the inner strategy, in one route_many/2 call.
The cache is cleared on add_shard/remove_shard; use Shardex.invalidate/2
when an assignment changes.
Call Shardex.invalidate/2 only after the new assignment is visible to the
inner strategy. Invalidation is not atomic with lookups: a lookup that missed
the cache concurrently can re-cache the old value after invalidate/2, where
it stays until :ttl expires. Choose :ttl to bound how long a stale route
is acceptable.
Expired entries are only replaced when their key is looked up again, so
memory grows with the number of distinct keys routed. If that matters, use a
bounded key space, or a finite :ttl plus a periodic Shardex.invalidate(instance, :all).