目录

  • 第一天:LRU 缓存淘汰策略 | Code - Github
  • 第二天:单机并发缓存 | Code - Github
  • 第三天:HTTP 服务端 | Code - Github
  • 第四天:一致性哈希(Hash) | Code - Github
  • 第五天:分布式节点 | Code - Github
  • 第六天:防止缓存击穿 | Code - Github
  • 第七天:使用 Protobuf 通信 | Code - Github

谈谈分布式缓存

第一次请求时将一些耗时操作的结果暂存,以后遇到相同的请求,直接返回暂存的数据。我想这是大部分童鞋对于缓存的理解。在计算机系统中,缓存无处不在,比如我们访问一个网页,网页和引用的 JS/CSS 等静态文件,根据不同的策略,会缓存在浏览器本地或是 CDN 服务器,那在第二次访问的时候,就会觉得网页加载的速度快了不少;比如微博的点赞的数量,不可能每个人每次访问,都从数据库中查找所有点赞的记录再统计,数据库的操作是很耗时的,很难支持那么大的流量,所以一般点赞这类数据是缓存在 Redis 服务集群中的。

商业世界里,现金为王;架构世界里,缓存为王。

缓存中最简单的莫过于存储在内存中的键值对缓存了。说到键值对,很容易想到的是字典(dict)类型,Go 语言中称之为 map。那直接创建一个 map,每次有新数据就往 map 中插入不就好了,这不就是键值对缓存么?这样做有什么问题呢?

1)内存不够了怎么办?

那就随机删掉几条数据好了。随机删掉好呢?还是按照时间顺序好呢?或者是有没有其他更好的淘汰策略呢?不同数据的访问频率是不一样的,优先删除访问频率低的数据是不是更好呢?数据的访问频率可能随着时间变化,那优先删除最近最少访问的数据可能是一个更好的选择。我们需要实现一个合理的淘汰策略。

2)并发写入冲突了怎么办?

对缓存的访问,一般不可能是串行的。map 是没有并发保护的,应对并发的场景,修改操作(包括新增,更新和删除)需要加锁。

3)单机性能不够怎么办?

单台计算机的资源是有限的,计算、存储等都是有限的。随着业务量和访问量的增加,单台机器很容易遇到瓶颈。如果利用多台计算机的资源,并行处理提高性能就要缓存应用能够支持分布式,这称为水平扩展(scale horizontally)。与水平扩展相对应的是垂直扩展(scale vertically),即通过增加单个节点的计算、存储、带宽等,来提高系统的性能,硬件的成本和性能并非呈线性关系,大部分情况下,分布式系统是一个更优的选择。

4)…

关于 GeeCache

设计一个分布式缓存系统,需要考虑资源控制、淘汰策略、并发、分布式节点通信等各个方面的问题。而且,针对不同的应用场景,还需要在不同的特性之间权衡,例如,是否需要支持缓存更新?还是假定缓存在淘汰之前是不允许改变的。不同的权衡对应着不同的实现。

groupcache 是 Go 语言版的 memcached,目的是在某些特定场合替代 memcached。groupcache 的作者也是 memcached 的作者。无论是了解单机缓存还是分布式缓存,深入学习这个库的实现都是非常有意义的。

GeeCache 基本上模仿了 groupcache 的实现,为了将代码量限制在 500 行左右(groupcache 约 3000 行),裁剪了部分功能。但总体实现上,还是与 groupcache 非常接近的。支持特性有:

  • 单机缓存和基于 HTTP 的分布式缓存
  • 最近最少访问(Least Recently Used, LRU) 缓存策略
  • 使用 Go 锁机制防止缓存击穿
  • 使用一致性哈希选择节点,实现负载均衡
  • 使用 protobuf 优化节点间二进制通信

GeeCache 分7天实现,每天完成的部分都是可以独立运行和测试的,就像搭积木一样,每天实现的特性组合在一起就是最终的分布式缓存系统。每天的代码在 100 行左右。

附 推荐阅读

  • Go 语言简明教程
  • Go Test 单元测试简明教程
  • Go Protobuf 简明教程

原文地址:7天用Go从零实现分布式缓存GeeCache | 极客兔兔

知乎专栏:Go语言 - 极客兔兔

关注微博:@极客兔兔

关联答案:

怎么学习 Golang?​www.zhihu.com

有哪些值得学习的 Go 语言开源项目?​www.zhihu.com

go操作网页元素_7天用Go动手写/从零实现分布式缓存GeeCache相关推荐

  1. picACG本地缓存目录_7天用Go动手写/从零实现分布式缓存GeeCache

    目录 第一天:LRU 缓存淘汰策略 | Code - Github 第二天:单机并发缓存 | Code - Github 第三天:HTTP 服务端 | Code - Github 第四天:一致性哈希( ...

  2. 『Winform』C# Winform WebBrowser控件中操作网页元素大全

    文章目录 1.获取非input控件的值 2.获取input控件的值 3.给输入框赋值 4.CheckBox选中 5.根据已知有ID的元素操作没有ID的元素 6.获取Div或其他元素的样式 7.直接执行 ...

  3. webBrowser中操作网页元素全攻略

    原文地址:https://www.cnblogs.com/qqflying/archive/2012/07/27/2611563.html 1.获取非input控件的值: webBrowser1.Do ...

  4. go操作网页元素_UI自动化21heliumS元素定位方式

    演示:4种方式定位按钮? 01 / 前言 helium提供方法S实现的是jQuery样式选择器,用于通过ID,名称,CSS识别HTML元素类,CSS选择器或XPath 02 / 入参介绍 以下是源码中 ...

  5. class 第一个元素_第二章(第3节):网页元素定位和操作

    大家仔细思考一下,我们用 selenium 操控浏览器是什么意思,其实就是用 selenium 模拟人上网,也就是说人用浏览器能做的任何事情,我们用 selenium 都可以做,selenium 就如 ...

  6. 在线拖拽html,html5拖曳操作 HTML5实现网页元素的拖放操作

    HTML5之前,要实现网页元素的拖放操作,需要依靠mousedown.mousemove.mouseup等API,通过大量的JS代码来实现:HTML5中引入了直接支持拖放操作的API,大大简化了网页元 ...

  7. Delphi XE 10.2.3使用CEF4Delphi取网页元素时碰到nbsp;变问号?的处理

    用CEF4Delphi取网页元素时碰到ElementInnerText里含有" " 比如网页源码里是"内容 "取出来显示就变成"内容?" 搜 ...

  8. 模拟操作网页 webBrowser

    C# 获取IFrame中body元素 (winform) 方法1. 找出iframe的b.html的src , 利用webbrowser去加载b.html HtmlElementCollection ...

  9. php生成网页按钮,JavaScript实现自动生成网页元素功能(按钮、文本等)_javascript技巧...

    创建元素的方法: 1.利用createTextNode()创建一个文本对象 2.利用createElement()创建一个标签对象 3.直接利用容器标签中的一个属性:innerHTML-----本质上 ...

最新文章

  1. Git Bash Cmd命令笔记
  2. css实现多行文字溢出隐藏——前端小问题不定时更新
  3. Java实现算法导论中最长公共子序列(LCS)动态规划法
  4. Windows进程与线程学习笔记(八)—— 线程切换与TSS/FS
  5. Direct3D学习_绘制流水线
  6. Liferay Portal学习笔记-coldTear
  7. 基于Swoole开发PHP扩展
  8. Ubuntu软件安装
  9. java blob字段_java 存取blob字段
  10. Java报警110_Java入门基础SL110
  11. ASP.NET HyperLink控件NavigateUrl中用到DataBinder.Eval时
  12. 安卓pdf阅读器_手把手教你选购电子书阅读器!(Kindle/掌阅电子纸/文石电子书/小米电纸书……)...
  13. 互联网电商数据分析常用的指标
  14. 求最大值 最小值 下标 及格率 c语言,输入某班的C语言成绩,计算输出其及格率...
  15. 在visio中绘制流程图如何绘制箭头?
  16. git push时提示邮箱格式不正确
  17. 响铃:“新品牌计划”出炉,但拼多多要的不只是C2M
  18. ImageNet 1000个类 具体内容
  19. Beyond compare添加插件
  20. 2022-2028全球一次性防护服行业调研及趋势分析报告

热门文章

  1. VScode编辑器设置中文的教程,超详细的
  2. 中文分词算法python_Python FMM算法的中文分词器实现方法源码
  3. 双向卷积神经网络_一个用于精细动作检测的多路双向递归神经网络
  4. Java9中的GC 调优
  5. VTK:绘制bottle瓶子用法实战
  6. VTK:vtkAreaPicker用法实战
  7. boost::sort模块实现spreadsort 字符串函子排序示例
  8. boost::ratio_multiply相关的测试程序
  9. 用作键提取器的函数的 Boost.MultiIndex 示例
  10. hana::detail::variadic::foldl1用法的测试程序