c# - 使用 Redis 与仅使用 Redis 的 NHibernate 二级缓存

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

我的情况是我更喜欢留在 SQL Server 等关系数据库存储系统中,因为我需要处理复杂的查询。

然后,因为有些计算最好加类完成并将结果存储到 Redis 或更传统的 NoSQL 解决方案中。

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

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

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

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

好的,问题是什么?

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

你有什么建议?

最佳答案

我看到两个不同的东西作为您观点的总结:

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

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

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

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

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

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

  1. 二级缓存连同映射为您提供了一些契约(Contract),因为查询或映射对象的内容结果。您无法自行管理或使用 Redis。特别是您的缓存数据与这些查询耦合/紧密,而不是某些 API(接口(interface))和某种服务(如我所设计的那样)
  2. 您可以在自己的代码中计算数据。
  3. SLC 方法对我来说似乎有问题,而且通常很难找到这些问题。

关于c# - 使用 Redis 与仅使用 Redis 的 NHibernate 二级缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18988529/

相关文章:

c# - 大型接口(interface)的统一错误处理

c# - 无法找到 Net Core NHibernate System.Data.SQLite

c# - 在 HQL 查询中使用 nhibernate <loader> 元素

nHibernate 不检索手动更改的数据

c# - Windows 2000 SP4 上的单声道

c# - DataGrid 项目源绑定(bind)不更新和 WPF 中的绑定(bind)不起作用

c# - 当消息是部分消息时,SocketAsyncEventArgs和缓冲

c# - 在 C# 中实现 JS Eval

c# - 是否有适用于 .NET 的声音 SDK?

c# - 如何将 BitmapImage 图像转换为数据,以便我可以通过 Windows Phone 7 的 HTTP POST 请求将其上传到 Web?