forked from GhostTroops/scan4all
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathkvDb.go
119 lines (107 loc) · 2.24 KB
/
kvDb.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
package pkg
import (
"encoding/json"
"github.com/dgraph-io/badger"
"log"
"sync"
)
var Cache1 *KvDbOp
var DoOnce sync.Once
// https://colobu.com/2017/10/11/badger-a-performant-k-v-store/
// https://juejin.cn/post/6844903814571491335
type KvDbOp struct {
DbConn *badger.DB
}
func NewKvDbOp() *KvDbOp {
DoOnce.Do(func() {
Cache1 = &KvDbOp{}
CacheName11 := ".DbCache"
s1 := GetVal(CacheName)
if "" != s1 {
CacheName11 = s1
}
Cache1.Init(CacheName11)
})
return Cache1
}
func (r *KvDbOp) SetExpiresAt(ExpiresAt uint64) {
r.DbConn.SetDiscardTs(ExpiresAt)
}
func (r *KvDbOp) Init(szDb string) error {
opts := badger.DefaultOptions(szDb)
opts.CompactL0OnClose = true
opts.EventLogging = false
opts.Logger = nil
opts.LevelOneSize = 256 << 10
opts.LevelSizeMultiplier = 20
db, err := badger.Open(opts)
if nil != err {
log.Println("Init k-v db 不能多个进程同时开启", err)
return err
}
r.DbConn = db
return nil
}
func (r *KvDbOp) Delete(key string) error {
err := r.DbConn.Update(func(txn *badger.Txn) error {
return txn.Delete([]byte(key))
})
return err
}
func (r *KvDbOp) Close() {
r.DbConn.Close()
}
// https://www.modb.pro/db/87317
func (r *KvDbOp) GetKeyForData(key string) (szRst []byte) {
data, err := r.Get(key)
if nil != err {
log.Println("GetKeyForData ", key, " is err ", err)
return []byte{}
}
return data
}
// https://www.modb.pro/db/87317
func (r *KvDbOp) Get(key string) (szRst []byte, err error) {
err = r.DbConn.View(func(txn *badger.Txn) error {
item, err := txn.Get([]byte(key))
if err != nil {
return err
}
// val, err := item.Value()
err = item.Value(func(val []byte) error {
szRst = val
return nil
})
return err
})
return szRst, err
}
func PutAny[T any](key string, data T) {
d, err := json.Marshal(data)
if nil == err {
Cache1.Put(key, d)
}
}
func GetAny[T any](key string) (T, error) {
var t1 T
data, err := Cache1.Get(key)
if nil == err {
json.Unmarshal(data, &t1)
return t1, nil
}
return t1, err
}
func (r *KvDbOp) Put(key string, data []byte) {
err := r.DbConn.Update(func(txn *badger.Txn) error {
err := txn.Set([]byte(key), data)
if err == badger.ErrTxnTooBig {
_ = txn.Commit()
}
return err
})
if err != nil {
}
}
func init() {
NewKvDbOp()
}