
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 14v45mJPBYJW8dT7 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 @scukmh 要啥先例,一个 cache 都去找开源的,找就找了,也看看源码呀,这个裤子的过期操作简直是智障,抓紧换了吧 |
7 hbolive OP @CoolSpring 抱歉,犯了个低级错误,看来还得过几遍语法 再次 append 了,就是无法获取缓存数据 |