动手写分布式缓存 11
main函数实现
定义一个map模拟数据库。
var mysql = map[string]string{
"Tom": "630",
"Jack": "589",
"Sam": "567",
}
为多个端口处创建rpc服务
服务名就是ip+端口。
将各个服务器的ip+端口加到每个服务器的哈希环里。
为每个服务器创建缓存池组。
缓存池组和rpc服务绑定。
持续监听端口
addrs := []string{"localhost:9999", "localhost:9998", "localhost:9997"}
groupname := []string{"9999", "9998", "9997"}
var Group []*gocache.Group
// 创建并启动每个服务实例
for i, addr := range addrs {
svr, err := gocache.NewServer(addr)
if err != nil {
log.Fatalf("Failed to create server on %s: %v", addr, err)
}
svr.SetPeers(addrs...)
// 创建每个server的专属Group
group := gocache.NewGroup(groupname[i], 2<<10, time.Second, gocache.GetterFunc(
func(key string) ([]byte, error) {
log.Println("[Mysql] search key", key)
if v, ok := mysql[key]; ok {
return []byte(v), nil
}
return nil, fmt.Errorf("%s not exist", key)
}))
// 将服务与group绑定
group.RegisterPeers(svr)
Group = append(Group, group)
// 启动服务
go func() {
// Start将不会return 除非服务stop或者抛出error
err = svr.Start()
if err != nil {
log.Fatal(err)
}
}()
}
向服务器发送请求
var wg sync.WaitGroup
wg.Add(2)
go GetTomScore(Group[0], &wg)
go GetJackScore(Group[0], &wg)
wg.Wait()
wg.Add(2)
go GetTomScore(Group[0], &wg)
go GetJackScore(Group[0], &wg)
wg.Wait()
wg.Add(2)
go GetTomScore(Group[0], &wg)
go GetJackScore(Group[0], &wg)
wg.Wait()
func GetTomScore(group *gocache.Group, wg *sync.WaitGroup) {
defer wg.Done()
log.Printf("get Tom...")
view, err := group.Get("Tom")
if err != nil {
fmt.Println(err.Error())
return
}
fmt.Println(view.String())
}
func GetJackScore(group *gocache.Group, wg *sync.WaitGroup) {
defer wg.Done()
log.Printf("get Jack...")
view, err := group.Get("Jack")
if err != nil {
fmt.Println(err.Error())
return
}
fmt.Println(view.String())
}