在以下情况下我的 spring 应用程序使用哪种缓存机制

Which caching mechanism to use in my spring application in below scenarios

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

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

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

请推荐。

谢谢

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

好的,进入实际问题;免责声明:Hazelcast 员工

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

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

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

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

我希望这能有所帮助,因为至少对我来说,像 "yes we are the best option" 这样的每一个回答对于说出它的人来说都会立即被拒绝。

使用 memcached 插件构建 InnoDB

https://dev.mysql.com/doc/refman/5.7/en/innodb-memcached.html