Mentat

Elixir CIModule VersionHex DocsTotal DownloadLicenseLast Updated

Provides a super simple cache with ttls.

Usage

A cache must be given a name when its started.

Mentat.start_link(name: :my_cache)

After its been started you can store and retrieve values:

Mentat.put(:my_cache, user_id, user)
user = Mentat.get(:my_cache, user_id)

TTLs

Both put and fetch operations allow you to specify the key's TTL. If no TTL is provided then the TTL is set to :infinity. TTL times are always in milliseconds.

Mentat.put(:my_cache, :key, "value", [ttl: 5_000])

Mentat.fetch(:my_cache, :key, [ttl: 5_000], fn key ->
  {:commit, "value"}
end)

Default TTLs

You can set a global TTL for all new keys

Limits

Mentat supports optional limits per cache.

Mentat.start_link(name: LimitedCache, limit: [size: 100])

When the limit is reached, the janitor will asynchronously reclaim a percentage of the keys.

Telemetry

Mentat publishes multiple telemetry events.

Contracts

Mentat supports Oath contracts. This helps ensure that you're using Mentat correctly and that Mentat is returning what you expect. You can enable contracts by setting

config :oath,
  enable_contracts: true

And then recompiling Mentat in dev and test environments:

MIX_ENV=dev mix deps.compile mentat --force
MIX_ENV=test mix deps.compile mentat --force

Installation

def deps do
  [
    {:mentat, "~> 0.7"}
  ]
end

Should I use this?

There are (many) other caching libraries out there that provide many more features than Mentat. But, it turns out, I don't need most of those features. Mentat is intended to be very small while still providing the necessary components. The test suite is sparse, but we've been using this implementation in production for a while now so I feel pretty confident in it.