README.md

# Nebulex.Adapters.Ecto

Extremely simple Ecto Postgres adapter for Nebulex Cache library.
Designed to be used as the last level adapter inside multilevel cache.

This adapter implements:
1. Basic key-value cache interface.
2. Cache transactions.
3. Basic queries without patterns.

Cache eviction strategy is LRW or LRU based on the last touched timestamp.

## Installation

In `mix.exs`:
```elixir
defp deps do
  [
    {:nebulex_adapters_ecto, "~> 1.0"}
  ]
end
```

## Setup

### Configuration

In your `runtime.exs`:
```elixir
config :my_app, MyApp.Cache,
  # Available strategies are LRW and LRU
  strategy: :lrw,

  # Repository to be used to access table with cache
  repo: MyApp.Repo,

  # The table as a string (or Schema) which will hold cache data
  table: "cache_table",

  # Maximum amount of data present in the table (in rows)
  max_amount: 1000,

  # Timeout of garbage collection in milliseconds
  gc_timeout: :timer.hours(2),

  # The function to generate timestamps in milliseconds
  timestamp_mfa: {:erlang, :system_time, [:millisecond]}
```

### Table

The most simple migration for cache table would look like this:

```elixir
defmodule Nebulex.Adapters.EctoTest.Repo.Migrations.CreateCacheTable do
  use Ecto.Migration

  def change do
    create table "cache_table" do
      add :key, :binary, primary_key: true
      add :value, :binary
      add :touched_at, :bigint
      add :ttl, :integer
    end

    create unique_index("cache_table", :key)
  end
end
```

However, feel free to create your own indexes. For example, to speed up
garbage collection, I'd suggest using `touched_at + ttl` btree index.