本实验是整个分布式缓存开发的基础实验,主要会使用 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相关推荐

  1. ldaptemplate 分页_UI设计干货分享:设计语言 - 侧边导航栏/分页

    原文作者:罗耀_UI 侧边导航栏.分页.步骤条的绘制方法 不管是做设计(感性)还是设计规范(理性),都是仁者见仁智者见智的,都很主观.我是想阐述出自己的想法供大家参考,文章中的数值也不是固定标准,还是 ...

  2. 为什么jsp的form表单不能跳转_UI设计干货分享:设计语言 - 表单(登录/注册)...

    原文作者:罗耀_UI 设计语言中的表单中的登录与注册部分 大致讲完了按钮.下拉菜单.导航栏.分页等,就要开始讲表单了.表单也分几种功能和几种样式,我也不可能不能把它们一一讲出来,所以只挑出几个常用的来 ...

  3. rstudio python_【干货分享】R语言与数据分析系列之R与Rstudio的安装

    第一章 R基础 一.什么是R 1.编程:面向对象的编程语言 2.使用者:有着统计分析功能及强大作图功能的软件 3.开发者:一组开源的数据操作 二.R的优点 免费.跨平台.简单易学.程序小巧.易扩展. ...

  4. 【腾讯Bugly干货分享】彻底弄懂 Http 缓存机制 - 基于缓存策略三要素分解法

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/qOMO0LIdA47j3RjhbCWUEQ 作者:李 ...

  5. 教程二:go语言windows gui界面开发之walk 控件学习第一节

    常用控件集合 本章介绍并学习路线中弹窗之前(包含弹窗)的所有控件 一.认识控件 本章将要学习的控件列表如下图所示,逐一讲解使用方法: 二.预备知识 2.1 控件结构体中通用字段 AssignTo :绑 ...

  6. 热身:go语言windows gui界面开发之walk 改错

    如果其他文章发现服务跑不起来,出现闪退,可以参考本文,请看到最后. 编译和环境问题点我解决 第一步 直接上代码 package mainimport ("syscall"" ...

  7. 分布式缓存和本地缓存的区别

    分布式缓存和本地缓存的区别 redis/memcached**分布式缓存**和map/guava**本地缓存**的区别 什么是缓存一致性? redis/memcached分布式缓存和map/guava ...

  8. 报道 | 本科4篇顶会论文如何做到?清华特奖干货分享:我是这样写论文、做实验、与导师相处...

    ↑↑↑↑↑点击上方蓝色字关注我们! 『视学算法』转载 作者:量子位 编者按: 清华本科特奖获得者.清华计算机大四学生高天宇的顶会论文干货分享,手把手教你打开本科生/嗑盐小白科研之门的门钥匙. 本科生, ...

  9. Netty干货分享:京东京麦的生产级TCP网关技术实践总结

    1.引言 京东的京麦商家后台2014年构建网关,从HTTP网关发展到TCP网关.在2016年重构完成基于Netty4.x+Protobuf3.x实现对接PC和App上下行通信的高可用.高性能.高稳定的 ...

最新文章

  1. Numpy入门教程:07. 随机抽样
  2. HoughLinesP函数(概率检测直线)
  3. MyEclipse + Maven开发Web工程的详细配置过程
  4. python将某个列表按元素值分成多个子列表
  5. vector 修改 java_java对vector动态数组中的对象排序,以下代码有何问题,如何修改?...
  6. Swift @escaping @noescape
  7. html 为元素附空值,HTML空(void)元素有哪些?
  8. 滚动条组件 http://www.w3cfuns.com/notes/15098/96195b77bdbcb601590f67f971770bb8.html
  9. 阿甘博客文章写法与教学方法
  10. [javascript] 完全开源,开心分享 HTML5 Canvas 在线图片处理《imageMagic》(single page app)开发详解[1]...
  11. Nginx中安装免费SSL证书开启Https请求
  12. 通过W3C验证CSS
  13. 视频: 老罗演讲问答集锦
  14. 华硕和兰博基尼将发布iPhone的对手
  15. 设置swagger文档自动同步到YApi
  16. ajax的各个参数详细讲解
  17. Java 操作SSH2实现远程执行linux命令
  18. 开源mysql web平台_Yearning Mysql–Web端SQL审核平台
  19. 自动生成统计报表功能
  20. 服务器win2003的远程在哪里,走进win2003远程桌面的神奇世界

热门文章

  1. XEvent--Demo--使用XEvent来捕获在数据库DB1上发生的锁请求和锁释放
  2. openvc学习笔记(4)——两种方法在没有环境下运行程序
  3. 忘记目标 潜心做事([日] 端河光二)
  4. (引)ajax 经验-保留自己使用
  5. 机器学习入门---------numpy
  6. 区分range() , np.arange() , np.linspace()
  7. 构建之法阅读心得(二)
  8. 判断线段相交(hdu1558 Segment set 线段相交+并查集)
  9. Flappy bird需求规格说明书
  10. 从零开始学习C# 2