Elixir ETS与Redis

学习Elixir可以挑战您对编程了解的所有知识。 Redis与您的数据库一样,正成为许多Web堆栈中假定的一部分。 但是有了Elixir,您需要吗? 您甚至需要一个数据库吗?

Web应用程序操作的不断变化的世界

这是当今Web应用程序的标准操作模式:

  • 一个请求进入;
  • 前往少数Web服务器之一;
  • 从数据库中获取一些数据(或将一些东西放入其中);
  • 用它做一些东西;
  • 向客户端返回响应。

在许多情况下,我们需要以很高的速率写入数据或缓存数据,以避免重新处理昂贵的查询。 我们还需要这些大容量缓存和写入位置,以供我们所有的Web服务器使用-这就是Redis所在的位置。

在我们赖以生存的世界中,这是有道理的。

但是BEAM / OTP(运行Elixir的Erlang VM)的世界是不同的。 在这个世界上,您的Web服务器以群集的形式连接在一起,即使在不同的数据中心上也可以定期相互通信。

在这个世界上,不需要互斥锁来协调变量访问,写繁重的负载。 在这个世界上,您的平台带有已在运行时中内置的三个不同的数据库( ETSDETSMnesia ),以及许多其他选项(如Agent)来处理这些情况。 甚至可以使用Riak Core之类的开源库来提供服务器内数据库,该数据库随着Web服务器的增长而自然增长。

并发级别就像您从未经历过的。 因为每个进程都是预先安排好的,所以单个处理器暂存循环无法阻止系统的其他部分像使用Node和Go这样的语言及时响应。

这改变了游戏。 开箱即用地以可靠,容错的方式满足您的所有需求,随您的应用程序的增长而自然增长,而无需维护单独的系统。 那太酷了。 这意味着,当您启动Elixir应用程序时,您必须问自己一些自己不习惯的问题,例如“我是否需要另一个数据库?”,“我是否完全需要一个缓存系统?”或“还有其他好处要考虑吗?”

附带说明一下,内置这些选项使Elixir成为嵌入式系统真正有趣的平台(有关更多信息,请参阅Nerves项目)。

比较功能

在这样的比较中谈论功能时,我们必须对其进行一些限定。 借助BEAM / OTP,您将拥有大量可供使用的工具,这些工具将使您能够根据应用程序的特定需求在应用程序中创建功能。

“特殊需求”是这里的关键部分。 在每一步中,我们都面临着挑战,即应在BEAM本身内还是作为外部系统/依赖项来满足特定需求。 下表将尝试进行这种比较。 请记住,BEAM列将反映提供给整个系统的本机功能(例如传递有序消息以支持原子操作)。

功能比较表

从上表可以看出,Redis的大多数功能都在内置选项中可用。 最大的区别只是确定系统中哪个选项有意义。 三个指定选项之间的主要区别是:

  1. ETS –基于RAM的表,单节点
  2. DETS –基于磁盘的表,单节点
  3. Mnesia –基于RAM /磁盘的事务RDBMS,在节点之间透明分布

BEAM突出显示某些功能,因为系统具有高度并发,分布式,顺序的消息传递特性,即使对于某些解决方案而言,实现某些功能(例如LRU Cache或PubSub)也不是一件容易的事。 对于地理空间,没有一个好的内置选项,但是目前,仅此而已。

结论

这并不是说您永远不需要Redis。 并非每个Elixir应用程序都必须部署到可以群集的环境中。 例如,如果您使用Phoenix频道和/或Phoenix Presence,但无法在无法集群的情况下部署到Heroku,则有些适配器可以像其他语言一样利用Redis作为中介。

通过与ElixirConf上的许多Elixir开发人员交谈,我发现一件事是,整个社区非常务实。 如果没有意义,请不要聚类。 不要仅仅因为可以就进行热部署。 同样,不要仅仅因为可以而就避免使用Redis,但是同时,不要在习惯上创建依赖项。

翻译自: https://www.javacodegeeks.com/2016/09/elixir-ets-versus-redis.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值