优化IP名单相关代码/关闭、重启进程时自动关闭IP名单本地缓存数据库

This commit is contained in:
GoEdgeLab
2022-07-25 20:23:40 +08:00
parent 39d1ea7622
commit d3030f7e3f
4 changed files with 38 additions and 6 deletions

View File

@@ -79,7 +79,7 @@ func TestIPItem_Memory(t *testing.T) {
for i := 0; i < 2_000_000; i ++ { for i := 0; i < 2_000_000; i ++ {
list.Add(&IPItem{ list.Add(&IPItem{
Type: "ip", Type: "ip",
Id: int64(i), Id: uint64(i),
IPFrom: utils.IP2Long("192.168.1.1"), IPFrom: utils.IP2Long("192.168.1.1"),
IPTo: 0, IPTo: 0,
ExpiredAt: time.Now().Unix(), ExpiredAt: time.Now().Unix(),

View File

@@ -28,6 +28,8 @@ type IPListDB struct {
cleanTicker *time.Ticker cleanTicker *time.Ticker
dir string dir string
isClosed bool
} }
func NewIPListDB() (*IPListDB, error) { func NewIPListDB() (*IPListDB, error) {
@@ -56,6 +58,12 @@ func (this *IPListDB) init() error {
return err return err
} }
db.SetMaxOpenConns(1) db.SetMaxOpenConns(1)
//_, err = db.Exec("VACUUM")
//if err != nil {
// return err
//}
this.db = db this.db = db
// 初始化数据库 // 初始化数据库
@@ -117,6 +125,7 @@ ON "` + this.itemTableName + `" (
goman.New(func() { goman.New(func() {
events.On(events.EventQuit, func() { events.On(events.EventQuit, func() {
_ = this.Close()
this.cleanTicker.Stop() this.cleanTicker.Stop()
}) })
@@ -133,11 +142,19 @@ ON "` + this.itemTableName + `" (
// DeleteExpiredItems 删除过期的条目 // DeleteExpiredItems 删除过期的条目
func (this *IPListDB) DeleteExpiredItems() error { func (this *IPListDB) DeleteExpiredItems() error {
if this.isClosed {
return nil
}
_, err := this.deleteExpiredItemsStmt.Exec(time.Now().Unix() - 7*86400) _, err := this.deleteExpiredItemsStmt.Exec(time.Now().Unix() - 7*86400)
return err return err
} }
func (this *IPListDB) AddItem(item *pb.IPItem) error { func (this *IPListDB) AddItem(item *pb.IPItem) error {
if this.isClosed {
return nil
}
_, err := this.deleteItemStmt.Exec(item.Id) _, err := this.deleteItemStmt.Exec(item.Id)
if err != nil { if err != nil {
return err return err
@@ -147,6 +164,10 @@ func (this *IPListDB) AddItem(item *pb.IPItem) error {
} }
func (this *IPListDB) ReadItems(offset int64, size int64) (items []*pb.IPItem, err error) { func (this *IPListDB) ReadItems(offset int64, size int64) (items []*pb.IPItem, err error) {
if this.isClosed {
return
}
rows, err := this.selectItemsStmt.Query(offset, size) rows, err := this.selectItemsStmt.Query(offset, size)
if err != nil { if err != nil {
return nil, err return nil, err
@@ -169,6 +190,10 @@ func (this *IPListDB) ReadItems(offset int64, size int64) (items []*pb.IPItem, e
// ReadMaxVersion 读取当前最大版本号 // ReadMaxVersion 读取当前最大版本号
func (this *IPListDB) ReadMaxVersion() int64 { func (this *IPListDB) ReadMaxVersion() int64 {
if this.isClosed {
return 0
}
row := this.selectMaxVersionStmt.QueryRow() row := this.selectMaxVersionStmt.QueryRow()
if row == nil { if row == nil {
return 0 return 0
@@ -182,6 +207,8 @@ func (this *IPListDB) ReadMaxVersion() int64 {
} }
func (this *IPListDB) Close() error { func (this *IPListDB) Close() error {
this.isClosed = true
if this.db != nil { if this.db != nil {
_ = this.deleteExpiredItemsStmt.Close() _ = this.deleteExpiredItemsStmt.Close()
_ = this.deleteItemStmt.Close() _ = this.deleteItemStmt.Close()

View File

@@ -53,6 +53,11 @@ func TestIPListDB_ReadItems(t *testing.T) {
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
defer func() {
_ = db.Close()
}()
items, err := db.ReadItems(0, 2) items, err := db.ReadItems(0, 2)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)

View File

@@ -144,7 +144,7 @@ func TestIPList_Contains(t *testing.T) {
list := NewIPList() list := NewIPList()
for i := 0; i < 255; i++ { for i := 0; i < 255; i++ {
list.AddDelay(&IPItem{ list.AddDelay(&IPItem{
Id: int64(i), Id: uint64(i),
IPFrom: utils.IP2Long(strconv.Itoa(i) + ".168.0.1"), IPFrom: utils.IP2Long(strconv.Itoa(i) + ".168.0.1"),
IPTo: utils.IP2Long(strconv.Itoa(i) + ".168.255.1"), IPTo: utils.IP2Long(strconv.Itoa(i) + ".168.255.1"),
ExpiredAt: 0, ExpiredAt: 0,
@@ -152,7 +152,7 @@ func TestIPList_Contains(t *testing.T) {
} }
for i := 0; i < 255; i++ { for i := 0; i < 255; i++ {
list.AddDelay(&IPItem{ list.AddDelay(&IPItem{
Id: int64(1000 + i), Id: uint64(1000 + i),
IPFrom: utils.IP2Long("192.167.2." + strconv.Itoa(i)), IPFrom: utils.IP2Long("192.167.2." + strconv.Itoa(i)),
}) })
} }
@@ -172,7 +172,7 @@ func TestIPList_Contains_Many(t *testing.T) {
list := NewIPList() list := NewIPList()
for i := 0; i < 1_000_000; i++ { for i := 0; i < 1_000_000; i++ {
list.AddDelay(&IPItem{ list.AddDelay(&IPItem{
Id: int64(i), Id: uint64(i),
IPFrom: utils.IP2Long(strconv.Itoa(rands.Int(0, 255)) + "." + strconv.Itoa(rands.Int(0, 255)) + "." + strconv.Itoa(rands.Int(0, 255)) + "." + strconv.Itoa(rands.Int(0, 255))), IPFrom: utils.IP2Long(strconv.Itoa(rands.Int(0, 255)) + "." + strconv.Itoa(rands.Int(0, 255)) + "." + strconv.Itoa(rands.Int(0, 255)) + "." + strconv.Itoa(rands.Int(0, 255))),
IPTo: utils.IP2Long(strconv.Itoa(rands.Int(0, 255)) + "." + strconv.Itoa(rands.Int(0, 255)) + "." + strconv.Itoa(rands.Int(0, 255)) + "." + strconv.Itoa(rands.Int(0, 255))), IPTo: utils.IP2Long(strconv.Itoa(rands.Int(0, 255)) + "." + strconv.Itoa(rands.Int(0, 255)) + "." + strconv.Itoa(rands.Int(0, 255)) + "." + strconv.Itoa(rands.Int(0, 255))),
ExpiredAt: 0, ExpiredAt: 0,
@@ -217,7 +217,7 @@ func TestIPList_ContainsIPStrings(t *testing.T) {
list := NewIPList() list := NewIPList()
for i := 0; i < 255; i++ { for i := 0; i < 255; i++ {
list.Add(&IPItem{ list.Add(&IPItem{
Id: int64(i), Id: uint64(i),
IPFrom: utils.IP2Long(strconv.Itoa(i) + ".168.0.1"), IPFrom: utils.IP2Long(strconv.Itoa(i) + ".168.0.1"),
IPTo: utils.IP2Long(strconv.Itoa(i) + ".168.255.1"), IPTo: utils.IP2Long(strconv.Itoa(i) + ".168.255.1"),
ExpiredAt: 0, ExpiredAt: 0,
@@ -305,7 +305,7 @@ func BenchmarkIPList_Contains(b *testing.B) {
var list = NewIPList() var list = NewIPList()
for i := 1; i < 200_000; i++ { for i := 1; i < 200_000; i++ {
list.AddDelay(&IPItem{ list.AddDelay(&IPItem{
Id: int64(i), Id: uint64(i),
IPFrom: utils.IP2Long(strconv.Itoa(rands.Int(0, 255)) + "." + strconv.Itoa(rands.Int(0, 255)) + ".0.1"), IPFrom: utils.IP2Long(strconv.Itoa(rands.Int(0, 255)) + "." + strconv.Itoa(rands.Int(0, 255)) + ".0.1"),
IPTo: utils.IP2Long(strconv.Itoa(rands.Int(0, 255)) + "." + strconv.Itoa(rands.Int(0, 255)) + ".0.1"), IPTo: utils.IP2Long(strconv.Itoa(rands.Int(0, 255)) + "." + strconv.Itoa(rands.Int(0, 255)) + ".0.1"),
ExpiredAt: time.Now().Unix() + 60, ExpiredAt: time.Now().Unix() + 60,