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

引子


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

操作系统中的缓存


事实上,我们使用的操作系统中都存在着大量的缓存机制,比如文件系统存在内核缓冲区。它位于物理内存的内核地址空间,除了使用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)及时淘汰非热点数据,从而保障所缓存数据均为热点数据,最大效率使用机器内存。

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

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

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏熊训德的专栏

Hbase Replicaition 在腾讯云中应用概述

Hbase 的 Repliation 是通过 Zookeeper 的协助,从 Master 集群异步往 Slave 集群写 WAL 实现的。可以实现典型的 Ma...

7505
来自专栏小白安全

小白博客 迷你音乐播放器及实现全站pjax无刷新加载

演示截图: ? 请点击此处输入图片描述 ? 请点击此处输入图片描述 使用教程,下载播放器文件,直接上传压缩包至你的网站根目录,然后解压到根目...

5015
来自专栏张善友的专栏

SQL Server 2008基于策略的管理

基于策略的管理(Policy Based Management),使DBA们可以制定管理策略,并将这些策略应用到服务器、数据库以及数据环境中的其他对象上去。经过...

2209
来自专栏desperate633

session和cookies会话机制详解session management会话管理的原理servlet&jsp中的session会话管理机制cookie的更多用处

web请求与响应基于http,而http是无状态协议。所以我们为了跨越多个请求保留用户的状态,需要利用某种工具帮助我们记录与识别每一次请求及请求的其他信息。举个...

871
来自专栏张戈的专栏

Linux系统内存监控、性能诊断工具vmstat命令详解

最近,烦心事有点多,博客也像是进入了便秘期。虽然还远远不到说放弃的地步,但总有一种挤不出牙膏的郁闷感。很怀念前几个月的冲劲和激情,一天都能存好几篇优质草稿。 看...

3485
来自专栏大内老A

WCF中并发(Concurrency)与限流(Throttling)体系深入解析系列[共7篇]

服务(Service)的本质就是提供服务消费者期望的某种功能,服务的价值体现在两个方面:服务本身的质量和寄宿服务的平台应付消费者的数量,并发(Concurren...

1876
来自专栏木子墨的前端日常

本机未装Oracle数据库时Navicat for Oracle 报错:Cannot create oci environment 原因分析及解决方案

因为要更新数据库加个表,远程桌面又无法连接。。。所以就远程到另外一台电脑,然后用navicat通过内网修改目标数据库。

1063
来自专栏Python中文社区

如何构建爬虫代理服务?

如何构建爬虫代理服务 专栏作者:Kaito 起因 做过爬虫的人应该都知道,抓的网站和数据多了,如果爬虫抓取速度过快,免不了触发网站的防爬机制,几乎用的同一招就是...

36910
来自专栏java一日一条

如何通过编程发现Java死锁

死锁是指,两个或多个动作一直在等待其他动作完成而使得所有动作都始终处在阻塞的状态。想要在开发阶段检测到死锁是非常困难的,而想要解除死锁往往需要重新启动程序。更糟...

1431
来自专栏繁花云

利用Speedtest测试服务器网速

speedtest是由国外用户sivel编写的一款跨平台的网速测试软件,使用GO编写,支持大部分平台

3900

扫码关注云+社区

领取腾讯云代金券