当前位置: 首页 > article >正文

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

http://www.kler.cn/a/487993.html

相关文章:

  • 如何在 Ubuntu 22.04 上安装 Caddy Web 服务器教程
  • 基于Python实现的通用小规模搜索引擎
  • socket网络编程-TC/IP方式
  • Spring 项目 基于 Tomcat容器进行部署
  • java mail 535 Login Fail. Please enter your authorization code to login
  • 运放输入偏置电流详解
  • Android车机DIY开发之软件篇(三)编译Automotive OS错误(1)
  • 数组分割函数
  • 基于金融新闻微调大语言模型,进行股票回报预测
  • 磁盘满造成业务异常问题排查
  • vue.js 路由模块封装
  • 如何优化爬虫效率?
  • tcpdump-命令详解
  • selenium已经登陆了 我怎么查看 网页 在fRequest xhr 的数据呢
  • Opus Clip AI技术浅析(二):上传与预处理
  • Android基于回调的事件处理
  • uniapp vue 2 上传视频和图片的封装
  • python 生成24bit音频数据实例解析
  • 机器学习中特征选择的重要性
  • Springboot Rabbitmq + 线程池技术控制指定数量task执行
  • aspx触发html和ashx的交互
  • flink并行度
  • 软考信安19~操作系统安全保护
  • 记录一下vue2项目优化,虚拟列表vue-virtual-scroll-list处理10万条数据
  • 弹性云服务器和普通服务器的区别
  • likeshop同城跑腿系统likeshop回收租赁系统likeshop多商户商城安装及小程序对接方法