使用Redis作为NHibernate二级缓存和仅使用Redis的区别

4
我的情境是,我更喜欢使用关系型数据库存储系统,比如SQL Server,因为我需要处理复杂的查询。然后,因为有些计算最好随着时间推移而完成,并将结果存储到类似Redis或更传统的NoSQL解决方案中。
这就是我想到的问题:NHibernate的二级缓存怎么样了?我做了一些小研究,发现有一个Redis二级缓存提供程序,现在我有些“困惑”。
我的意思是,如果我使用NHibernate的二级缓存,大多数对象访问应该非常快,因为不需要数据库往返,因此大多数访问的对象将从内存中的Redis存储中检索。为什么我考虑这个而不是直接使用Redis?因为我需要在解决方案领域内进行实际的原子事务。
好的,问题是什么?
依靠NHibernate的二级缓存Redis提供程序是为了获得关系型和无模式世界的最佳效果一个好主意吗?
您的建议是什么?
1个回答

8

根据您的观点,我看到了两件不同的事情:

  1. 在NHB之上使用redis作为二级缓存。这是有意义的,因为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方法对我来说似乎存在错误,并且经常很难找到这些错误。

也许我错了,但你的一个结论可能是使用Redis作为SCL的原因是它的分布式特性:许多相同应用程序的实例也使用NHib将与相同的分布式SCL一起工作。但正如你在回答中所述,重点根本不是性能。我错了吗? - Matías Fidemraizer
嗯,我得承认我没有意识到,但你的观点是正确的。Redis允许以分布式的方式工作,但我不认为它可以像更多的NHibernate实例和一个Redis一样工作。我认为更多的实例会覆盖一个Redis中的值。性能取决于计算的方式。Redis本身比在关系型数据库上执行类似操作要快。 - Martin Podval
你已经说服了我 :) - Matías Fidemraizer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接