English 中文(简体)
• 如何从海滩上有效地储存和重新配置等级
原标题:How to efficiently store and read back a Hierarchy from cache

我的情况是,我目前正在储存库数据库中的等级,该数据库迅速接近15 000个点(5000个边缘)。 这一等级正在界定我的安全模式,其基础是树中的用户地位,允许使用以下物品。 因此,当用户要求列出所有附担保物品清单时,Im使用CTE在开始显示其年龄(缓慢)的db(并平整所有物品)中重新采购。

The hierarchy is not changing often so I ve attempted to move it into RAM ( redis ). Keeping in mind i have many subsystems that need this for security calls, and UI s to build the tree for CRUD operations.

My first attempt is to store the relationships as a key value pair (this is how its stored in the database )

       E
     /   
    F     G
   /    /  
  H  I  J    K

mapped to:
    E - [F, G]
    F - [H, I]
    G - [J, K]

因此,当我想要E和所有后代时,我会利用钥匙让孩子和孩子退学,并允许我从任何地点开始退学。 这一解决办法加快了速度,但是有15 000个节点,大约5 000个海滩被点击,以重建我们的代码树(Worse案设想......从E开始,性能从开始点起,导致超级用户看到最差的业绩)。 这仍然很迅速,但似乎在聊天。 我同样认为,在不重建我的整个海滩的情况下,我可以把它从钥匙清单中抹去任何时间的噪音。 这还快速地 light光,以需求为眼光,在国联上 build树。

第二次尝试

我的其他想法是从数据库中汲取等级,建设树木和储存,然后在RAM(再版)中把全部东西从记忆中删除(其大小为2兆吨,序列)。 这使我有一次呼吁(不是作为聊天)重新开树,把整个树木拉开出去,找到用户的母子,并放弃所有的儿童物品。 这些电话频频发,网络层的2兆吨甲基溴似乎大。 这还意味着,如果不砍伐树木、编辑和推回树木,就不易增加/去除和生产。 另外,在通过吉大港山区种植树木时,每次都不得不将2个酋长院赶下,只接收直接儿童(使用第一种解决办法的面积很小)。


因此,你认为,这种解决办法是一种更好的办法(长期而言,随着其继续增长)。 两者都很迅速,并且从数据库中抽取一些负荷。 或者说,他们有更好的方式来完成这项工作,但我还没有想到?

增 编

问题回答

让我提出一个想法。

使用过时版。 如果对图表中的节点进行了修改,则增加其版本(数据库中一个简单的现场),但其所有祖先的增量版本。

  • When getting a sub-tree from the database for the first time, cache it to RAM. (You can probably optimize this through recursive CTE and do it in a single database round-trip.)
  • However, the next time you need to retrieve the same sub-tree, retrieve only the root. Then compare the cached version with the version you just fetched from the database.
    • If they match, great, you can stop fetching and just reuse the cache.
    • If they don t, fetch the children and repeat the process, refreshing the cache as you go.

净结果是,你比以往更经常地在很早的时候,通常是在一分钟之后,ll子,而你甚至需要打上整个图表。 修改费用昂贵,但这不应成为问题,因为它们很少。

BTW, 类似原则将朝着相反的方向发展,即,当你从一页开始,需要找到通往根基的道路。 你需要以相反的方向更新版本的等级结构,但其余部分应以非常相似的方式开展工作。 即便如此,你也可以有两种方向。

--- EDIT ---

如您的数据库和指定经营实体。 NET的驱动力支持这一系统,可能值得在服务器通知中查询,例如MSK sSqlDependency 。 页: 1

基本上,你指示房舍管理司监测变化,并在发生时通知你。 这对于以高效的方式不断更新客户的切身。

If hierarchy is not changed often, you can calculate whole list of items below for each node (instead of just direct children). This way you will need significantly more RAM, but it will work lightning-fast for any user, because you will be able to read whole list of descendant nodes in single read.

举例来说(我使用JSON格式):

E - {"direct" : [F, G], "all" : [F, G, H, I, J, K]}
F - {"direct" : [H, I], "all" : [H, I]}
G - {"direct" : [J, K], "all" : [J, K]}

而对于超级用户来说,你仍需要按要求转移数据位置,但我看不出有什么办法降低数据。

我们这样做。 我们读到这 tree树,将其储存在应用海滩上,并从记忆中取用。 由于我们的变化几乎永远不会发生,变化也不必立即反映在网络上,我们甚至不会发现变化,让切身年龄和复健。 这对我们来说确实是好的。





相关问题
Anyone feel like passing it forward?

I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...

NSArray s, Primitive types and Boxing Oh My!

I m pretty new to the Objective-C world and I have a long history with .net/C# so naturally I m inclined to use my C# wits. Now here s the question: I feel really inclined to create some type of ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

How to Use Ghostscript DLL to convert PDF to PDF/A

How to user GhostScript DLL to convert PDF to PDF/A. I know I kind of have to call the exported function of gsdll32.dll whose name is gsapi_init_with_args, but how do i pass the right arguments? BTW, ...

Linqy no matchy

Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...