4

我的场景是我更喜欢留在像 SQL Server 这样的关系数据库存储系统中,因为我需要处理复杂的查询。

然后,因为一些计算最好加班完成,并将结果存储到 Redis 之类的东西中,或者可能是更传统的 NoSQL 解决方案。

这就是我的想法:NHibernate 上的二级缓存发生了什么?.

我做了一个很小的研究,发现有一个 Redis 二级缓存提供程序,现在我“困惑”了。

我的意思是,如果我使用 NHibernate 的二级缓存,大多数对象访问应该非常快,因为它应该没有数据库往返,因此大多数访问的对象将从内存中的 Redis 存储中检索。

为什么我要考虑这个而不是直接使用 Redis?因为我需要解决方案域中的实际原子事务。

好的,问题?

依靠 NHibernate 的二级缓存 Redis 提供程序来获得最好的关系和无模式世界是一个好主意吗?

你有什么建议?

4

1 回答 1

8

作为您观点的总结,我看到了两件不同的事情:

  1. 使用 redis 作为 NHB 之上的二级缓存。这很有意义,因为 SLC 存储对象的分离字段,而 redis 是键/值存储。我记得,SLC 包含标量查询映射和获取的对象的结果,但重要的是,数据是从执行的查询中获取(缓存)的。

    恕我直言,如果您以这种方式使用 redis,则所有缓存值都必须来自 NHB 查询。这给你带来了某种事务原子性,你是如何描述的,但据我所知,当 SCL 返回陈旧数据或来自未提交事务的数据时,我们发现了几个错误。

    请注意,这种方法表示某人 (NHB) 仍然需要以某种方式保证 RDBMS 和 Redis 之间的业务事务,这并不简单和错误。

    另请注意,SLC 本身并不是非常快的模式。由于 SLC 包含对象字段而不是对象本身,因此每次命中都会导致新对象的创建。所以发生的事情是从 Redis 获取数据,而不是从执行的 SQL 查询中获取结果集。因此,当您使用准备好的语句并且 RDBMS 通常为您进行缓存时,您会发现这并没有为您带来很大的性能提升。

  2. Redis 作为一个独立的商业存储。您完全自己管理数据,您可以在本机 (C#) 代码中进行计算(与 SQL 查询或映射对象相反)。您需要保证新鲜的数据和一些交易方法。

我会选择什么?分离的redis。为什么?

  1. 二级缓存与映射一起为您提供一些合同,因为内容来自查询或映射对象。你不能自己管理或使用 Redis。特别是您的缓存数据与这些查询耦合/紧密,而不是与某些 API(接口)和某种服务(正如我将设计的那样)
  2. 您可以在自己的代码中计算数据。
  3. SLC 方法对我来说似乎是错误的,而且通常很难找到这些错误。
于 2013-09-25T10:59:29.333 回答