如何在Erlang等函数式语言中使用缓存数据?

oxb*_*kes 16 erlang functional-programming immutability

我最近一直在阅读有关函数式语言的文章.在10多年的OO开发过程中,我发现很难理解人们如何能够指出纯粹的功能方法(即使用相同参数调用相同的方法做同样的事情) (在OO程序中)我需要缓存数据.

  • 我们是否承认在程序中可能需要一个不可变的actor(即缓存).我刚看了Joe Armstrong关于infoq的演讲,他在这方面看起来很教条!

  • 我们是否只是承认查找数据可能很昂贵(因为我们永远无法缓存它)?如果是这样,我们如何控制,例如,某些共享资源(例如数据库)上的负载

  • 是否有一些神奇的尘埃,我还不知道,这解决了整个问题,然后喝了一杯好茶.

当然谷歌搜索"Erlang Cache"似乎返回了一些公平的结果......

Ale*_*nov 3

在 Erlang 中,数据必须是不可变的,而不是参与者。

长寿的参与者通常生活在尾递归函数中,其参数作为它们的状态,并且肯定可以在调用之间发生变化。

-module(cache).
-export([start/0, get_c/1, put_c/2, clear/1]).

start() -> register(spawn(fun () -> loop(dict:new()) end), cache).

loop(Dict) -> receive
                {get, From, Key} -> From ! {cache_result, Key, dict:fetch(Key, Dict)};
                {set, Key, Value} -> NewDict = dict:store(Key, Value, Dict),
                                     loop(NewDict);
                %% etc.
              end

put_c(Key, Value) -> cache ! {set, Key, Value}
%% etc.
Run Code Online (Sandbox Code Playgroud)

当您调用 时put_c,参与者的“状态”会发生变化,即使涉及的所有数据都是不可变的。

  • *叹*。24 分 18 秒:“如果你有函数式编程语言,那么你就没有可变状态”。之前他谈到可变状态与容错、分布式和并发系统不兼容(19.15、20.15、20.37、22.45)。他还谈到“不需要锁定共享资源,因为没有共享资源”,并且参与者应该是“可复制的”。显然,对于缓存,您需要*在某个时刻*锁定,并且可复制性也不是立即显而易见的。 (2认同)