如何安全地缓存我的数据库导致内存缓存

时间:2018-11-02 20:57:10

标签: go memcached go-gorm

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

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

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

更新

因此,鉴于上述功能,我想使用memcache更新它以进行缓存(以下不是存储我的用户的实际代码,只是一个示例):

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

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

1 个答案:

答案 0 :(得分:1)

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

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

您不能在内存缓存中存储“转到变量”。您可以将字节序列(字节数组)存储在内存缓存中,但这将与任何Go变量无关。当您将字节数组存储在内存缓存中时,字节序列将被“复制”。

如果要存储Go变量的 value ,则必须找到一种序列化值的方法,该方法可能使用JSONgob编码,并且可以存储结果字节序列。当编码后的表单位于内存缓存中时,可以释放Go变量(如果没有对它的引用)。

当需要缓存的值时,必须从内存缓存中检索它,并对字节片进行解码(这基本上是序列化的相反过程)。