LL
Иногда просто нужно иметь хитрые системы инвалидации кэша
Size: a a a
LL
DR
LL
Nebulex
DR
Nebulex
DR
ML
DR
Cachex.transaction!(:my_cache, [ "key" ], fn(cache) ->
case Cachex.get(cache, "key") do
{:ok, nil} ->
# get value, take some time
value = do_some_job()
Cachex.put!(cache, "key", value)
{:ok, value} ->
value
end
end)
LL
Cachex.transaction!(:my_cache, [ "key" ], fn(cache) ->
case Cachex.get(cache, "key") do
{:ok, nil} ->
# get value, take some time
value = do_some_job()
Cachex.put!(cache, "key", value)
{:ok, value} ->
value
end
end)
value = Cachex.get(:my_cache, "key")
new_value = do_some_job(value)
Cachex.transaction(:my_cache, ["key"], fn cache ->
case Cachex.get(cache, "key") do
{:ok, ^value} ->
# Transaction successful
Cachex.put!(cache, "key", new_value)
{:ok, other_value} ->
# Transaction failed, retry everything from the start
other_value
end
end)
DR
value = Cachex.get(:my_cache, "key")
new_value = do_some_job(value)
Cachex.transaction(:my_cache, ["key"], fn cache ->
case Cachex.get(cache, "key") do
{:ok, ^value} ->
# Transaction successful
Cachex.put!(cache, "key", new_value)
{:ok, other_value} ->
# Transaction failed, retry everything from the start
other_value
end
end)
DR
value = Cachex.get(:my_cache, "key")
new_value = do_some_job(value)
Cachex.transaction(:my_cache, ["key"], fn cache ->
case Cachex.get(cache, "key") do
{:ok, ^value} ->
# Transaction successful
Cachex.put!(cache, "key", new_value)
{:ok, other_value} ->
# Transaction failed, retry everything from the start
other_value
end
end)
LL
case Cachex.get(:my_cache, "key") do
{:ok, nil} ->
new_value = do_some_job()
Cachex.transaction(:my_cache, ["key"], fn cache ->
case Cachex.get(cache, "key") do
{:ok, nil} ->
# Transaction successful
Cachex.put!(cache, "key", new_value)
{:ok, other_value} ->
# Value changed by another transaction
other_value
end
end)
{:ok, value} ->
value
end
LL
LL
LL
do_some_job
имеет сайд-эффекты, то разница будет, конечно жеLL
DR
DR
LL
do_some_job
в транзакции, доступ ко всей таблице будет заблочен на время исполнения транзакции. Если выполнять do_some_job
вне транзакции, то таблица будет доступна практически всё время (кроме очень маленькой транзакции-апдейта)do_some_job
длится 300мсdo_some_job
в транзакции 10^5 процессов будут ждать 300мсdo_some_job
вне транзакции 2 процесса будут 300мс выполнять do_some_job
, пока таблица открыта на чтение и изменение всем остальным. Если do_some_job
завязано на CPU
, то это грустно (хотя всё равно сильно лучше чем первый вариант), но если это какое-то сетевое взаимодействие со сторонней системой, то вообще плеватьCachex
LL
con_cache
в этом плане сильно лучшеDR
do_some_job
в транзакции, доступ ко всей таблице будет заблочен на время исполнения транзакции. Если выполнять do_some_job
вне транзакции, то таблица будет доступна практически всё время (кроме очень маленькой транзакции-апдейта)do_some_job
длится 300мсdo_some_job
в транзакции 10^5 процессов будут ждать 300мсdo_some_job
вне транзакции 2 процесса будут 300мс выполнять do_some_job
, пока таблица открыта на чтение и изменение всем остальным. Если do_some_job
завязано на CPU
, то это грустно (хотя всё равно сильно лучше чем первый вариант), но если это какое-то сетевое взаимодействие со сторонней системой, то вообще плеватьCachex