使用Redis的NHibernate二级缓存与仅使用Redis

Mat*_*zer 4 .net c# nhibernate second-level-cache redis

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

然后,因为一些计算会更好地加班,只是将结果存储到Redis或者更传统的NoSQL解决方案中.

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

我做了一个非常小的研究,我发现有一个Redis二级缓存提供商,现在我感到"困惑".

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

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

好的,这个问题?

是否依赖NHibernate的二级缓存Redis提供程序是一个好主意,以便获得最佳的关系和无模式世界?

你的建议是什么?

Mar*_*val 7

我看到两个不同的东西作为你的观点的摘要:

  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方法似乎对我来说很麻烦,而且通常很难找到这些错误.