gpt4 book ai didi

java - Redis 是否使用对象引用?

转载 作者:可可西里 更新时间:2023-11-01 11:14:08 25 4
gpt4 key购买 nike

我正在尝试评估缓存技术的多种选择。我最终决定将 Redis/Elasticache 与 Redis 一起使用。在了解了 Redis 持久化、复制机制、分片/集群、命令和使用 Redis 进行内存管理之后,我最终决定使用 Redis 设计我的缓存引擎。

但就在一开始,我遇到了一个关键的设计问题

我的应用程序处理森林类型的数据结构(即树中树)。增强我的缓存。我决定设计 3 个缓存'

  1. 将维护森林列表的第一个缓存
  2. 当用户将森林从一棵树遍历到另一棵树时。指向当前Tree的指针会保存在Second cache中
  3. 随着用户遍历每棵树的节点,指向当前节点的指针会被维护在3rd Cache中

简单来说,第三缓存(节点)的元素必须指向第二缓存(树)的元素,而第二缓存(树)必须指向第一缓存(森林)的元素。

但问题是 Redis 不像 Java 那样维护对对象的引用。换句话说,如果我在 Java 或 Spring 中创建了相同的缓存,那么我的第一个缓存将保存森林,第二个缓存将只维护一个指向第一个缓存中当前树的指针,而第三个缓存将维护一个指向第二个缓存指向的树中的节点。

以这种使用引用的方式,我会节省大量内存,因为我只是在第一个缓存中加载森林的一个实例,而其他缓存元素只是保存指向第一个缓存的指针/引用。

如果在 redis 中做同样的事情,每个 keystore 实际上将存储对象的完整实例,这意味着第一个缓存将存储完整的林,第二个缓存将保存当前树的不同实例,thirst 将保存当前实例树节点。

考虑一个大小为 10 GB 的森林,每棵树的大小为 500 MB,当前节点的平均大小为 50 MB,那么对于一个遍历树的用户,redis 将保持 10 GB + 500 MB + 50 MB = 100550 MB 的平均内存片刻。假设我有 100 个当前用户登录并使用同一个林,那么我的内存使用量将为 10 GB + (500 MB x 10) + (50 MB x 10) = 150500 MB

但是,如果我使用基于 Java 的缓存引擎,那么无论有多少用户,我的利用率将始终仅为 10GB,因为一旦加载了森林,其他缓存将只保存对象引用,占用的空间可以忽略不计。

对此有任何想法。是否可以使用 Redis 来存储对已存储对象的引用而不是创建新实例?

最佳答案

在最基本的层面上,Redis 存储标量值,所以不,它不会像您想象的那样工作。但是,您可以使用集合和哈希(或字符串)的组合来伪造它。假设您使用 12345|TREE 等缓存键(其中 12345 是树的 ID)将每个单独的树项存储为散列(或 JSON 字符串,以更适合您的情况为准)。然后,您就有了一组存储所有树 ID 的位置。

sadd TREES 12345 12346 12347 (etc)
hset 12345|TREE node1 node1value
hset 12345|TREE node2 node2value

类似地,为当前树的用户和单个项目创建一个集合,并对单个节点执行相同的操作。

sadd USERS mgandhi froosevelt nmandela
set mgandhi|TREEID 12345
set froosevelt|TREEID 12346

set mgandhi|NODEID 1
set froosevelt|NODEID 2

然后可以使用SORT命令找出每个用户的位置:https://redis.io/commands/sort (即使您不需要对结果进行排序):

sort TREES by nosort get *|TREEID get *|NODEID

希望对你有用。

关于java - Redis 是否使用对象引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57639686/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com