go - 如何在 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 指针)彼此无关。
除非您使用 package unsafe
,否则您(几乎)永远不必担心 Go 变量和指针:垃圾收集器将释放无法访问的值,并且永远不会释放可访问的值。这是一种看不见的好处,所以你不必考虑这一点。
您不能在 memcache 中存储“Go variables”。您可以将字节序列(字节数组)存储在 memcache 中,但这将独立于任何 Go 变量。当您在 memcache 中存储字节数组时,字节序列将被“复制”。
如果要存储一个 Go 变量的值,就得想办法把值序列化,可能是使用JSON或gob编码,结果字节序列可能会被存储。虽然编码形式位于内存缓存中,但 Go 变量可能会被释放(如果没有对它的引用)。
当你需要缓存的值时,你必须从 memcache 中检索它,并解码字节切片(这基本上是序列化的逆过程)。
推荐阅读
- geoserver - SLD 过滤器 MAX 功能
- elasticsearch - 在elasticsearch中为每个匹配获取“n”记录
- ios - 为什么更新功能在 Unity 中 UnityARWorldMap 场景的 UnityARHitTestExample 中不起作用?
- gherkin - PageObject 在 CodeceptJS 中传入 Stepfiles
- python - 如何避免具有多列的 numpy-arrays 的总和不太精确
- javascript - 配置 JQuery Price-Slider
- html - attr() 可以读取子元素的属性吗?
- ios - 找不到 -ljschelpers 的库
- java - 接收来自 FCM 的未注册 Android 设备的多个 nack 通知 | 爪哇
- vue.js - Vue CLI 3 创建了大量“*.hot-update.js”文件。如何防止这种情况?