Skip to content

Pockets is an Elixir wrapper around Erlang :ets and :dets, a disk-based term storage

License

Notifications You must be signed in to change notification settings

fireproofsocks/pockets

Folders and files

NameName
Last commit message
Last commit date

Latest commit

f75a5ea · Feb 7, 2025

History

26 Commits
Nov 19, 2020
Feb 7, 2025
Aug 31, 2022
Jan 25, 2025
Sep 23, 2020
Sep 23, 2020
Oct 6, 2020
Feb 7, 2025
Oct 6, 2020
Oct 6, 2020
Jan 25, 2025
Feb 7, 2025
Feb 7, 2025

Repository files navigation

Pockets

Module Version Hex Docs Total Download License Last Updated

Pockets is an Elixir wrapper around Erlang ETS and DETS, Erlang's built-in solutions for memory- and disk-based term storage. Pockets aims to provide a simple and familiar interface for caching and persisting data by implementing many of the functions found in the built-in Map and Keyword modules. A pocket may hold data in memory or on disk.

For those needing more power or versatility than what :ets or :dets can offer, Elixir includes :mnesia.

Secondly, the docs on erlang.org are a bit rough to look at for Elixir developers, so this package acts as a case study of the differences between the powerful built-in :ets and :dets libraries.

In case it was too subtle, "Pockets" is a name that includes "ETS" for mnemonic purposes.

Installation

Add pockets to your list of dependencies in mix.exs:

def deps do
  [
    {:pockets, "~> 1.5.0"}
  ]
end

Usage

A simple memory-based cache requires no special arguments:

iex> Pockets.new(:my_cache)
{:ok, :my_cache}
iex> Pockets.put(:my_cache, :a, "Apple") |> Pockets.put(:b, "boy") |> Pockets.put(:c, "Charlie")
:my_cache
iex> Pockets.get(:my_cache, :c)
"Charlie"

Using a disk-based cache is appropriate when you need your data to persist. Just supply a file path as the second argument to Pockets.new/3:

iex> Pockets.new(:on_disk, "/tmp/cache.dets")
{:ok, :on_disk}

You can easily populate your pocket with existing data:

iex> Pockets.new(:on_disk, "/tmp/cache.dets")
{:ok, :on_disk}
iex> Pockets.merge(:on_disk, %{x: "xylophone", y: "yellow"})
:on_disk

You can easily inspect your data, e.g. using Pockets.to_map/1:

iex> Pockets.to_map(:on_disk)
%{x: "xylophone", y: "yellow"}

See the Pockets module documentation for more info!

Image Attribution

"pocket" by Hilmi Hidayat from the Noun Project

About

Pockets is an Elixir wrapper around Erlang :ets and :dets, a disk-based term storage

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages