go-geecache 总结和收获
【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 通信
一 :实现LRU算法
做了什么?
这里我们定义了数据结构 Cache 包含一个双向链表和map,map表示真正的缓存,双向链表表示最近的缓存使用情况,然后定义一个entry,用来淘汰双向链表队首,根据key删除map数据
我的收获:
- 学会了接口类型转化 A. (type),意思时把A接口转换成type类型
- 学会了go的单元测试
- 回调函数的定义
二 :单机并发缓存
做了什么?
- 定义了数据结构ByteView用来表示缓存值,里面使用byte可以表示任意数据类型如图片
- 定义cache封装lru.Cache,包括一个Mutex锁,Cache缓存主体,缓存大小,目的是添加了并发机制
- 封装增删的方法,添加并发
- 定义接口 Getter 和 回调函数
Get(key string)([]byte, error)
,用来在缓存不存在时,从外界获取数据 - 定义数据结构Group封装了cache,目的是负责与用户的交互,并且控制缓存值存储和获取的流程,里面包含name,表示缓存空间命名,主体cache,和回调函数getter
- 实现Group的Get,new方法
我的收获:
- 学会并发控制,锁的应用
- 接口型函数的应用场景
- 数据结构之间的封装
- defer的用法
三 :HTTP服务端
做了什么?
- 定义 HTTPPool ,作为HTTP通信的主要数据结构,包括self自己名字和basepath前缀名字
- 实现了Log记录日志,ServerHTTP,先判断是不是合法通信格式,然后完成服务端功能即是缓存找不到时,从外界获取数据
我的收获:
- 了解了HTTP通信
四 :一致性哈希
做了什么?
- 定义数据结构Map实现一致性哈希算法,包含哈希函数,虚拟节点倍数
replicas
(为了进一步提高系统的可靠性和负载均衡,可以将每个物理节点映射到多个虚拟节点),哈希环key(存下所有key),映射表hashMap
- 实现增删接口
我的收获:
- 如何实现一致性哈希
- 哈希函数的设置
- 虚拟节点的作用
五 :分布式节点
做了什么?
- 抽象PeerPicker接口,目的是实现节点选择功能,实现Get方法,首先把URL组合起来,HTTP连接,如果返回HTTP状态码200表示正常,然乎读取返回
- 为HTTPPool 添加节点选择,添加peers为一致性哈希算法的map,httpGetters为 map表示远程对应的节点。
- 实现 PeerPicker 接口,Set()和PickPeer()
- 集成在主流程
我的收获:
- 加深了锁的使用,涉及修改就要用
- 时刻要考虑不安全的情况
六:防止缓存击穿
做了什么?
- 创建call表示正在进行或已经结束的请求,包括一个sync.WaitGroup(等待组),空接口val,创建Group,管理不同的key请求,包括互斥锁,map表示不同请求的状态
- 实现DO方法,保证对于每一个请求只会执行一次函数
- 在Group加入singleflight
收获
- 空接口和匿名函数的使用
- 缓存击穿/崩溃/穿透的概念
- 如何防止缓存击穿
七 :Protobuf 通信
做了什么?
- 定义.proto文件,包括基本的信息结构,还有一个RPC方法名,它接受一个类型为 “Request” 的参数,并返回一个类型为 “Response” 的响应。
- 利用
protoc --go_out=. *.proto
自动生成geecachepb.pb.go
- 修改PeerGetter ,该改为使用
geecachepb.pb.go
中的数据类型 - 修改group.go所有使用了
PeerGetter
接口的地方
收获
- 加深了对HTTP通信的理解
- 了解了Protobuf通信
go-geecache 总结和收获相关推荐
- 【go项目-geecache】动手写分布式缓存 - day7 - 使用 Protobuf 通信
索引 [go项目-geecache]动手写分布式缓存 - day1 - 实现LRU算法 [go项目-geecache]动手写分布式缓存 - day2 - 单机并发缓存 [go项目-geecache]动 ...
- 两个月番茄组长的收获总结
一路走来,成长很多... 1.第一个月 来的时候,正巧是番茄1.2.5发布,熟悉了晓鸿的代码,觉得只要负责好自己的那部分就可以了,一直没有融入到大家的开发中.番茄开始PC端2.0的开发,本以为是从新的 ...
- github javaguide_GitHub上收获Star数排名前10的Java项目
1. CS-Notes star:92.1k 介绍:技术面试必备基础知识.Leetcode.计算机操作系统.计算机网络.系统设计.Java.Python.C++ :地址:https://cyc2018 ...
- c# 数据可视化_#OpenVisConf上的22位数据可视化从业者的10点收获
c# 数据可视化 by Siena Duplan 通过锡耶纳·杜普兰(Siena Duplan) #OpenVisConf上的22位数据可视化从业者的10点收获 (10 Takeaways from ...
- 项目开发过程中的收获与思考
2013年7月,我正式毕业了,到公司入职,也就正式成为了一名菜鸟程序员.到今天,2014年1月3日,目前主要的工作是公司一个项目中的一个功能模块,到我进入项目组算起,已经过了四个月了.因此,想写点东西 ...
- win32的一个售票程序,收获有非常的多
先秀一下我的收获吧! 1.在创建非模态对话框的时,需要用到createdialog函数,第二个参数需要注意是填写对话框的资源标识符(id),之后需要调用showwindow来显示对话框:或者不这么做也 ...
- GitHub超全机器学习工程师成长路线图,开源两日收获3700+Star!
参加 2019 Python开发者日,请扫码咨询 ↑↑↑ 大会议题以及更多详情请查看:https://pythondevdays2019.csdn.net/ 作者 | 琥珀 出品 | AI科技大本营( ...
- 集合70多种推荐算法,东北大学老师用Java写了一个开源库,在GitHub上收获近1500个Star...
[AI科技大本营导读]在经过一年多的开发工作之后,LibRec 3.0 版本终于发布了.LibRec 是一个基于 Java 的开源算法工具库,覆盖了 70 余个各类型推荐算法,可以有效解决评分预测 ...
- 霸榜多个CV任务,开源仅两天,微软分层ViT模型收获近2k star
视学算法报道 转载自:机器之心 编辑:维度 屠榜各大 CV 任务的微软 Swin Transformer,近日开源了代码和预训练模型. 自 2017 年 6 月谷歌提出 Transformer 以来, ...
最新文章
- np.random.permutation
- MVC中注册路由及其路由的设置
- 【uni-app】uParse 富文本解析插件遇到长图、大图宽高比异常问题
- python怎么部署到tomcat_使用python将war部署到tomcat
- 光电编码器的原理及应用场合_旋转式光电编码器工作原理及在视觉检测中的使用...
- 2017.9.21 所驼门王的宝藏 思考记录
- linux第五单元作业,第五单元《微型计算机系统》教案
- 机器学习入门:隐马尔科夫模型-8
- 源泉书签支持批量删除功能啦
- SXF python
- 000webhost – 1500M支持PHP可绑米免费虚拟主机
- MICCAI2019论文分享 PART①
- 基于网络特征的新型授权机制设想
- VulnHub-01 - Empire Lupin One打靶记录
- 服务器和客户端连接不稳定,服务器和客户端的连接方法
- 五绝------送卢兄之某传xiao之都
- Qt5.14_MinGW/MSVC下实现VS2019面板自由拖拽组合功能
- Java-类的方法练习--实现客户姓名的添加、显示及查询
- 某生存游戏玩家属性值分析
- HP MediaSmart HP Home Server的功耗
热门文章
- sublime text3插件使用
- UE4 Engine Fix-找回4.24后失去的Matinee
- “一路向南,dream it possible”之旅--骑行从北京到成都(二)
- n9006 android6,三星N9006怎么用 三星N9006使用方法【详解】
- go work 工作区
- 软考(软件设计师)考点总结 --法律法规与知识产权
- cesium 加载geojson 贴3dtiles
- C++ bitset的使用
- matlab画图线型、符号、颜色
- FPGA error:buffers of the same direction cannot be placed in series.