首页 > 解决方案 > 如何在 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")})

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

标签: gomemcachedgo-gorm

解决方案


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

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

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

如果要存储一个 Go 变量的,就得想办法把值序列化,可能是使用JSONgob编码,结果字节序列可能会被存储。虽然编码形式位于内存缓存中,但 Go 变量可能会被释放(如果没有对它的引用)。

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


推荐阅读