func main() {
for {
rand.Seed(time.Now().Unix())
id := strconv.Itoa(rand.Intn(9) + 1) // 随机得到1-10的数字字符
result := getCache(id) // 得到结果
fmt.Println(id, result)
time.Sleep(2 * time.Second)
}
}
func getCache(id string) string {
cacheName := "cache_" + id // 缓存名字与ID关联
c := cache.New(30*time.Second, 10*time.Second)
value, found := c.Get(cacheName)
if found {
return value.(string)
} else {
c.Set(cacheName, "testdata_"+id, cache.DefaultExpiration)
return "new:testdata_" + id
}
}
还是换成这种熟悉的写法,但是输出的始终是
1 new:testdata_1
3 new:testdata_3
1 new:testdata_1
5 new:testdata_5
像第3行应该输出 1 testdata_1 才对呀
1
rimutuyuan 2020-09-21 12:28:02 +08:00
1. cache 存储在内存,程序退出后内存都释放掉了,key 也不存在了
添加以下代码可以实现你期望的结果 data2 := id.getCache() fmt.Println(data2) |
2
hbolive OP @rimutuyuan 谢谢,已经搞清楚了了,缓存随着运行结束,也会释放掉。
现在加了个 for 循环,让程序一直运行,但是还是一直输出 testdata_200,而不是 testdata_20,就像主贴里一样,很奇怪。 现在 append 了一下,想缓存名字与 id 关联起来,结果 CMD 下执行,输出的就是 testdata_乱码。 |
3
xkeyideal 2020-09-21 16:17:02 +08:00
既然是萌新就不说了,这个沙雕 cache 库别用,流量大了,你就可以收拾包裹滚蛋了
|
4
CoolSpring 2020-09-21 16:18:54 +08:00
乱码是因为 string() 并不是把数字转换成对应字符的形式,它的作用是把这个数字当作 UTF-8 值转换到对应的字符
可以用 strconv.Itoa() 或者 fmt.Sprintf() |
6
xkeyideal 2020-09-21 16:51:31 +08:00 1
@scukmh 要啥先例,一个 cache 都去找开源的,找就找了,也看看源码呀,这个裤子的过期操作简直是智障,抓紧换了吧
|
7
hbolive OP @CoolSpring 抱歉,犯了个低级错误,看来还得过几遍语法
再次 append 了,就是无法获取缓存数据 |