-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
134 lines (118 loc) · 3.74 KB
/
main.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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
package main
import (
"TeaPicker/store"
"TeaPicker/tree"
"context"
"fmt"
"google.golang.org/grpc"
"net"
"os"
)
/*
1、实现GRPC通信接口 done
2、loading配置文件 简化至flag处理 done
3、单独线程进行磁盘持久化,永久保存数据?AOF(记录读写记录):RDB(生成时间快照) done
4、主从集群? 就暂时压力而言没必要 pending
*/
import (
"flag"
"github.com/json-iterator/go"
)
var Rootmap *tree.Mapping
var record *store.Record
var json = jsoniter.ConfigCompatibleWithStandardLibrary
var (
dataPath string
port string
cacheSize int
cacheExpire int
tuning bool
)
func init() {
//初始化参数
flag.StringVar(&dataPath, "P", "data.tmd", "数据文件路径:/home/abel/data.tmd。有则读取,无则创建。")
flag.StringVar(&port, "p", "9988", "端口号")
flag.IntVar(&cacheSize, "cache-size", 256, "缓存内容数量")
flag.IntVar(&cacheExpire, "cache-expire", 3600, "缓存时间(s)")
flag.BoolVar(&tuning, "m", false, "优化数据文件")
}
func main() {
flag.Parse()
fmt.Printf("缓存内容数量:%d\n", cacheSize)
fmt.Printf("缓存内容时间:%d\n", cacheExpire)
//初始化数据
record = store.CreateRecord(dataPath)
Rootmap = tree.CreateMapping(cacheSize, cacheExpire)
record.RegisterStoreStruct(store.TAG_Tree, Rootmap)
if tuning {
//数据文件调优
record.Optimize()
os.Exit(1)
}
fmt.Println("加载数据...")
//启动加载数据项到内存
record.Recovery()
fmt.Println("数据加载完毕")
//启动服务
listener, err := net.Listen("tcp", ":"+port)
if nil != err {
panic(err)
} else {
fmt.Println("Listen at:" + port + ".....")
}
defer listener.Close()
rpcServer := grpc.NewServer()
tree.RegisterAddServiceServer(rpcServer, &Service{})
tree.RegisterDelServiceServer(rpcServer, &Service{})
tree.RegisterSearchServiceServer(rpcServer, &Service{})
tree.RegisterSearchLenovosServiceServer(rpcServer, &Service{})
rpcServer.Serve(listener)
}
//服务包装
type Service struct {
tree.AddServiceServer
tree.DelServiceServer
tree.SearchServiceServer
tree.SearchLenovosServiceServer
}
//增加定时器功能够需要做到协程安全
func (s *Service) Add(ctx context.Context, request *tree.AddRequest) (*tree.BooleanResponse, error) {
b := Rootmap.AddWord(request.Index, request.Key, request.JsonData, request.Chinese)
if b {
addWord := tree.AddWordCommand{request.Index, request.Key, request.JsonData, request.Chinese}
argsString, err := json.MarshalToString(&addWord)
if err == nil {
record.AddLog(store.TAG_Tree, store.OperateAdd, argsString)
}
}
return &tree.BooleanResponse{b}, nil
}
func (s *Service) Del(ctx context.Context, request *tree.DelRequest) (*tree.BooleanResponse, error) {
b := Rootmap.DelWord(request.Index, request.Key, request.Chinese)
if b {
delWord := tree.DelWordCommand{request.Index, request.Key, request.Chinese}
argsString, err := json.MarshalToString(&delWord)
if err == nil {
record.AddLog(store.TAG_Tree, store.OperateDel, argsString)
}
}
return &tree.BooleanResponse{b}, nil
}
func (s *Service) Search(ctx context.Context, request *tree.SearchRequest) (*tree.SearchResponse, error) {
res := Rootmap.Search(request.Index, request.Context)
ret := []*tree.SearchResult{}
for _, v := range res {
result := tree.SearchResult{Str: v.Str, Data: v.Data}
ret = append(ret, &result)
}
return &tree.SearchResponse{ret}, nil
}
func (s *Service) SearchLenovos(ctx context.Context, request *tree.SearchLenovosRequest) (*tree.SearchResponse, error) {
res := Rootmap.SearchLenovos(request.Index, request.Context)
ret := []*tree.SearchResult{}
for _, v := range res {
result := tree.SearchResult{Str: v.Str, Data: v.Data}
ret = append(ret, &result)
}
return &tree.SearchResponse{ret}, nil
}