gpt4 book ai didi

go - 如何安全地将我的数据库结果缓存在内存缓存中

转载 作者:数据小太阳 更新时间:2023-10-29 03:10:19 25 4
gpt4 key购买 nike

我有返回用户的函数。我正在为我的数据库 ORM 使用 gorm:

func (dbs *DbService) GetUser(userId string) User {
var user = &User{}
dbs.db..Find(&user)
return user
}

如果我缓存结果,即用户,这是否会导致内存分配问题,因为我将用户放在引用类型的缓存中,所以它会导致变量 user 超出此函数的范围?

更新

鉴于上述功能,我想使用 memcache 将其更新为缓存(下面不是存储我的用户的实际代码,只是一个例子):

mc.Set(&memcache.Item{Key: "foo", Value: []byte("my value")})

这是进程外缓存。我只是想知道,如果我将我的用户存储在此缓存中,它不会比我的方法调用更有效。

最佳答案

Memcache 和 Go 变量(Go 指针)彼此无关。

除非你使用包 unsafe,否则你(几乎)永远不必担心 Go 变量和指针:垃圾收集器将释放无法访问的值,并且永远不会释放可访问的值。这是一种看不见的好处,因此您不必考虑这一点。

你不能在内存缓存中存储“Go 变量”。您可以将字节序列(字节数组)存储在内存缓存中,但这将独立于任何 Go 变量。当你在 memcache 中存储字节数组时,字节序列将被“复制”。

如果你想存储 Go 变量的,你必须找到一种方法来序列化该值,这可能是使用 JSONgob编码,并且可以存储结果字节序列。当编码形式位于内存缓存中时,Go 变量可能会被释放(如果没有对它的引用)。

当你需要缓存的值时,你必须从内存缓存中检索它,并解码字节 slice (这基本上是序列化的逆过程)。

关于go - 如何安全地将我的数据库结果缓存在内存缓存中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53125737/

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