关于缓存过期键淘汰策略的问题
来源:2-4 深入框架原理与实现
linxiaoyi
2021-08-25 11:34:23
https://github.com/Codexiaoyi/linweb/tree/main/pkg/cache
曹大,这个是我的web框架作业里面的缓存模块。用了lru-k的键淘汰策略和 惰性删除、定期删除的过期键淘汰策略(模仿redis)。
现在发现了些问题:
过期键我使用了一个map存着,然后我后台起了一个goroutine去定期扫描过期键,秒级别的扫描周期目前是正常的,但是毫秒或者百毫秒级别的扫描周期会出现问题,就是扫描删除的顺序错误。这里我仅单元测试定期扫描,并不涉及并发和开启关闭扫描的问题。这里不太知道问题在哪。这块的实现在上面链接的sweeper.go里面,不知道是不是跟select有关。曹大要是愿意review或者批改一下就更好了
1回答
Xargin
2021-08-25
你这个现在的测试就是偶尔失败的吧:
GOROOT=/usr/local/Cellar/go/1.16.6/libexec #gosetup GOPATH=/Users/xargin/go #gosetup /usr/local/Cellar/go/1.16.6/libexec/bin/go test -c -o /private/var/folders/fz/_8y5djmn6yq3zln734gs72yc0000gn/T/GoLand/___1TestSweep_in_linweb_pkg_cache.test -gcflags all=-N -l linweb/pkg/cache #gosetup /usr/local/Cellar/go/1.16.6/libexec/bin/go tool test2json -t /private/var/folders/fz/_8y5djmn6yq3zln734gs72yc0000gn/T/dlvLauncher.sh /Applications/GoLand.app/Contents/plugins/go/lib/dlv/mac/dlv --listen=0.0.0.0:65236 --headless=true --api-version=2 --check-go-version=false --only-same-user=false exec /private/var/folders/fz/_8y5djmn6yq3zln734gs72yc0000gn/T/GoLand/___1TestSweep_in_linweb_pkg_cache.test -- -test.v -test.paniconexit0 -test.run ^\QTestSweeperTestSuite\E$/^\QTestSweep\E$ -testify.m ^TestSweep$ === RUN TestSweeperTestSuite --- FAIL: TestSweeperTestSuite (6.01s) === RUN TestSweeperTestSuite/TestSweep key3 key1 key2 key4 sweeper_test.go:29 1 does not equal 0 --- FAIL: TestSweeperTestSuite/TestSweep (6.00s)
感觉你这个代码注释和实际功能不太对得上啊,
// start or stop sweep signal. If send true start sweep, false stop sweep. expireSignal chan bool
func (s *sweeper) sweep() { Restart: //blocking until signal comes select { case sig := <-s.expireSignal: if !sig { goto Restart } }
接收到 false 不是应该 stop sweep 么,为啥是 restart
相似问题