Comments 10
Мне такая трава не нужна. Я свою работу знаю и умею, но такие как вы делают что-то уму невообразимое. Потому что начитаются и думают что это круто и начинают кривляться и подражать.
Прикол приколом, но пользы от такого…
Вы имеете ввиду кэширование обращений к базе (кэш данных) или кэш выдачи?
Вообще, своего нет ни того, ни другого. Но простейший кэш можно реализовать буквально несколькими строчками на Elixir:
defmodule Example.KeyValueStore do
use GenServer
# Client API
def start_link(initial_state \\ %{}) do
GenServer.start_link(__MODULE__, initial_state, name: __MODULE__)
end
def get(key) do
GenServer.call(__MODULE__, {:get, key})
end
def put(key, value) do
GenServer.cast(__MODULE__, {:put, key, value})
end
# Server API
def handle_call({:get, key}, _from, state) do
{:reply, Map.get(state, key), state}
end
def handle_cast({:put, key, value}, state) do
{:noreply, Map.put(state, key, value)}
end
end
Для того, чтобы понять, что получилось, запустите интерактивную оболочку Elixir iex
, скопируйте сначала код выше (не забудьте завершающий перевод строки) и затем вводите следующее:
iex> alias Example.KeyValueStore, as: KVS
Example.KeyValueStore
iex> KVS.start_link
{:ok, #PID<0.114.0>}
iex> KVS.get(:one)
nil
iex> KVS.put(:one, "some text")
:ok
iex> KVS.put(:complex_structure, %{name: "test", title: "record"})
:ok
iex> KVS.put(12345, "key can be any type")
:ok
iex> KVS.get(:one)
"some text"
iex> KVS.get(:complex_structure)
%{name: "test", title: "record"}
iex> KVS.get(12345)
"key can be any type"
Кстати, выше был реализован полноценный отдельный рабочий процесс, который будет исполнятся параллельно всем остальным.
Конечно, с данной задачей и мизерным объемом справочников вообще нет смысла лезть в базу более одного раза после запуска приложения: загрузить всё в память и уже с ней работать. Но хотелось хоть как-то показать взаимодействие с базой.
А пилить вообще ничего не нужно никогда, тут я с вами согласен; поэтому и написал — простейший вариант. Кроме того, какая-никакая, но демонстрация GenServer, хоть и без пояснений.
Но, если уж об этом говорить, стоило бы мне, конечно, начать с того, что разработчики языка вообще не рекомендуют вводить кэширование до тщательного профилирования приложения и полной уверенности в том, что именно кэшированием узкое место будет исправлено. И — если более глобально — вообще не лезть в оптимизацию до того, как в этом возникнет реальная необходимость.
Кстати, решений для кэширования есть в ассортименте, одним ConCache дело не заканчивается.
Elixir и Angular 2 безо всяких Hello, world!, или Реализуем работу с древовидным справочником, часть 1