【go项目-geecache】动手写分布式缓存 - day7 - 使用 Protobuf 通信
索引
【go项目-geecache】动手写分布式缓存 - day1 - 实现LRU算法
【go项目-geecache】动手写分布式缓存 - day2 - 单机并发缓存
【go项目-geecache】动手写分布式缓存 - day3 - HTTP 服务端
【go项目-geecache】动手写分布式缓存 - day4 - 一致性哈希(hash)
【go项目-geecache】动手写分布式缓存 - day5 - 分布式节点
【go项目-geecache】动手写分布式缓存 - day6 - 防止缓存击穿
【go项目-geecache】动手写分布式缓存 - day7 - 使用 Protobuf 通信
收获:
- 了解节点之间通信的方式
- 如何使用Protobuf通信
基本介绍 protobuf 和 安装方法
详情看这篇博客[【go】protobuf 基本介绍和window安装说明](【go】protobuf 基本介绍和window安装说明_CCSU__LRF的博客-CSDN博客)
使用 protobuf 通信 geecachepb.proto
syntax = "proto3"; package geecachepb; message Request { string group = 1; string key = 2;
} message Response { bytes value = 1;
} service GroupCache { rpc Get(Request) returns (Response);
}
新建 package geecachepb
,定义 geecachepb.proto
Requset
为信息类型:包含group和key满足/_geecache/<group>/<name>
所需要的参数Response
为信息类型 : 包含一个value为bytes, 表示回复的内容
生成 geecache.pb.go
$ protoc --go_out=. *.proto
$ ls
geecachepb.pb.go geecachepb.proto
可以看到 geecachepb.pb.go
中有如下数据类型:
type Request struct { Group string `protobuf:"bytes,1,opt,name=group,proto3" json:"group,omitempty"` Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` ...
}
type Response struct { Value []byte `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
}
修改 peers.go
中的 PeerGetter
接口
import pb "geecache/geecachepb"
type PeerGetter interface { Get(in *pb.Request, out *pb.Response) error
}
修改 group.go
import ( // ... pb "geecache/geecachepb"
) func (g *Group) getFromPeer(peer PeerGetter, key string) (ByteView, error) { req := &pb.Request{ Group: g.name, Key: key, } res := &pb.Response{} err := peer.Get(req, res) if err != nil { return ByteView
, err } return ByteView{b: res.Value}, nil
}
修改 http.go
import ( // ... pb "geecache/geecachepb" "github.com/golang/protobuf/proto"
) func (p *HTTPPool) ServeHTTP(w http.ResponseWriter, r *http.Request) { // ... // Write the value to the response body as a proto message. body, err := proto.Marshal(&pb.Response{Value: view.ByteSlice()}) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } w.Header().Set("Content-Type", "application/octet-stream") w.Write(body)
} func (h *httpGetter) Get(in *pb.Request, out *pb.Response) error { u := fmt.Sprintf( "%v%v/%v", h.baseURL, url.QueryEscape(in.GetGroup()), url.QueryEscape(in.GetKey()), ) res, err := http.Get(u) // ... if err = proto.Unmarshal(bytes, out); err != nil { return fmt.Errorf("decoding response body: %v", err) } return nil
}
【go项目-geecache】动手写分布式缓存 - day7 - 使用 Protobuf 通信相关推荐
- picACG本地缓存目录_7天用Go动手写/从零实现分布式缓存GeeCache
目录 第一天:LRU 缓存淘汰策略 | Code - Github 第二天:单机并发缓存 | Code - Github 第三天:HTTP 服务端 | Code - Github 第四天:一致性哈希( ...
- go操作网页元素_7天用Go动手写/从零实现分布式缓存GeeCache
目录 第一天:LRU 缓存淘汰策略 | Code - Github 第二天:单机并发缓存 | Code - Github 第三天:HTTP 服务端 | Code - Github 第四天:一致性哈希( ...
- Asp.Net Core 轻松学-正确使用分布式缓存
前言 本来昨天应该更新的,但是由于各种原因,抱歉,让追这个系列的朋友久等了.上一篇文章 在.Net Core 使用缓存和配置依赖策略 讲的是如何使用本地缓存,那么本篇文章就来了解一下如何使用分 ...
- [go 语言学习笔记] 7天用Go从零实现分布式缓存GeeCache 「已完结」
说明 本文用于记录学习 go 语言过程中的笔记, 文中的代码都是在文本中敲出来的 伪代码, 并不能直接运行, 如有需要可以参考原教程. 本文的整体思路是对原系列教程阅读后的自我思考. 关于本文参考的 ...
- java 项目做多级缓存_【开源项目系列】如何基于 Spring Cache 实现多级缓存(同时整合本地缓存 Ehcache 和分布式缓存 Redis)...
一.缓存 当系统的并发量上来了,如果我们频繁地去访问数据库,那么会使数据库的压力不断增大,在高峰时甚至可以出现数据库崩溃的现象.所以一般我们会使用缓存来解决这个数据库并发访问问题,用户访问进来,会先从 ...
- 我发起了一个 .Net Core 平台上的 分布式缓存 开源项目 ShareMemory 用于 取代 Redis...
Redis 的 安装 是 复杂 的, 使用 是 复杂 的, Redis 的 功能 是 重型 的, Redis 本身的 技术实现 是 复杂 的 . Redis 是用 C 写的, C 语言 编写的代码需要 ...
- JAVA社交平台项目第六天 Redis分布式缓存
第6章 - Redis分布式缓存 学习目标: 掌握Redis性能测试 掌握Redis读写分离搭建 掌握Redis高可用Sentinel搭建 掌握Sentinel整合SpringBoot 掌握Redis ...
- 分布式面试全家桶:分布式事务+分布式锁+分布式缓存+分布式面试题+分布式项目
一.分布式事务 1.分布式事务简介 2.Seata简介 3.Seata-Server安装 4.Seata配置Nacos注册中心和配置中心 5.Seata-AT模式 6.XA协议 7.Seata整体 ...
- 分布式技术与实战第六课 分布式缓存设计
第33讲:不止业务缓存,分布式系统中还有哪些缓存? 缓存是分布式系统开发中的常见技术,在分布式系统中的缓存,不止 Redis.Memcached 等后端存储:在前端页面.浏览器.网络 CDN 中也都有 ...
最新文章
- JS页面加载完成触发事件
- linux在生信的作用,【生信笔记】右键菜单打开WSL功能方法简介
- 如何利用XShell隧道通过跳板机连接内网机器
- tensolrflow之基础变量
- Asp.Net生命周期系列三
- CRM Fiori my note应用的后台ABAP实现
- go爬虫和python爬虫哪个好_python 爬虫实战项目--爬取京东商品信息(价格、优惠、排名、好评率等)-Go语言中文社区...
- 祝贺 Java 走过创新的 25 年
- posix 线程(一)
- 使用内存精简版caffe运行densenet
- 2020年4月编程语言排行榜:少儿编程真有这么火吗?
- redis常用命令与常用api
- GD32F450替换STM32F429
- xui和嘟嘟桌面哪个好_小米这款手机桌面,好用到忘记原生桌面
- 自我总结3dmaxs建筑场景展uv步骤
- html、css、js粒子特效——前端
- 两行轨道报(TLE)简介
- 相对舒适的爬虫入门系列(一):手快尝鲜【requests库】
- Python 进阶视频课 - 10. LSMC 美式百慕大期权定价
- 使用node上传到腾讯云对象存储cos---转载
热门文章
- 守护软件供应链安全:国产软件BinSearch的最佳实践
- 【Kaggle从入门到放弃】(01):竞赛类型
- Python 的异步 IO:Aiohttp Client 代码分析
- ABAP DOI 下载SMW0的EXCEL和WORD模板
- [CAN] [CVPR2019]:Context-Aware Crowd Counting论文+代码解读
- 杨校老师课堂之CSDN博客查找博文汇总-目录
- 传输加载优化(资源压缩、资源缓存、HTTP2)
- ios时间戳和日期的一些转换,如具体时间,年龄,星座等等
- TOF传感器、摄像头传感器、超声波传感器、激光雷达、毫米波雷达
- 一起撸个简单粗暴的Tv应用主界面的网格布局控件(下)