spring-boot - 在以下场景中我的 spring 应用程序中使用哪种缓存机制

标签 spring-boot redis mariadb ehcache hazelcast

我们正在使用带有 Maria DB 数据库的 Spring boot 应用程序。我们从不同的服务获取数据并存储在我们的数据库中。在调用其他服务时,我们需要从数据库中获取数据(基于映射)并调用该服务。 因此,为了避免数据库命中,我们希望将所有映射数据缓存在缓存中,并使用它来检索数据和调用服务 API。

所以我们的问题是——在数据库中创建数据时将数据添加到缓存中(最多可以添加数百万条记录),并在其中一个列值的状态为“xyz”(例如)或基于驱逐时从缓存中删除政策。

我们应该使用 Hazelcast/ehCache 还是 Redis/Couch base 的内存缓存?

请提出建议。

谢谢

最佳答案

我基本同意 Rick 的观点,即在您需要它之前不要构建它,但是现在重要的是尽早考虑这个缓存层以后适合的位置以及如何集成它(例如使用接口(interface))。将其添加到未准备好的系统中总是可行的,但要昂贵得多(以小时计)且复杂。

确定实际问题;免责声明:Hazelcast 员工

一般来说,对于缓存,Hazelcast、ehcache、Redis 等都是不错的选择。不过,你想问自己的第一个问题是,“我可以在一台机器的内存中保存所有必要的记录吗?特别是在 ehcache 方面,你得到复制(所有机器保存所有信息),这意味着每个节点都需要保留它们在内存中。根据您要缓存的大小,可能不是最优的。在这种情况下,Hazelcast 可能是更好的选择,因为我们在集群中分区数据并优化对单个网络跃点的访问,从而最小化网络延迟开销。

第二个问题是关于序列化的。您是想以高度优化的序列化方式存储信息(需要代码转换为人类可读),还是想存储为 JSON?

第三个问题是关于将访问数据存储的客户端和线程的数量。显然,像 ehcache 这样的本地缓存始终是最快的选择,以权衡大量内存。除此之外,最重要的事实是内存存储使用的踩踏模型。它要么是多线程的并且可以很好地缩放,要么是单线程概念,当你耗尽这个线程时它会成为瓶颈。这是为了克服更多的流程,但它是一种解决方法,可以充分利用当今的系统。

更笼统地说,您提到的每个系统都可以完成这项工作。然而,最好的工具应该由 POC/原型(prototype)和您的真实世界用例来选择。重要的一点是现实世界,因为单个线程在低压下表现出色(显然速度更快),但当耗尽时将成为主要瓶颈(再次明显延迟响应)。

我希望这能有所帮助,因为至少对我来说,每一个像“是的,我们是最好的选择”这样的回答都会让说这句话的人立即拒绝。

关于spring-boot - 在以下场景中我的 spring 应用程序中使用哪种缓存机制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46208512/

相关文章:

go - 使用 BLPOP 处理 Redis 队列会导致单元测试中出现竞争条件?

debian - MariaDB的配置文件是什么?

mysql - 如何在sql的where子句中输入随机数

java - 映射异常 : Couldn't find PersistentEntity while implementing AbstractElasticsearchConfiguration

redis - key 名称对于 eval 是事先不知道的

java - 自动增量字段不返回值(非主键) - Spring boot JPA

database - 在redis中存储一个二维数组

mysql - MariaDB 循环的隐式游标似乎不起作用

linux - 即使在 session 超时后如何使 spring-boot 应用程序保持事件状态

mysql - 带 hibernate 功能的 Spring Boot : Auto-generating database schema with columns which can holds fractions of seconds