Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >构建高性能服务器 -- 缓存篇

构建高性能服务器 -- 缓存篇

原创
作者头像
jiezhu
修改于 2018-09-17 03:55:17
修改于 2018-09-17 03:55:17
1.5K0
举报
文章被收录于专栏:codingforevercodingforever

引子


说到缓存,相信大家都不陌生。缓存的目的都在于避免重复的慢速计算,比如数据库访问。相对于慢速计算,缓存将会大大提高数据存取的速率,当然同时将会缩短用户每次请求处理的时间,从而提升服务器单位时间内的请求处理数,即吞吐率。

操作系统中的缓存


事实上,我们使用的操作系统中都存在着大量的缓存机制,比如文件系统存在内核缓冲区。它位于物理内存的内核地址空间,除了使用O_DIRECT标记打开的文件以外,所有对磁盘文件的读写操作都要经过它,所以它相当于磁盘的缓存区域。

这块内核缓冲区也称为页高速缓存,实际上它包括以下两部分组成:

  • 读缓存区
  • 写缓存区

读缓存区保存着最近从磁盘上读取的数据,当下次读取相同数据时,可以直接从读缓存区直接读取数据,避免了从磁盘上进行慢速操作。

写缓存区则保存着将要写入磁盘的数据,从而避免用户进程直接进行磁盘数据的写入而产生慢速操作等待。

所以无论是读缓存区还是写缓存区,都有效避免用户进程直接进行慢速操作,即直接与磁盘进行数据交互 ---- 读或者写。

服务器中的缓存


与操作系统中的缓存类似,我们构建高性能服务器时,也可以在服务器的业务逻辑层与数据层(数据一般存入数据库进行持久化)之间再加设一层缓存层。当然,缓存层的作用也就是避免业务逻辑层与数据层直接交互,从而产生慢速操作,进而影响到服务器的性能。

当业务逻辑层需要读取数据层的相关数据时,向缓存层请求相应数据,若数据存在于缓存层,则直接从缓存层读取,若不存在,则向后端数据层读取,并同时向缓存层保存一份。当下次请求相同数据时,则无需向数据层请求,因为缓存层中已有相应数据。

当业务逻辑层需要向数据层写入数据时,首先向缓存层请求数据写入,并快速响应写入成功,而缓存层再异步向数据层真正写入数据。如此做法可以减少用户请求等待时间,提高服务器并发性能。

分步式缓存系统


开源社区已有非常成熟的分布式缓存系统,比如说memcached, redis等。它们都是属于NoSQL范畴,都是以Key-Value形式进行存储的。

我们以memcached为例。

首先,memcached高效的最大原因就是其基于Key的Hash算法来存储数据结构,并且使用了非常高效的内存分配器(事先向操作系统请求了大片内存,再进行自我管理,避免大量内存申请与释放操作),所以使数据项的查询时间复杂度达到O(1)。

其次,memcached采用libevent作为其底层的网络事件库。而libevent又是业界较好的同类型开源库,所以从底层I/O网络模型上保障其可以进行高并发数据存取操作。

再次,memcached是一种分步式缓存系统,所以在理论上可以无限扩容,即扩展服务器数量,提高服务器集群并发处理能力。而且,它采用一致性Hash方法,从而减少因缓存服务器扩容或者下线造成的数据缓存失效问题。

BTW,memcached采用LRU(Least Recently Used)及时淘汰非热点数据,从而保障所缓存数据均为热点数据,最大效率使用机器内存。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
高性能服务器架构思路:缓冲策略 (一)
韩伟
2016/10/18
7.3K1
高性能服务器架构思路:缓冲策略 (一)
高性能服务器架构思路(一)——缓冲策略
在服务器端程序开发领域,性能问题一直是备受关注的重点。业界有大量的框架、组件、类库都是以性能为卖点而广为人知。然而,服务器端程序在性能问题上应该有何种基本思路,这个却很少被这些项目的文档提及。本文正式希望介绍服务器端解决性能问题的基本策略和经典实践,并分为几个部分来说明:
凯哥Java
2019/06/30
7620
服务器性能优化的正确姿势(好文推荐)
导言:运维工作中除了要维持平台的稳定运行以外,还得对服务器的性能进行优化,让服务器发挥出良好的工作性能是稳定运行的基础。腾讯互娱DBA团队的汪伟(simon)在这一领域里整理出了一套性能优化的资料为大家在性能优化提供充足的方向。
Spark学习技巧
2019/05/16
2.8K0
服务器性能优化的正确姿势(好文推荐)
高性能服务器架构思路【不仅是思路】
在服务器端程序开发领域,性能问题一直是备受关注的重点。业界有大量的框架、组件、类库都是以性能为卖点而广为人知。然而,服务器端程序在性能问题上应该有何种基本思路,这个却很少被这些项目的文档提及。本文正式希望介绍服务器端解决性能问题的基本策略和经典实践,并分为几个部分来说明:
shaonbean
2019/05/27
8160
memcached架构及缓存策略
----------------------------------------概述----------------------------------------
星哥玩云
2022/07/26
7560
memcached架构及缓存策略
高性能服务器架构思路 :分布式系统概念 ( 三 )
任何的服务器的性能都是有极限的,面对海量的互联网访问需求,是不可能单靠一台服务器或者一个CPU来承担的。所以我们一般都会在运行时架构设计之初,就考虑如何能利用多个CPU、多台服务器来分担负载,这就是所
韩伟
2016/10/19
15.3K2
高性能服务器架构思路 :分布式系统概念 ( 三 )
高性能服务器架构思路( 五 ) : 分布式缓存
本文介绍了分布式缓存和分布式缓存同步出现的原因,以及常用的解决方案,包括一致性哈希、延迟同步、修改广播等。这些方案在实际应用中可能会结合使用,以提供高性能的缓存服务。
韩伟
2016/10/20
5.3K0
高性能服务器架构思路( 五 ) : 分布式缓存
【项目设计】仿muduo实现高性能服务器组件
项目源码目录 (博客中的代码截图稍有一点不完整,如果要拿到完整的代码需要去访问gitee,本文不会讲繁杂的各个模块代码上细节的处理,代码实现上你所较容易产生的为什么问题,我都在代码截图上注释清楚了,如果你觉得自己光看代码无法理解的非常透彻,建议你把代码实现一遍,在实现过程中你一定会不断的思考,产生问题,解决问题,这会帮助你更好的掌握该项目的思想,此时如果你回头再看本篇博客中我所说的看起来没啥用较为鸡肋的思想时,你我之间可能会产生共鸣。) 1. 本项目旨在实现一个能够在某一时刻接收大量的高并发连接的服务器组件,注意我们实现的是一个组件,也就是说通过该组件,使用者就可以快速简单的搭建出一个高性能服务器,在此服务器基础上,使用者可以任意添加各种应用层协议,以此来实现出多种功能的服务器,例如HTTP服务器,FTP服务器,SSH服务器等等…… 本博客则实现较为常见的HTTP服务器,即使用这个服务器组件搭建出基本的底层服务器框架后,只需要在应用层添加HTTP协议式数据的解析和发送即可,这样就完成了一个服务器的搭建,本博客的核心知识点80%都集中在实现该高并发服务器组件上,通过实现该组件,你可以学到Reactor事件驱动处理模式的设计思想,理解linux下一切皆文件的哲学理念,也可以学到one thread one loop的多线程编码时各种需要注意的坑。 20%的应用层协议支持相对较为简单,但从中你也可以学到如何在源源不断到来的字节流数据中,把握好数据的解析处理节奏,从而拿出一个完整的HTTP请求进行解析和响应,此外也可以加深你对HTTP这种协议下数据格式的印象。
举杯邀明月
2024/01/30
3380
【项目设计】仿muduo实现高性能服务器组件
Redis缓存设计原理及实战
一个系统中的不同层之间的访问速度不一样,所以我们才需要缓存,这样就可以把一些需要频繁访问的数据放在缓存中,以加快它们的访问速度。
JavaEdge
2022/11/30
7170
Redis缓存设计原理及实战
彻底搞懂高性能I/O之道
本文介绍操作系统I/O工作原理,Java I/O设计,基本使用,开源项目中实现高性能I/O常见方法和实现,彻底搞懂高性能I/O之道
用户1260737
2019/11/15
1.2K0
《大型网站技术架构》读书笔记四:瞬时响应之网站的高性能架构
此篇已收录至《大型网站技术架构》读书笔记系列目录贴,点击访问该目录可获取更多内容。
Edison Zhou
2018/08/20
6120
《大型网站技术架构》读书笔记四:瞬时响应之网站的高性能架构
Key/Value之王Memcached初探:一、掀起Memcached的盖头来
  在数据驱动的Web开发中,经常要重复从数据库中取出相同的数据,这种重复极大的增加了数据库负载。缓存是解决这个问题的好办法。但是ASP.NET中的HttpRuntime.Cache虽然已经可以实现对页面局部进行缓存,但还是不够灵活,此时Memcached或许是你想要的。
