如何在memcache中安全地缓存我的数据库结果



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

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

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

更新

因此,给定上面的函数,我想使用memcache将其更新为缓存(下面不是存储我的用户的实际代码,只是一个示例(:

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

这是进程外缓存。我只想知道,如果我把我的用户存储在这个缓存中,它不会比我的方法调用更持久。

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

除非您使用包unsafe,否则您(几乎(永远不必担心Go变量和指针:垃圾收集器将释放不可访问的值,它永远不会释放可到达的值。这是一种无形的好处,所以你不必去想它。

不能在memcache中存储"Go变量"。您可以将字节序列(字节数组(存储在memcache中,但这与任何Go变量无关。当您将字节数组存储在memcache中时,字节序列将被"复制"。

如果您想存储Go变量的,则必须找到序列化该值的方法,该方法可以使用JSON或gob编码,并且可以存储结果字节序列。当编码的表单位于memcache中时,Go变量可能会被释放(如果没有对它的引用(。

当您需要缓存的值时,您必须从memcache中检索它,并解码字节片(这基本上是序列化的反向过程(。

最新更新