“真实” 分布式缓存中的对象引用?
我个人致力于 .net 分布式缓存解决方案,但我认为这个问题在所有平台上都很有趣。
是否存在分布式缓存解决方案(或通用策略),允许在缓存中存储对象,同时保持它们之间引用的完整性?
举个例子 - 假设我有一个对象 Foo foo
,它引用了一个对象 Bar bar
,还有一个对象 Foo foo2
引用了相同的 酒吧酒吧。 如果我将
foo
加载到缓存,bar
的副本也会随之存储。 如果我还将 foo2
加载到缓存中,则会同时存储 bar
的单独副本。 如果我更改缓存中的 foo.bar
,该更改不会影响 foo2.bar
:(
是否存在现有的分布式缓存解决方案,使我能够加载 foo
、foo2
和 bar
放入缓存,同时维护 foo.bar
foo2.bar
引用?
I'm personally committed to .net distributed caching solutions, but I think this question is interesting across all platforms.
Is there a distributed caching solution (or generic strategy) that allows to both store objects in the cache while maintaining the integrity of the references between them?
To exemplify - Suppose I have an object Foo foo
that references an object Bar bar
and also and object Foo foo2
that references that same Bar bar
. If I load foo
to the cache, a copy of bar
is stored along with it. If I also load foo2
to the cache, a separate copy of bar
is stored along with that. If I change foo.bar
in the cache, the change does not impact foo2.bar
:(
Is there an existing distributed cache solution that will enable me to load foo
, foo2
and bar
into the cache while maintaining the foo.bar
foo2.bar
references?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
首先,也是最重要的
我不知道任何分布式系统,我也不会假装构建一个。 这篇文章解释了如何使用带有可序列化对象的 IObjectReference 接口通过 .NET 和 C# 模拟此行为。
现在,让我们继续演示
我不知道有这样的分布式系统,但是您可以使用 IObjectReference 接口。 您的 ISerialized.GetObjectData 的实现需要调用 SerializationInfo.SetType 指出实现 IObjectReference 的代理类,并且能够(在 GetObjectData 方法提供的数据的帮助下)获取对应该使用的真实对象的引用。
示例代码:
此代码将从 GetObjectData 方法中使用 SerializationProxy.PrepareSerialization(info, myKey, myKey => LoadedInstances.GetById(myKey)) 调用,并且 LoadedInstances.GetById 应从 Dictionary返回实例。 或从缓存/数据库加载它(如果尚未加载)。
编辑:
我写了一些示例代码来说明我的意思。
First and foremost
I do not know of any distributed system, and I do not pretend to build one. This post explains how you can simulate this behavior with .NET and C# using the IObjectReference interface with serializable objects.
Now, lets go on with the show
I do not know of such a distributed system, but you can somewhat easily achive this with .NET using the IObjectReference interface. Your implementation of ISerializable.GetObjectData would need to call SerializationInfo.SetType to point out a proxy class that implements IObjectReference, and would be able (with help from data provided by your GetObjectData method) to get a reference to the real object that should be used.
Example code:
This code would be called with SerializationProxy.PrepareSerialization(info, myKey, myKey => LoadedInstances.GetById(myKey)) from your GetObjectData method, and your LoadedInstances.GetById should return the instance from a Dictionary<TKey, WeakReference> or load it from cache/database if it isnt already loaded.
EDIT:
I've wrote some example code to show what I mean.