Edison Zhou
2018/08/20
5110
Key/Value之王Memcached初探:一、掀起Memcached的盖头来
CloudBluePrint-Chapter 1.2: 云上应用技术架构-缓存与队列
在操作系统中,缓存是一种存储技术,用于提高数据读取和写入的速度。Linux 内核使用了两种主要的缓存机制:Buffer Cache和Page Cache。这两种缓存机制都是为了提高系统性能,但它们在实现方式和目标上有所不同。
行者深蓝
2023/08/23
2540
高性能服务器程序框架
http://blog.csdn.net/zs634134578/article/details/19806429
bear_fish
2018/09/20
2.1K0
高性能服务器程序框架
Pinterest 大规模缓存集群的架构剖析
本文由 Kevin Lin 发表在 medium.com,经原作者授权由 InfoQ 中文站翻译并分享
深度学习与Python
2023/04/01
4080
Pinterest 大规模缓存集群的架构剖析
几种服务器端IO模型的简单介绍及实现
一些概念: 同步和异步 同步和异步是针对应用程序和内核的交互而言的,同步指的是用户进程触发I/O操作并等待或者轮询的去查看I/O操作是否就绪,而异步是指用户进程触发I/O操作以后便开始做自己的事情,而当I/O操作已经完成的时候会得到I/O完成的通知。 阻塞和非阻塞 阻塞和非阻塞是针对于进程在访问数据的时候,根据I/O操作的就绪状态来采取的不同方式,说白了是一种读取或者写入操作函数的实现方式,阻塞方式下读取或者写入函数将一直等待,而非阻塞方式下,读取或者写入函数会立即返回一个状态值。 服务器端几种模型: 1、
李海彬
2018/03/23
1.5K0
几种服务器端IO模型的简单介绍及实现
高并发、高性能 Web 架构
典型 Web App 架构 以下是一个典型的高负载 web 应用示例:上图展示了一个典型的,三层架构的高性能 Web 应用。这种成熟的架构多年以来已被广泛部署于包括 Google、Yahoo、Facebook、Twitter、Wikipedia 在内的诸多大型 Web 应用中。 反向代理服务 位于三层构架中最外层的反向代理服务器负责接受用户的接入请求,在实际应用中,代理服务器通常至少还要完成以下列表中的一部分任务:连接管理:分别维护客户端和应用服务器的连接池,管理并关闭已超时的长连接。 攻击检测和安全隔
Java高级架构
2018/07/20
1.2K0
缓存在分布式系统中的应用
缓存是分布式系统中的重要组件,主要解决高并发,大数据场景下,热点数据访问的性能问题。提供高性能的数据快速访问。 一、缓存概述 缓存是分布式系统中的重要组件,主要解决高并发,大数据场景下,热点数据访问的性能问题。提供高性能的数据快速访问。 1.1缓存的原理 (1) 将数据写入/读取速度更快的存储(设备); (2) 将数据缓存到离应用最近的位置; (3) 将数据缓存到离用户最近的位置。 1.2缓存分类 在分布式系统中,缓存的应用非常广泛,从部署角度有以下几个方面的缓存应用。
用户1263954
2018/01/30
1.7K0
缓存在分布式系统中的应用
认识高性能Web缓存体系,你需要知道这些
前言 我们再看知识体系的时候,我们学一个东西的时候,每次我们都回过头去看一看,这就是所谓的不忘初心。这个说着容易做起来难,当一个人慢慢在成长,在进步的时候,是很难做到不忘初心的。 我们之前说了DNS缓存、浏览器缓存(维护了这么久的服务器,你真的认识 Web 缓存体系?),所以浏览器就是我们安排在千家万户缓存代理服务器,你把浏览器缓存用好,性能就不用说。 为什么这么说?如果遇到关于session或cookie的过期时间这样的问题,浏览器都不会向服务器发送连接请求。它直接用浏览器本地缓存就打开了,你说它快还是不
DevOps时代
2018/02/02
1.6K0
认识高性能Web缓存体系,你需要知道这些
高并发环境下服务器该如何优化
以下内容为入门级介绍,意在对老技术作较全的总结而不是较深的研究。主要参考《构建高性能Web站点》一书。
Bug开发工程师
2018/07/23
1.8K0
推荐阅读
相关推荐
高性能服务器架构思路:缓冲策略 (一)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档