关于缓存过期键淘汰策略的问题

来源:2-4 深入框架原理与实现

linxiaoyi

2021-08-25 11:34:23

https://github.com/Codexiaoyi/linweb/tree/main/pkg/cache

曹大,这个是我的web框架作业里面的缓存模块。用了lru-k的键淘汰策略和 惰性删除、定期删除的过期键淘汰策略(模仿redis)。

现在发现了些问题:

  1. 过期键我使用了一个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

0
hinxiaoyi
回复
hargin
hp>妙啊曹大,代码减少好多😘

h021-08-28
共5条回复

Go高级工程师实战营

慕课网与 GoCN 社区官方联手打造,定义行业Go高级人才培养标准,4个月,快速晋升为P6+/D7级高级人才。

458 学习 · 266 问题

查看课程