Как стать автором
Обновить

Elixir и Angular 2 безо всяких Hello, world!, или Реализуем работу с древовидным справочником, часть 1

Время на прочтение64 мин
Количество просмотров11K
Всего голосов 23: ↑23 и ↓0+23
Комментарии10

Комментарии 10

чекнутые ботаники…
Да не переживайте вы так, и вы такую траву выращивать научитесь :)
Йо. Йо*ан* рот… Мне хватает знания PHP и чистого JS. Что еще из этого дерьма вы хоите притащить в индустрию и сделать это мейнстримом? Я в свободное время пью, курю и с девочками отдыхаю, а мне и не надо ваших Ангуляторов и Эликсиров. Это ничего хорошего. Я что-то типа этого имел ввиду. Может вы еще в мультикомбайн на понтах дела превратитесь и начнете пилить за всю команду в одно рыло?

Мне такая трава не нужна. Я свою работу знаю и умею, но такие как вы делают что-то уму невообразимое. Потому что начитаются и думают что это круто и начинают кривляться и подражать.

Прикол приколом, но пользы от такого…
НЛО прилетело и опубликовало эту надпись здесь

Всё-таки нервничаете… зря. Эдак вы все нервные клетки растеряете.

Я вас просто трахну вашими же собственными какашками через прослушку… Легко и просто… Ждите
может кэш для справочника? В финиксе есть кэш из коробки?

Вы имеете ввиду кэширование обращений к базе (кэш данных) или кэш выдачи?


Вообще, своего нет ни того, ни другого. Но простейший кэш можно реализовать буквально несколькими строчками на 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"

Кстати, выше был реализован полноценный отдельный рабочий процесс, который будет исполнятся параллельно всем остальным.


Конечно, с данной задачей и мизерным объемом справочников вообще нет смысла лезть в базу более одного раза после запуска приложения: загрузить всё в память и уже с ней работать. Но хотелось хоть как-то показать взаимодействие с базой.

Зачем свой велосипед пилить? Есть же ETS, но сути аналог memcached, только быстрее.
В качестве дополнительной обёртки можно ConCache использовать.

А пилить вообще ничего не нужно никогда, тут я с вами согласен; поэтому и написал — простейший вариант. Кроме того, какая-никакая, но демонстрация GenServer, хоть и без пояснений.


Но, если уж об этом говорить, стоило бы мне, конечно, начать с того, что разработчики языка вообще не рекомендуют вводить кэширование до тщательного профилирования приложения и полной уверенности в том, что именно кэшированием узкое место будет исправлено. И — если более глобально — вообще не лезть в оптимизацию до того, как в этом возникнет реальная необходимость.


Кстати, решений для кэширования есть в ассортименте, одним ConCache дело не заканчивается.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации