【问题标题】:NHibernate second-level cache using Redis vs just using RedisNHibernate 二级缓存使用 Redis 与仅使用 Redis
【发布时间】:2013-09-30 01:51:46
【问题描述】:

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

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

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

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

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

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

好的,这个问题?

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

你有什么建议?

【问题讨论】:

    标签: c# .net nhibernate redis second-level-cache


    【解决方案1】:

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

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

    【讨论】:

    • 也许我错了,但您的结论之一是使用 Redis 作为 SCL 的意义在于它的分布式特性:同一应用程序的许多实例也使用 NHib 可以工作具有相同的分布式 SCL。但正如您在回答中所说,重点根本不是性能。我错了吗?
    • 好吧,我承认我没有意识到,但你的观点是正确的。 Redis 允许在分布式性质下工作,但我认为它不能像更多 Nhibernate 实例和一个 Redis 那样工作。我认为更多实例会覆盖一个 Redis 中的值。性能取决于计算方式。 Redis 本身比 RDBMS 上的类似操作要快。
    • 你说服了我 :)
    猜你喜欢
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    • 2018-04-03
    • 2011-03-21
    • 2021-07-02
    • 2022-08-03
    • 2020-11-02
    • 2014-11-06
    相关资源
    最近更新 更多