实验干货分享:用Go语言实现分布式缓存开发之map
本实验是整个分布式缓存开发的基础实验,主要会使用 Go 语言的内置库完成一个单机版的缓存服务,后面会基于这个单机版的缓存服务来升级改造,逐步迭代成为一个分布式的缓存服务。本实验会使用 Go 语言的 map 来开发一个缓存结构,并使用 sync 包来保证并发安全,最后使用 http 包来提供网络服务。由于篇幅有限,这里仅展现map容器的使用,我会把后续和源代码放在文章最后,大家自取哦~
知识点
- Go map 容器的使用
缓存的介绍
缓存的第一印象
我们先来看这样一个问题:一个程序有 1TB 的数据都存在硬盘上,但其中只有 1GB 的数据会被频繁地读取,假设硬盘的读取速度是 100MB/s,那么每一次读取都会消耗 10 秒,有没有什么办法可以提高读取的速度?
很明显,这个问题是由于硬盘的速度太慢了,导致读取时间太久,而且只是其中 1GB 数据会被频繁地读取,那我们能不能把这 1GB 的数据存到一个速度更快的地方,比如存到内存中,假设内存速度是 10GB/s,那么每一次读取这 1GB 的数据就只需要 0.1 秒。可能有人会说,那为什么不把全部数据都存到内存中呢?当然可以,只要你有足够大的内存,但是内存的价格要比硬盘高不少,整个程序的花费就会非常大,而且其他数据存进内存的意义不大。
如果要给这里的“内存”起一个名字,就可以叫它“缓存”了。我们不用去纠结缓存的概念是什么,更重要的是它解决了什么问题。
缓存的特点
还是从上面的问题入手,我们可以提取出两个关键点:频繁,速度。
这两个关键点意味着缓存中的数据往往是会被反复读取的,因为经常要读取,所以要提高读取的速度。另外,由于数据本身是存在硬盘上的,所以不管缓存中有没有这些数据,程序都应该是正常运行的,当缓存中没有数据的时候,需要去硬盘中读取。如果程序修改了硬盘上的数据,缓存中的数据就没有用了,属于过时的数据,所以还需要去更新缓存。
所以,我们可以总结出缓存的特点:
- 速度很快(这个快是相对于被缓存的设备来说的)
- 数据可以丢失(甚至需要定期丢失)
- 容量有限(因为价格比较高)
map 的常用操作
map 的介绍
Go 语言的 map 是一种键值对的结构,每一个键值对都分为 key 和 value 两个部分。在使用 map 的时候需要指定 key 和 value 的类型,其中 key 在 map 中是唯一的。下面让我们来学习几个 map 的常见操作:
在后面的示例内容中,我们只会给到对应功能的代码,未给出完整程序,请自行补充 main 函数等内容。
map 的创建
func create() {// map 的创建需要指定 key 和 value 的类型// 其中 [] 中的类型是 key 的类型,[] 后面的类型是 value 的// 1. 使用 make 创建 mapm1 := make(map[string]string)fmt.Println(m1) // map[]// 2. 直接创建 mapm2 := map[string]string{}fmt.Println(m2) // map[]// 3. 创建 map 的同时添加数据m3 := map[string]string{"key": "value",}fmt.Println(m3) // map[key:value]
}
运行截图:
map 的增删改查
func crud() {// 创建 mapm := make(map[string]string)fmt.Println(m) // map[]// 添加数据m["key"] = "value"fmt.Println(m) // map[key:value]// 修改数据m["key"] = "newValue"fmt.Println(m) // map[key:newValue]// 查询数据// 第一个返回值是数据,第二个返回值表示 key 是否存在value, ok := m["key"]fmt.Println(value, ok) // newValue truevalue, ok = m["not existed key"]fmt.Println(value, ok) // false,这里的 value 是空字符串// 删除数据delete(m, "key")
}
运行截图:
map 的其他操作
func other() {// 创建 mapm := map[string]int{"a": 1,"b": 3,"c": 4,"d": 2,"e": 0,}// 遍历 map 可以使用 for range// 每一次遍历 map 的顺序可能都是不一样的for key, value := range m {fmt.Println(key, value) // 乱序打印出 m 中的 key 和 value}// 查看 map 中的键值对个数count := len(m)fmt.Println(count) // 5
}
运行截图:
第一个热身实验的第一部分就到这里啦。后续我们经过开发可以完成单机版缓存,之后会进行迭代,升级成分布式缓存。
怎么样,是不是 so easy 啊,别急,后面我们会遇到各种各样的难题,需要大家一起拿起“屠龙刀”去杀敌。
本章节代码可以直接获取:
wget
https://labfile.oss.aliyuncs.com/courses/2943/code1.zip
参考资料
实验干货分享:用Go语言实现分布式缓存开发之map相关推荐
- ldaptemplate 分页_UI设计干货分享:设计语言 - 侧边导航栏/分页
原文作者:罗耀_UI 侧边导航栏.分页.步骤条的绘制方法 不管是做设计(感性)还是设计规范(理性),都是仁者见仁智者见智的,都很主观.我是想阐述出自己的想法供大家参考,文章中的数值也不是固定标准,还是 ...
- 为什么jsp的form表单不能跳转_UI设计干货分享:设计语言 - 表单(登录/注册)...
原文作者:罗耀_UI 设计语言中的表单中的登录与注册部分 大致讲完了按钮.下拉菜单.导航栏.分页等,就要开始讲表单了.表单也分几种功能和几种样式,我也不可能不能把它们一一讲出来,所以只挑出几个常用的来 ...
- rstudio python_【干货分享】R语言与数据分析系列之R与Rstudio的安装
第一章 R基础 一.什么是R 1.编程:面向对象的编程语言 2.使用者:有着统计分析功能及强大作图功能的软件 3.开发者:一组开源的数据操作 二.R的优点 免费.跨平台.简单易学.程序小巧.易扩展. ...
- 【腾讯Bugly干货分享】彻底弄懂 Http 缓存机制 - 基于缓存策略三要素分解法
本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/qOMO0LIdA47j3RjhbCWUEQ 作者:李 ...
- 教程二:go语言windows gui界面开发之walk 控件学习第一节
常用控件集合 本章介绍并学习路线中弹窗之前(包含弹窗)的所有控件 一.认识控件 本章将要学习的控件列表如下图所示,逐一讲解使用方法: 二.预备知识 2.1 控件结构体中通用字段 AssignTo :绑 ...
- 热身:go语言windows gui界面开发之walk 改错
如果其他文章发现服务跑不起来,出现闪退,可以参考本文,请看到最后. 编译和环境问题点我解决 第一步 直接上代码 package mainimport ("syscall"" ...
- 分布式缓存和本地缓存的区别
分布式缓存和本地缓存的区别 redis/memcached**分布式缓存**和map/guava**本地缓存**的区别 什么是缓存一致性? redis/memcached分布式缓存和map/guava ...
- 报道 | 本科4篇顶会论文如何做到?清华特奖干货分享:我是这样写论文、做实验、与导师相处...
↑↑↑↑↑点击上方蓝色字关注我们! 『视学算法』转载 作者:量子位 编者按: 清华本科特奖获得者.清华计算机大四学生高天宇的顶会论文干货分享,手把手教你打开本科生/嗑盐小白科研之门的门钥匙. 本科生, ...
- Netty干货分享:京东京麦的生产级TCP网关技术实践总结
1.引言 京东的京麦商家后台2014年构建网关,从HTTP网关发展到TCP网关.在2016年重构完成基于Netty4.x+Protobuf3.x实现对接PC和App上下行通信的高可用.高性能.高稳定的 ...
最新文章
- Numpy入门教程:07. 随机抽样
- HoughLinesP函数(概率检测直线)
- MyEclipse + Maven开发Web工程的详细配置过程
- python将某个列表按元素值分成多个子列表
- vector 修改 java_java对vector动态数组中的对象排序,以下代码有何问题,如何修改?...
- Swift @escaping @noescape
- html 为元素附空值,HTML空(void)元素有哪些?
- 滚动条组件 http://www.w3cfuns.com/notes/15098/96195b77bdbcb601590f67f971770bb8.html
- 阿甘博客文章写法与教学方法
- [javascript] 完全开源,开心分享 HTML5 Canvas 在线图片处理《imageMagic》(single page app)开发详解[1]...
- Nginx中安装免费SSL证书开启Https请求
- 通过W3C验证CSS
- 视频: 老罗演讲问答集锦
- 华硕和兰博基尼将发布iPhone的对手
- 设置swagger文档自动同步到YApi
- ajax的各个参数详细讲解
- Java 操作SSH2实现远程执行linux命令
- 开源mysql web平台_Yearning Mysql–Web端SQL审核平台
- 自动生成统计报表功能
- 服务器win2003的远程在哪里,走进win2003远程桌面的神奇世界
热门文章
- XEvent--Demo--使用XEvent来捕获在数据库DB1上发生的锁请求和锁释放
- openvc学习笔记(4)——两种方法在没有环境下运行程序
- 忘记目标 潜心做事([日] 端河光二)
- (引)ajax 经验-保留自己使用
- 机器学习入门---------numpy
- 区分range() , np.arange() , np.linspace()
- 构建之法阅读心得(二)
- 判断线段相交(hdu1558 Segment set 线段相交+并查集)
- Flappy bird需求规格说明书
- 从零开始学习C# 2