动手写分布式缓存 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())
}

你可能感兴趣的:(Go语言学习专栏,分布式,缓存)