我的情况是我更喜欢留在 SQL Server 等关系数据库存储系统中,因为我需要处理复杂的查询。
然后,因为有些计算最好加类完成并将结果存储到 Redis 或更传统的 NoSQL 解决方案中。
这就是我的想法:NHibernate 上的二级缓存发生了什么?。
我做了一个非常小的研究,我发现有一个 Redis 二级缓存提供程序,现在我“困惑”了。
我的意思是,如果我使用 NHibernate 的二级缓存,大多数对象访问应该非常快,因为它应该没有数据库往返,因此大多数访问的对象将从内存中的 Redis 存储中检索。
为什么我要考虑这个而不是直接使用 Redis?因为我需要在我的解决方案域内进行实际的原子事务。
好的,问题是什么?
依赖 NHibernate 的二级缓存 Redis 提供程序是否是一个好主意,以便充分利用关系和无模式的世界?
你有什么建议?
最佳答案
我看到两个不同的东西作为您观点的总结:
使用redis作为NHB之上的二级缓存。这非常有意义,因为 SLC 存储分离的对象字段,而 redis 是键/值存储。我记得,SLC 包含标量查询 或映射和获取对象 的结果,但重要的是,数据是从执行的查询中获取(缓存)的。
恕我直言,如果您要以这种方式使用 Redis,则所有缓存值都必须来自 NHB 查询。这给你带来了某种事务原子性,你是如何描述的,但据我所知,当 SCL 返回陈旧数据或来自未提交事务的数据时,我们发现了几个错误。
请注意,这种方法表示某人(NHB)仍然需要以某种方式保证 RDBMS 和 Redis 之间的业务交易,这并不简单且存在错误。
另请注意,SLC 本身并不是非常快的模式。由于 SLC 包含对象的字段而不是对象本身,因此每次命中都会导致新对象的创建。所以发生的事情是从 Redis 获取数据,而不是从执行的 SQL 查询中获取结果集。因此,当您使用准备好的语句并且 RDBMS 通常为您进行缓存时,您会发现这不会为您带来非常大的性能提升。
Redis 作为独立的业务存储。您完全自己管理数据,您可以在 native (C#) 代码中进行计算(与 SQL 查询或映射对象相反)。您需要保证新鲜数据和一些交易方法。
我会选择什么?分离的redis。为什么?
- 二级缓存连同映射为您提供了一些契约(Contract),因为查询或映射对象的内容结果。您无法自行管理或使用 Redis。特别是您的缓存数据与这些查询耦合/紧密,而不是某些 API(接口(interface))和某种服务(如我所设计的那样)
- 您可以在自己的代码中计算数据。
- SLC 方法对我来说似乎有问题,而且通常很难找到这些问题。
关于c# - 使用 Redis 与仅使用 Redis 的 NHibernate 二级缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18988529/