[{"data":1,"prerenderedAt":1758},["ShallowReactive",2],{"content:\u002F2025\u002F07\u002Fgo-cache":3,"surround:\u002F2025\u002F07\u002Fgo-cache":1749},{"id":4,"title":5,"body":6,"categories":1725,"date":1727,"description":1728,"draft":1729,"extension":1730,"image":1731,"meta":1732,"navigation":118,"path":1734,"permalink":1731,"published":1731,"readingTime":1735,"recommend":1731,"references":1731,"seo":1740,"sitemap":1741,"stem":1742,"tags":1743,"type":1746,"updated":1747,"__hash__":1748},"content\u002Fposts\u002F2025\u002F07\u002Fgo-cache.md","Go Cache 单机缓存使用与原理",{"type":7,"value":8,"toc":1712},"minimark",[9,21,25,50,53,182,185,332,335,338,918,921,925,1081,1118,1122,1127,1410,1413,1416,1420,1694,1697,1708],[10,11,12],"blockquote",{},[13,14,15,16,20],"p",{},"go-cache 是一个 golang 的缓存库, 用于缓存 k, v 对, 缓存时间过期后存储的值会失效, 底层是一个 map, 过期后内部 Item 是不会自动清除, 需要手动调用",[17,18,19],"code",{"code":19},"DeleteExpired","方法清除过期项",[22,23,24],"h2",{"id":24},"安装",[26,27,32],"pre",{"className":28,"code":29,"language":30,"meta":31,"style":31},"language-bash shiki shiki-themes github-light github-dark","go get github.com\u002Fpatrickmn\u002Fgo-cache\n","bash","",[17,33,34],{"__ignoreMap":31},[35,36,39,43,47],"span",{"class":37,"data-line":38,"line":38},"line",1,[35,40,42],{"class":41},"sScJk","go",[35,44,46],{"class":45},"sZZnC"," get",[35,48,49],{"class":45}," github.com\u002Fpatrickmn\u002Fgo-cache\n",[22,51,52],{"id":52},"使用方法",[26,54,57],{"className":55,"code":56,"language":42,"meta":31,"style":31},"language-go shiki shiki-themes github-light github-dark","\u002F\u002F 创建Cache对象, 第一个参数为缓存时间, 第二个参数为清理缓存项的时间间隔\n\u002F\u002F 底层是一个map, 过期后内部Item是不会自动清除\nc := cache.New(30*time.Second, 1*time.Minute)\n\n\u002F\u002F 设置k, v对\nc.Set(\"name\", \"codepzj\", cache.DefaultExpiration)\n\n\u002F\u002F 获得k, v对, found 为false则代表过期\nval, found := c.Get(\"name\")\n",[17,58,59,65,71,113,120,126,151,156,162],{"__ignoreMap":31},[35,60,61],{"class":37,"data-line":38,"line":38},[35,62,64],{"class":63},"sJ8bj","\u002F\u002F 创建Cache对象, 第一个参数为缓存时间, 第二个参数为清理缓存项的时间间隔\n",[35,66,68],{"class":37,"data-line":67,"line":67},2,[35,69,70],{"class":63},"\u002F\u002F 底层是一个map, 过期后内部Item是不会自动清除\n",[35,72,74,78,82,85,88,92,96,99,102,105,107,110],{"class":37,"data-line":73,"line":73},3,[35,75,77],{"class":76},"sVt8B","c ",[35,79,81],{"class":80},"szBVR",":=",[35,83,84],{"class":76}," cache.",[35,86,87],{"class":41},"New",[35,89,91],{"class":90},"sSDpw","(",[35,93,95],{"class":94},"sj4cs","30",[35,97,98],{"class":80},"*",[35,100,101],{"class":76},"time.Second, ",[35,103,104],{"class":94},"1",[35,106,98],{"class":80},[35,108,109],{"class":76},"time.Minute",[35,111,112],{"class":90},")\n",[35,114,116],{"class":37,"data-line":115,"line":115},4,[35,117,119],{"emptyLinePlaceholder":118},true,"\n",[35,121,123],{"class":37,"data-line":122,"line":122},5,[35,124,125],{"class":63},"\u002F\u002F 设置k, v对\n",[35,127,129,132,135,137,140,143,146,149],{"class":37,"data-line":128,"line":128},6,[35,130,131],{"class":76},"c.",[35,133,134],{"class":41},"Set",[35,136,91],{"class":90},[35,138,139],{"class":45},"\"name\"",[35,141,142],{"class":76},", ",[35,144,145],{"class":45},"\"codepzj\"",[35,147,148],{"class":76},", cache.DefaultExpiration",[35,150,112],{"class":90},[35,152,154],{"class":37,"data-line":153,"line":153},7,[35,155,119],{"emptyLinePlaceholder":118},[35,157,159],{"class":37,"data-line":158,"line":158},8,[35,160,161],{"class":63},"\u002F\u002F 获得k, v对, found 为false则代表过期\n",[35,163,165,168,170,173,176,178,180],{"class":37,"data-line":164,"line":164},9,[35,166,167],{"class":76},"val, found ",[35,169,81],{"class":80},[35,171,172],{"class":76}," c.",[35,174,175],{"class":41},"Get",[35,177,91],{"class":90},[35,179,139],{"class":45},[35,181,112],{"class":90},[22,183,184],{"id":184},"其他参数",[186,187,188,208],"table",{},[189,190,191],"thead",{},[192,193,194,199,202,205],"tr",{},[195,196,198],"th",{"align":197},"left","方法名",[195,200,201],{"align":197},"类型",[195,203,204],{"align":197},"说明",[195,206,207],{"align":197},"示例",[209,210,211,230,247,264,281,298,315],"tbody",{},[192,212,213,219,222,225],{},[214,215,216],"td",{"align":197},[17,217,218],{"code":218},"GetWithExpiration(key)",[214,220,221],{"align":197},"方法",[214,223,224],{"align":197},"获取值和过期时间",[214,226,227],{"align":197},[17,228,229],{"code":229},"val, exp, found := c.GetWithExpiration(\"k\")",[192,231,232,237,239,242],{},[214,233,234],{"align":197},[17,235,236],{"code":236},"Add(key, value, duration)",[214,238,221],{"align":197},[214,240,241],{"align":197},"添加新项，若存在返回错误",[214,243,244],{"align":197},[17,245,246],{"code":246},"err := c.Add(\"k\", \"v\", 1*time.Hour)",[192,248,249,254,256,259],{},[214,250,251],{"align":197},[17,252,253],{"code":253},"Replace(key, value, duration)",[214,255,221],{"align":197},[214,257,258],{"align":197},"替换已存在项，否则报错",[214,260,261],{"align":197},[17,262,263],{"code":263},"err := c.Replace(\"k\", \"new\", 2*time.Minute)",[192,265,266,271,273,276],{},[214,267,268],{"align":197},[17,269,270],{"code":270},"Delete(key)",[214,272,221],{"align":197},[214,274,275],{"align":197},"删除指定 key",[214,277,278],{"align":197},[17,279,280],{"code":280},"c.Delete(\"k\")",[192,282,283,288,290,293],{},[214,284,285],{"align":197},[17,286,287],{"code":287},"DeleteExpired()",[214,289,221],{"align":197},[214,291,292],{"align":197},"删除所有过期项",[214,294,295],{"align":197},[17,296,297],{"code":297},"c.DeleteExpired()",[192,299,300,305,307,310],{},[214,301,302],{"align":197},[17,303,304],{"code":304},"Flush()",[214,306,221],{"align":197},[214,308,309],{"align":197},"清空所有缓存项",[214,311,312],{"align":197},[17,313,314],{"code":314},"c.Flush()",[192,316,317,322,324,327],{},[214,318,319],{"align":197},[17,320,321],{"code":321},"Items()",[214,323,221],{"align":197},[214,325,326],{"align":197},"返回所有缓存项（包含过期未清理的）",[214,328,329],{"align":197},[17,330,331],{"code":331},"items := c.Items()",[22,333,334],{"id":334},"示例代码",[13,336,337],{},"这里写一个简单的示例代码, 使用 gin 框架",[26,339,341],{"className":55,"code":340,"language":42,"meta":31,"style":31},"package main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"github.com\u002Fgin-gonic\u002Fgin\"\n\t\"github.com\u002Fpatrickmn\u002Fgo-cache\"\n)\n\nfunc main() {\n\tr := gin.Default()\n\tc := cache.New(30*time.Second, 1*time.Minute)\n\tr.GET(\"\u002F\", func(ctx *gin.Context) {\n\t\tc.Set(\"name\", \"codepzj\", cache.DefaultExpiration)\n\t\tctx.String(200, \"set name successfully\")\n\t})\n\tr.GET(\"\u002Fcache\", func(ctx *gin.Context) {\n\t\tfmt.Println(\"cache items\", c.Items())\n\t\tval, exp, found := c.GetWithExpiration(\"name\")\n\t\tif found {\n\t\t\tctx.String(200, \"get cache successfully, value %s, expired at %s\", val, exp.Format(\"2006-01-02 15:04:05\"))\n\t\t\treturn\n\t\t}\n\t\tctx.String(200, \"get cache failed, expired\")\n\t})\n\tr.GET(\"\u002Fdelete\", func(ctx *gin.Context) {\n\t\tc.Delete(\"name\")\n\t\tctx.String(200, \"delete cache successfully\")\n\t})\n\tr.Run(\":8080\")\n}\n",[17,342,343,351,355,366,381,392,396,407,418,422,427,446,467,496,541,564,589,601,637,667,690,705,752,764,776,798,809,845,863,885,896,913],{"__ignoreMap":31},[35,344,345,348],{"class":37,"data-line":38,"line":38},[35,346,347],{"class":80},"package",[35,349,350],{"class":41}," main\n",[35,352,353],{"class":37,"data-line":67,"line":67},[35,354,119],{"emptyLinePlaceholder":118},[35,356,357,360,363],{"class":37,"data-line":73,"line":73},[35,358,359],{"class":80},"import",[35,361,362],{"class":76}," ",[35,364,365],{"class":90},"(\n",[35,367,368,372,375,378],{"class":37,"data-line":115,"line":115},[35,369,371],{"class":370},"indent","\t",[35,373,374],{"class":45},"\"",[35,376,377],{"class":41},"fmt",[35,379,380],{"class":45},"\"\n",[35,382,383,385,387,390],{"class":37,"data-line":122,"line":122},[35,384,371],{"class":370},[35,386,374],{"class":45},[35,388,389],{"class":41},"time",[35,391,380],{"class":45},[35,393,394],{"class":37,"data-line":128,"line":128},[35,395,119],{"emptyLinePlaceholder":118},[35,397,398,400,402,405],{"class":37,"data-line":153,"line":153},[35,399,371],{"class":370},[35,401,374],{"class":45},[35,403,404],{"class":41},"github.com\u002Fgin-gonic\u002Fgin",[35,406,380],{"class":45},[35,408,409,411,413,416],{"class":37,"data-line":158,"line":158},[35,410,371],{"class":370},[35,412,374],{"class":45},[35,414,415],{"class":41},"github.com\u002Fpatrickmn\u002Fgo-cache",[35,417,380],{"class":45},[35,419,420],{"class":37,"data-line":164,"line":164},[35,421,112],{"class":90},[35,423,425],{"class":37,"data-line":424,"line":424},10,[35,426,119],{"emptyLinePlaceholder":118},[35,428,430,433,436,438,441,443],{"class":37,"data-line":429,"line":429},11,[35,431,432],{"class":80},"func",[35,434,435],{"class":41}," main",[35,437,91],{"class":90},[35,439,440],{"class":90},")",[35,442,362],{"class":76},[35,444,445],{"class":90},"{\n",[35,447,449,451,454,456,459,462,465],{"class":37,"data-line":448,"line":448},12,[35,450,371],{"class":370},[35,452,453],{"class":76},"r ",[35,455,81],{"class":80},[35,457,458],{"class":76}," gin.",[35,460,461],{"class":41},"Default",[35,463,91],{"class":464},"sJX2D",[35,466,112],{"class":464},[35,468,470,472,474,476,478,480,482,484,486,488,490,492,494],{"class":37,"data-line":469,"line":469},13,[35,471,371],{"class":370},[35,473,77],{"class":76},[35,475,81],{"class":80},[35,477,84],{"class":76},[35,479,87],{"class":41},[35,481,91],{"class":464},[35,483,95],{"class":94},[35,485,98],{"class":80},[35,487,101],{"class":76},[35,489,104],{"class":94},[35,491,98],{"class":80},[35,493,109],{"class":76},[35,495,112],{"class":464},[35,497,499,501,504,507,509,512,514,516,519,523,526,529,532,535,537,539],{"class":37,"data-line":498,"line":498},14,[35,500,371],{"class":370},[35,502,503],{"class":76},"r.",[35,505,506],{"class":41},"GET",[35,508,91],{"class":464},[35,510,511],{"class":45},"\"\u002F\"",[35,513,142],{"class":76},[35,515,432],{"class":80},[35,517,91],{"class":518},"sqkie",[35,520,522],{"class":521},"s4XuR","ctx",[35,524,525],{"class":80}," *",[35,527,528],{"class":41},"gin",[35,530,531],{"class":76},".",[35,533,534],{"class":41},"Context",[35,536,440],{"class":518},[35,538,362],{"class":76},[35,540,445],{"class":518},[35,542,544,546,548,550,552,554,556,558,560,562],{"class":37,"data-line":543,"line":543},15,[35,545,371],{"class":370},[35,547,371],{"class":370},[35,549,131],{"class":76},[35,551,134],{"class":41},[35,553,91],{"class":90},[35,555,139],{"class":45},[35,557,142],{"class":76},[35,559,145],{"class":45},[35,561,148],{"class":76},[35,563,112],{"class":90},[35,565,567,569,571,574,577,579,582,584,587],{"class":37,"data-line":566,"line":566},16,[35,568,371],{"class":370},[35,570,371],{"class":370},[35,572,573],{"class":76},"ctx.",[35,575,576],{"class":41},"String",[35,578,91],{"class":90},[35,580,581],{"class":94},"200",[35,583,142],{"class":76},[35,585,586],{"class":45},"\"set name successfully\"",[35,588,112],{"class":90},[35,590,592,594,596,599],{"class":37,"data-line":591,"line":591},17,[35,593,371],{"class":370},[35,595,31],{"class":76},[35,597,598],{"class":518},"}",[35,600,112],{"class":464},[35,602,604,606,608,610,612,615,617,619,621,623,625,627,629,631,633,635],{"class":37,"data-line":603,"line":603},18,[35,605,371],{"class":370},[35,607,503],{"class":76},[35,609,506],{"class":41},[35,611,91],{"class":464},[35,613,614],{"class":45},"\"\u002Fcache\"",[35,616,142],{"class":76},[35,618,432],{"class":80},[35,620,91],{"class":518},[35,622,522],{"class":521},[35,624,525],{"class":80},[35,626,528],{"class":41},[35,628,531],{"class":76},[35,630,534],{"class":41},[35,632,440],{"class":518},[35,634,362],{"class":76},[35,636,445],{"class":518},[35,638,640,642,644,647,650,652,655,658,661,663,665],{"class":37,"data-line":639,"line":639},19,[35,641,371],{"class":370},[35,643,371],{"class":370},[35,645,646],{"class":76},"fmt.",[35,648,649],{"class":41},"Println",[35,651,91],{"class":90},[35,653,654],{"class":45},"\"cache items\"",[35,656,657],{"class":76},", c.",[35,659,660],{"class":41},"Items",[35,662,91],{"class":464},[35,664,440],{"class":464},[35,666,112],{"class":90},[35,668,670,672,674,677,679,681,684,686,688],{"class":37,"data-line":669,"line":669},20,[35,671,371],{"class":370},[35,673,371],{"class":370},[35,675,676],{"class":76},"val, exp, found ",[35,678,81],{"class":80},[35,680,172],{"class":76},[35,682,683],{"class":41},"GetWithExpiration",[35,685,91],{"class":90},[35,687,139],{"class":45},[35,689,112],{"class":90},[35,691,693,695,697,700,703],{"class":37,"data-line":692,"line":692},21,[35,694,371],{"class":370},[35,696,371],{"class":370},[35,698,699],{"class":80},"if",[35,701,702],{"class":76}," found ",[35,704,445],{"class":90},[35,706,708,710,712,714,716,718,720,722,724,727,730,733,735,737,740,743,745,748,750],{"class":37,"data-line":707,"line":707},22,[35,709,371],{"class":370},[35,711,371],{"class":370},[35,713,371],{"class":370},[35,715,573],{"class":76},[35,717,576],{"class":41},[35,719,91],{"class":464},[35,721,581],{"class":94},[35,723,142],{"class":76},[35,725,726],{"class":45},"\"get cache successfully, value ",[35,728,729],{"class":94},"%s",[35,731,732],{"class":45},", expired at ",[35,734,729],{"class":94},[35,736,374],{"class":45},[35,738,739],{"class":76},", val, exp.",[35,741,742],{"class":41},"Format",[35,744,91],{"class":518},[35,746,747],{"class":45},"\"2006-01-02 15:04:05\"",[35,749,440],{"class":518},[35,751,112],{"class":464},[35,753,755,757,759,761],{"class":37,"data-line":754,"line":754},23,[35,756,371],{"class":370},[35,758,371],{"class":370},[35,760,371],{"class":370},[35,762,763],{"class":80},"return\n",[35,765,767,769,771,773],{"class":37,"data-line":766,"line":766},24,[35,768,371],{"class":370},[35,770,371],{"class":370},[35,772,31],{"class":76},[35,774,775],{"class":90},"}\n",[35,777,779,781,783,785,787,789,791,793,796],{"class":37,"data-line":778,"line":778},25,[35,780,371],{"class":370},[35,782,371],{"class":370},[35,784,573],{"class":76},[35,786,576],{"class":41},[35,788,91],{"class":90},[35,790,581],{"class":94},[35,792,142],{"class":76},[35,794,795],{"class":45},"\"get cache failed, expired\"",[35,797,112],{"class":90},[35,799,801,803,805,807],{"class":37,"data-line":800,"line":800},26,[35,802,371],{"class":370},[35,804,31],{"class":76},[35,806,598],{"class":518},[35,808,112],{"class":464},[35,810,812,814,816,818,820,823,825,827,829,831,833,835,837,839,841,843],{"class":37,"data-line":811,"line":811},27,[35,813,371],{"class":370},[35,815,503],{"class":76},[35,817,506],{"class":41},[35,819,91],{"class":464},[35,821,822],{"class":45},"\"\u002Fdelete\"",[35,824,142],{"class":76},[35,826,432],{"class":80},[35,828,91],{"class":518},[35,830,522],{"class":521},[35,832,525],{"class":80},[35,834,528],{"class":41},[35,836,531],{"class":76},[35,838,534],{"class":41},[35,840,440],{"class":518},[35,842,362],{"class":76},[35,844,445],{"class":518},[35,846,848,850,852,854,857,859,861],{"class":37,"data-line":847,"line":847},28,[35,849,371],{"class":370},[35,851,371],{"class":370},[35,853,131],{"class":76},[35,855,856],{"class":41},"Delete",[35,858,91],{"class":90},[35,860,139],{"class":45},[35,862,112],{"class":90},[35,864,866,868,870,872,874,876,878,880,883],{"class":37,"data-line":865,"line":865},29,[35,867,371],{"class":370},[35,869,371],{"class":370},[35,871,573],{"class":76},[35,873,576],{"class":41},[35,875,91],{"class":90},[35,877,581],{"class":94},[35,879,142],{"class":76},[35,881,882],{"class":45},"\"delete cache successfully\"",[35,884,112],{"class":90},[35,886,888,890,892,894],{"class":37,"data-line":887,"line":887},30,[35,889,371],{"class":370},[35,891,31],{"class":76},[35,893,598],{"class":518},[35,895,112],{"class":464},[35,897,899,901,903,906,908,911],{"class":37,"data-line":898,"line":898},31,[35,900,371],{"class":370},[35,902,503],{"class":76},[35,904,905],{"class":41},"Run",[35,907,91],{"class":464},[35,909,910],{"class":45},"\":8080\"",[35,912,112],{"class":464},[35,914,916],{"class":37,"data-line":915,"line":915},32,[35,917,775],{"class":90},[22,919,920],{"id":920},"底层剖析",[922,923,924],"h3",{"id":924},"数据结构",[26,926,928],{"className":55,"code":927,"language":42,"meta":31,"style":31},"type cache struct {\n\tdefaultExpiration time.Duration\n\titems             map[string]Item\n\tmu                sync.RWMutex\n\tonEvicted         func(string, interface{})\n\tjanitor           *janitor\n}\n\ntype Item struct {\n\tObject     interface{}\n\tExpiration int64\n}\n",[17,929,930,945,959,981,996,1021,1033,1037,1041,1054,1067,1077],{"__ignoreMap":31},[35,931,932,935,938,941,943],{"class":37,"data-line":38,"line":38},[35,933,934],{"class":80},"type",[35,936,937],{"class":41}," cache",[35,939,940],{"class":80}," struct",[35,942,362],{"class":76},[35,944,445],{"class":90},[35,946,947,949,952,954,956],{"class":37,"data-line":67,"line":67},[35,948,371],{"class":370},[35,950,951],{"class":76},"defaultExpiration ",[35,953,389],{"class":41},[35,955,531],{"class":76},[35,957,958],{"class":41},"Duration\n",[35,960,961,963,966,969,972,975,978],{"class":37,"data-line":73,"line":73},[35,962,371],{"class":370},[35,964,965],{"class":76},"items             ",[35,967,968],{"class":80},"map",[35,970,971],{"class":464},"[",[35,973,974],{"class":80},"string",[35,976,977],{"class":464},"]",[35,979,980],{"class":41},"Item\n",[35,982,983,985,988,991,993],{"class":37,"data-line":115,"line":115},[35,984,371],{"class":370},[35,986,987],{"class":76},"mu                ",[35,989,990],{"class":41},"sync",[35,992,531],{"class":76},[35,994,995],{"class":41},"RWMutex\n",[35,997,998,1000,1003,1005,1007,1009,1011,1014,1017,1019],{"class":37,"data-line":122,"line":122},[35,999,371],{"class":370},[35,1001,1002],{"class":76},"onEvicted         ",[35,1004,432],{"class":80},[35,1006,91],{"class":464},[35,1008,974],{"class":80},[35,1010,142],{"class":76},[35,1012,1013],{"class":80},"interface",[35,1015,1016],{"class":518},"{",[35,1018,598],{"class":518},[35,1020,112],{"class":464},[35,1022,1023,1025,1028,1030],{"class":37,"data-line":128,"line":128},[35,1024,371],{"class":370},[35,1026,1027],{"class":76},"janitor           ",[35,1029,98],{"class":80},[35,1031,1032],{"class":41},"janitor\n",[35,1034,1035],{"class":37,"data-line":153,"line":153},[35,1036,775],{"class":90},[35,1038,1039],{"class":37,"data-line":158,"line":158},[35,1040,119],{"emptyLinePlaceholder":118},[35,1042,1043,1045,1048,1050,1052],{"class":37,"data-line":164,"line":164},[35,1044,934],{"class":80},[35,1046,1047],{"class":41}," Item",[35,1049,940],{"class":80},[35,1051,362],{"class":76},[35,1053,445],{"class":90},[35,1055,1056,1058,1061,1063,1065],{"class":37,"data-line":424,"line":424},[35,1057,371],{"class":370},[35,1059,1060],{"class":76},"Object     ",[35,1062,1013],{"class":80},[35,1064,1016],{"class":464},[35,1066,775],{"class":464},[35,1068,1069,1071,1074],{"class":37,"data-line":429,"line":429},[35,1070,371],{"class":370},[35,1072,1073],{"class":76},"Expiration ",[35,1075,1076],{"class":80},"int64\n",[35,1078,1079],{"class":37,"data-line":448,"line":448},[35,1080,775],{"class":90},[1082,1083,1084,1091,1097,1106,1112],"ul",{},[1085,1086,1087,1090],"li",{},[17,1088,1089],{"code":1089},"defaultExpiration","是默认过期时间, 如果设置为 0, 则表示永不过期",[1085,1092,1093,1096],{},[17,1094,1095],{"code":1095},"items","是缓存项的 map, 键是 string, 值是 Item",[1085,1098,1099,1102,1103,1105],{},[17,1100,1101],{"code":1101},"mu","是互斥锁, 用于保护",[17,1104,1095],{"code":1095},"的并发访问",[1085,1107,1108,1111],{},[17,1109,1110],{"code":1110},"onEvicted","是删除缓存项时的回调函数, 当缓存项过期时, 会调用该函数",[1085,1113,1114,1117],{},[17,1115,1116],{"code":1116},"janitor","是清理缓存项的定时器, 会定时清理过期缓存项",[922,1119,1121],{"id":1120},"get-和-set-详解","Get 和 Set 详解",[1123,1124,1126],"h4",{"id":1125},"get-方法","Get 方法",[26,1128,1130],{"className":55,"code":1129,"language":42,"meta":31,"style":31},"func (c *cache) Get(k string) (interface{}, bool) {\n\tc.mu.RLock()\n\t\u002F\u002F \"Inlining\" of get and Expired\n\titem, found := c.items[k]\n\tif !found {\n\t\tc.mu.RUnlock()\n\t\treturn nil, false\n\t}\n\tif item.Expiration > 0 {\n\t\tif time.Now().UnixNano() > item.Expiration {\n\t\t\tc.mu.RUnlock()\n\t\t\treturn nil, false\n\t\t}\n\t}\n\tc.mu.RUnlock()\n\treturn item.Object, true\n}\n",[17,1131,1132,1184,1198,1205,1224,1238,1253,1270,1278,1297,1332,1348,1364,1374,1382,1394,1406],{"__ignoreMap":31},[35,1133,1134,1136,1138,1140,1142,1144,1147,1149,1151,1153,1155,1158,1161,1163,1165,1167,1169,1171,1173,1175,1178,1180,1182],{"class":37,"data-line":38,"line":38},[35,1135,432],{"class":80},[35,1137,362],{"class":76},[35,1139,91],{"class":90},[35,1141,77],{"class":521},[35,1143,98],{"class":80},[35,1145,1146],{"class":41},"cache",[35,1148,440],{"class":90},[35,1150,362],{"class":76},[35,1152,175],{"class":41},[35,1154,91],{"class":90},[35,1156,1157],{"class":521},"k",[35,1159,1160],{"class":80}," string",[35,1162,440],{"class":90},[35,1164,362],{"class":76},[35,1166,91],{"class":90},[35,1168,1013],{"class":80},[35,1170,1016],{"class":464},[35,1172,598],{"class":464},[35,1174,142],{"class":76},[35,1176,1177],{"class":80},"bool",[35,1179,440],{"class":90},[35,1181,362],{"class":76},[35,1183,445],{"class":90},[35,1185,1186,1188,1191,1194,1196],{"class":37,"data-line":67,"line":67},[35,1187,371],{"class":370},[35,1189,1190],{"class":76},"c.mu.",[35,1192,1193],{"class":41},"RLock",[35,1195,91],{"class":464},[35,1197,112],{"class":464},[35,1199,1200,1202],{"class":37,"data-line":73,"line":73},[35,1201,371],{"class":370},[35,1203,1204],{"class":63},"\u002F\u002F \"Inlining\" of get and Expired\n",[35,1206,1207,1209,1212,1214,1217,1219,1221],{"class":37,"data-line":115,"line":115},[35,1208,371],{"class":370},[35,1210,1211],{"class":76},"item, found ",[35,1213,81],{"class":80},[35,1215,1216],{"class":76}," c.items",[35,1218,971],{"class":464},[35,1220,1157],{"class":76},[35,1222,1223],{"class":464},"]\n",[35,1225,1226,1228,1230,1233,1236],{"class":37,"data-line":122,"line":122},[35,1227,371],{"class":370},[35,1229,699],{"class":80},[35,1231,1232],{"class":80}," !",[35,1234,1235],{"class":76},"found ",[35,1237,445],{"class":464},[35,1239,1240,1242,1244,1246,1249,1251],{"class":37,"data-line":128,"line":128},[35,1241,371],{"class":370},[35,1243,371],{"class":370},[35,1245,1190],{"class":76},[35,1247,1248],{"class":41},"RUnlock",[35,1250,91],{"class":518},[35,1252,112],{"class":518},[35,1254,1255,1257,1259,1262,1265,1267],{"class":37,"data-line":153,"line":153},[35,1256,371],{"class":370},[35,1258,371],{"class":370},[35,1260,1261],{"class":80},"return",[35,1263,1264],{"class":94}," nil",[35,1266,142],{"class":76},[35,1268,1269],{"class":94},"false\n",[35,1271,1272,1274,1276],{"class":37,"data-line":158,"line":158},[35,1273,371],{"class":370},[35,1275,31],{"class":76},[35,1277,775],{"class":464},[35,1279,1280,1282,1284,1287,1290,1293,1295],{"class":37,"data-line":164,"line":164},[35,1281,371],{"class":370},[35,1283,699],{"class":80},[35,1285,1286],{"class":76}," item.Expiration ",[35,1288,1289],{"class":80},">",[35,1291,1292],{"class":94}," 0",[35,1294,362],{"class":76},[35,1296,445],{"class":464},[35,1298,1299,1301,1303,1305,1308,1311,1313,1315,1317,1320,1322,1324,1326,1328,1330],{"class":37,"data-line":424,"line":424},[35,1300,371],{"class":370},[35,1302,371],{"class":370},[35,1304,699],{"class":80},[35,1306,1307],{"class":76}," time.",[35,1309,1310],{"class":41},"Now",[35,1312,91],{"class":518},[35,1314,440],{"class":518},[35,1316,531],{"class":76},[35,1318,1319],{"class":41},"UnixNano",[35,1321,91],{"class":518},[35,1323,440],{"class":518},[35,1325,362],{"class":76},[35,1327,1289],{"class":80},[35,1329,1286],{"class":76},[35,1331,445],{"class":518},[35,1333,1334,1336,1338,1340,1342,1344,1346],{"class":37,"data-line":429,"line":429},[35,1335,371],{"class":370},[35,1337,371],{"class":370},[35,1339,371],{"class":370},[35,1341,1190],{"class":76},[35,1343,1248],{"class":41},[35,1345,91],{"class":90},[35,1347,112],{"class":90},[35,1349,1350,1352,1354,1356,1358,1360,1362],{"class":37,"data-line":448,"line":448},[35,1351,371],{"class":370},[35,1353,371],{"class":370},[35,1355,371],{"class":370},[35,1357,1261],{"class":80},[35,1359,1264],{"class":94},[35,1361,142],{"class":76},[35,1363,1269],{"class":94},[35,1365,1366,1368,1370,1372],{"class":37,"data-line":469,"line":469},[35,1367,371],{"class":370},[35,1369,371],{"class":370},[35,1371,31],{"class":76},[35,1373,775],{"class":518},[35,1375,1376,1378,1380],{"class":37,"data-line":498,"line":498},[35,1377,371],{"class":370},[35,1379,31],{"class":76},[35,1381,775],{"class":464},[35,1383,1384,1386,1388,1390,1392],{"class":37,"data-line":543,"line":543},[35,1385,371],{"class":370},[35,1387,1190],{"class":76},[35,1389,1248],{"class":41},[35,1391,91],{"class":464},[35,1393,112],{"class":464},[35,1395,1396,1398,1400,1403],{"class":37,"data-line":566,"line":566},[35,1397,371],{"class":370},[35,1399,1261],{"class":80},[35,1401,1402],{"class":76}," item.Object, ",[35,1404,1405],{"class":94},"true\n",[35,1407,1408],{"class":37,"data-line":591,"line":591},[35,1409,775],{"class":90},[13,1411,1412],{},"在 Get 方法中, 首先会加锁, 可以防止在读取的时候, 其他 goroutine 修改 items, 并且能够并发访问",[13,1414,1415],{},"然后会判断缓存项是否过期, 如果过期, 则返回 false, 否则返回 true",[1123,1417,1419],{"id":1418},"set-方法","Set 方法",[26,1421,1423],{"className":55,"code":1422,"language":42,"meta":31,"style":31},"func (c *cache) Set(k string, x interface{}, d time.Duration) {\n\t\u002F\u002F \"Inlining\" of set\n\tvar e int64\n\tif d == DefaultExpiration {\n\t\td = c.defaultExpiration\n\t}\n\tif d > 0 {\n\t\te = time.Now().Add(d).UnixNano()\n\t}\n\tc.mu.Lock()\n\tc.items[k] = Item{\n\t\tObject:     x,\n\t\tExpiration: e,\n\t}\n\t\u002F\u002F TODO: Calls to mu.Unlock are currently not deferred because defer\n\t\u002F\u002F adds ~200 ns (as of go1.)\n\tc.mu.Unlock()\n}\n",[17,1424,1425,1482,1489,1501,1518,1533,1541,1557,1595,1603,1616,1637,1646,1655,1663,1670,1677,1690],{"__ignoreMap":31},[35,1426,1427,1429,1431,1433,1435,1437,1439,1441,1443,1445,1447,1449,1451,1453,1456,1459,1461,1463,1465,1468,1471,1473,1476,1478,1480],{"class":37,"data-line":38,"line":38},[35,1428,432],{"class":80},[35,1430,362],{"class":76},[35,1432,91],{"class":90},[35,1434,77],{"class":521},[35,1436,98],{"class":80},[35,1438,1146],{"class":41},[35,1440,440],{"class":90},[35,1442,362],{"class":76},[35,1444,134],{"class":41},[35,1446,91],{"class":90},[35,1448,1157],{"class":521},[35,1450,1160],{"class":80},[35,1452,142],{"class":76},[35,1454,1455],{"class":521},"x",[35,1457,1458],{"class":80}," interface",[35,1460,1016],{"class":464},[35,1462,598],{"class":464},[35,1464,142],{"class":76},[35,1466,1467],{"class":521},"d",[35,1469,1470],{"class":41}," time",[35,1472,531],{"class":76},[35,1474,1475],{"class":41},"Duration",[35,1477,440],{"class":90},[35,1479,362],{"class":76},[35,1481,445],{"class":90},[35,1483,1484,1486],{"class":37,"data-line":67,"line":67},[35,1485,371],{"class":370},[35,1487,1488],{"class":63},"\u002F\u002F \"Inlining\" of set\n",[35,1490,1491,1493,1496,1499],{"class":37,"data-line":73,"line":73},[35,1492,371],{"class":370},[35,1494,1495],{"class":80},"var",[35,1497,1498],{"class":76}," e ",[35,1500,1076],{"class":80},[35,1502,1503,1505,1507,1510,1513,1516],{"class":37,"data-line":115,"line":115},[35,1504,371],{"class":370},[35,1506,699],{"class":80},[35,1508,1509],{"class":76}," d ",[35,1511,1512],{"class":80},"==",[35,1514,1515],{"class":76}," DefaultExpiration ",[35,1517,445],{"class":464},[35,1519,1520,1522,1524,1527,1530],{"class":37,"data-line":122,"line":122},[35,1521,371],{"class":370},[35,1523,371],{"class":370},[35,1525,1526],{"class":76},"d ",[35,1528,1529],{"class":80},"=",[35,1531,1532],{"class":76}," c.defaultExpiration\n",[35,1534,1535,1537,1539],{"class":37,"data-line":128,"line":128},[35,1536,371],{"class":370},[35,1538,31],{"class":76},[35,1540,775],{"class":464},[35,1542,1543,1545,1547,1549,1551,1553,1555],{"class":37,"data-line":153,"line":153},[35,1544,371],{"class":370},[35,1546,699],{"class":80},[35,1548,1509],{"class":76},[35,1550,1289],{"class":80},[35,1552,1292],{"class":94},[35,1554,362],{"class":76},[35,1556,445],{"class":464},[35,1558,1559,1561,1563,1566,1568,1570,1572,1574,1576,1578,1581,1583,1585,1587,1589,1591,1593],{"class":37,"data-line":158,"line":158},[35,1560,371],{"class":370},[35,1562,371],{"class":370},[35,1564,1565],{"class":76},"e ",[35,1567,1529],{"class":80},[35,1569,1307],{"class":76},[35,1571,1310],{"class":41},[35,1573,91],{"class":518},[35,1575,440],{"class":518},[35,1577,531],{"class":76},[35,1579,1580],{"class":41},"Add",[35,1582,91],{"class":518},[35,1584,1467],{"class":76},[35,1586,440],{"class":518},[35,1588,531],{"class":76},[35,1590,1319],{"class":41},[35,1592,91],{"class":518},[35,1594,112],{"class":518},[35,1596,1597,1599,1601],{"class":37,"data-line":164,"line":164},[35,1598,371],{"class":370},[35,1600,31],{"class":76},[35,1602,775],{"class":464},[35,1604,1605,1607,1609,1612,1614],{"class":37,"data-line":424,"line":424},[35,1606,371],{"class":370},[35,1608,1190],{"class":76},[35,1610,1611],{"class":41},"Lock",[35,1613,91],{"class":464},[35,1615,112],{"class":464},[35,1617,1618,1620,1623,1625,1627,1629,1631,1633,1635],{"class":37,"data-line":429,"line":429},[35,1619,371],{"class":370},[35,1621,1622],{"class":76},"c.items",[35,1624,971],{"class":464},[35,1626,1157],{"class":76},[35,1628,977],{"class":464},[35,1630,362],{"class":76},[35,1632,1529],{"class":80},[35,1634,1047],{"class":41},[35,1636,445],{"class":464},[35,1638,1639,1641,1643],{"class":37,"data-line":448,"line":448},[35,1640,371],{"class":370},[35,1642,371],{"class":370},[35,1644,1645],{"class":76},"Object:     x,\n",[35,1647,1648,1650,1652],{"class":37,"data-line":469,"line":469},[35,1649,371],{"class":370},[35,1651,371],{"class":370},[35,1653,1654],{"class":76},"Expiration: e,\n",[35,1656,1657,1659,1661],{"class":37,"data-line":498,"line":498},[35,1658,371],{"class":370},[35,1660,31],{"class":76},[35,1662,775],{"class":464},[35,1664,1665,1667],{"class":37,"data-line":543,"line":543},[35,1666,371],{"class":370},[35,1668,1669],{"class":63},"\u002F\u002F TODO: Calls to mu.Unlock are currently not deferred because defer\n",[35,1671,1672,1674],{"class":37,"data-line":566,"line":566},[35,1673,371],{"class":370},[35,1675,1676],{"class":63},"\u002F\u002F adds ~200 ns (as of go1.)\n",[35,1678,1679,1681,1683,1686,1688],{"class":37,"data-line":591,"line":591},[35,1680,371],{"class":370},[35,1682,1190],{"class":76},[35,1684,1685],{"class":41},"Unlock",[35,1687,91],{"class":464},[35,1689,112],{"class":464},[35,1691,1692],{"class":37,"data-line":603,"line":603},[35,1693,775],{"class":90},[13,1695,1696],{},"设置写锁，防止多个 goroutine 同时修改一个 item, 然后设置过期时间",[13,1698,1699,1700,1703,1704,1707],{},"这就是 go-cache 库, 主要用于单机缓存,底层是一个 map, 使用",[17,1701,1702],{"code":1702},"RWMutex","锁控制读写和",[17,1705,1706],{"code":1706},"time.Now().Add(d).UnixNano()","设置过期时间, 基于本地内存 , 如果需要分布式缓存, 可以考虑使用 redis 等其他缓存库",[1709,1710,1711],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sSDpw, html code.shiki .sSDpw{--shiki-default:#005cc5;--shiki-dark:#79b8ff}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sJX2D, html code.shiki .sJX2D{--shiki-default:#e36209;--shiki-dark:#ffab70}html pre.shiki code .sqkie, html code.shiki .sqkie{--shiki-default:#5a32a3;--shiki-dark:#b392f0}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":31,"searchDepth":115,"depth":115,"links":1713},[1714,1715,1716,1717,1718],{"id":24,"depth":67,"text":24},{"id":52,"depth":67,"text":52},{"id":184,"depth":67,"text":184},{"id":334,"depth":67,"text":334},{"id":920,"depth":67,"text":920,"children":1719},[1720,1721],{"id":924,"depth":73,"text":924},{"id":1120,"depth":73,"text":1121,"children":1722},[1723,1724],{"id":1125,"depth":115,"text":1126},{"id":1418,"depth":115,"text":1419},[1726],"Go语言","2025-07-26","go-cache 是一个 golang 的缓存库, 用于缓存 k, v 对, 缓存时间过期后存储的值会失效, 底层是一个 map, 过期后内部 Item 是不会自动清除, 需要手动调用DeleteExpired方法清除过期项",false,"md",null,{"slots":1733},{},"\u002F2025\u002F07\u002Fgo-cache",{"text":1736,"minutes":1737,"time":1738,"words":1739},"4 min read",3.65,219000,730,{"title":5,"description":1728},{"loc":1734},"posts\u002F2025\u002F07\u002Fgo-cache",[1744,1745],"Redis","数据库安装","tech","2025-07-28","I_E6qhRW0bTHozs4cJuXMuz45OjXHUYKW1mcHiFHrww",[1750,1754],{"title":1751,"path":1752,"stem":1753,"date":1727,"type":1746,"children":-1},"Go Air 热重载工具使用指南","\u002F2025\u002F07\u002Fgo-air","posts\u002F2025\u002F07\u002Fgo-air",{"title":1755,"path":1756,"stem":1757,"date":1727,"type":1746,"children":-1},"Go 单元测试与覆盖率实践","\u002F2025\u002F07\u002Fgo-test","posts\u002F2025\u002F07\u002Fgo-test",1786555056744]