分布式数据:缓存技术

  • 前言
  • 什么是分布式缓存?
  • Redis 分布缓存原理
  • Memcached 分布式缓存原理
  • 对比分析
  • 知识扩展:除了分布式存储中的缓存,还有计算机体系结构和网络中的缓存, 它们又分别是什么呢?
  • 总结

前言

分布式存储中“货架”的关键技术——缓存技术。 在计算机领域的各个方面,缓存都非常重要,是提升访问性能的一个重要技术。

从单个计算机的体系结构来看,内存和处理器速度差异很大,如果不采用缓存技术,处理器的性能会受到很大的限制。 计算机应用如果不采用缓存技术,对于每个请求,应用都要与后台数据库做一次交互,而数据库中的数据存储在磁盘上,因此每次请求都要和磁盘做交互,而磁盘访问的性能很低,造成访问延迟。还有网络访问,如果没有缓存机制,每次访问主机都要与远程机器做交互,访问速度也会很慢。

什么是分布式缓存?

缓存技术其实就像一个水缸,平时它会存储一定的水,而这些水就来自深井。 如果每次都去深井打水,一方面井口比较小,导致一次能接收的用水请求有限;另一方面, 井比较深,打水的工序比较复杂,导致所需时间比较长。

有了这个水缸,不需要去深井里打水,当水缸里没水时,水泵会将深井里的水抽到水缸中暂时存储起来。“缓存技术”存储了满足了一定时间内常用的“水量”,以提高用水效率。

在计算机领域,缓存技术一般是指,用一个更快的存储设备存储一些经常用到的数据,供用户快速访问。用户不需要每次都与慢设备去做交互,因此可以提高访问效率。

分布式缓存就是指在分布式环境或系统下,把一些热门数据存储到离用户近、离应用近的位置,并尽量存储到更快的设备,以减少远程数据传输的延迟,让用户和应用可以很快访问到想要的数据。

分布式数据缓存,属于计算机应用中的缓存的一种。而计算机应用中的缓存,一般指内存,内存存储了用户经常访问的数据,用户或应用不再需要到磁盘中去获取相应的数据,大幅提高访问速度。

如下图所示,数据 A 是应用经常访问的数据,而数据 B 很少被应用访问,因此当应用访问数据 A 时,不需要到磁盘,而直接访问内存即可得到对应的值,速度较快;相反,访问数据 B 时,由于内存中没有缓存数据 B,所以应用需要到磁盘中获取对应的值,速度较慢。

Redis 分布缓存原理

Redis 的全称是 Remote Dictionary Server(远程字典服务器)。它是以字典结构将数据存储在内存中,应用可直接到内存读写 Redis 存储的数据。

Redis 集群是一个典型的去中心化结构,每个节点都负责一部分数据的存储,每个节点还会进行主备设计来提高 Redis 的可靠性。

Redis 中与缓存关系最紧密的三个特性:支持多数据结构、支持持久化和主备同步

Redis 支持多数据结构

Redis 是一个基于内存的 key-value 数据库,为了方便支持多应用的缓存,比如缓存文本类型、数据库的查询结果(字段与字段对应的值)等等,支持的数据结构不仅有简单的 k/ v 类型,还可以支持 List、Set、Hash 等复杂类型的存储。

以 Hash 这种复杂类型的存储为例,Redis 将 Hash 视作一个整体当作数据库的 value(可以是一个对象,比如结构体对象)进行存储。如果把 Hash 结构的整体看作对象的话,Hash 结构里的 key-value 相当于该对象的属性名和属性值。

比如,插入 Hash 数据类型的命令:HMSET test field1 “Hello” field2 “World”中, 如下图所示,test 为 key 值, field1 “Hello” field2 “World” 为 value 值,如果把整 个 Hash 结构看做对象的话,则 field1、field2 类似于对象中的属性名,“Hello”“World”类似于对象中的属性值。

Redis 支持持久化

持久化是指将数据从内存这种易失性存储设备中写入磁盘,从而让数据永久保存。Redis 中存储的数据虽然是基于内存的,但它也提供了持久化的机制,主要有两种方式:RDB 和 AOF。

RDB(Redis DataBase),也称快照方式, Redis 会定时将内存中的数据备份到磁盘中,形成一个快照,比如每天保存一下过去一周的数据。这样当节点出现故障时,可以根据快照恢复到不同版本的数据。这种方式有一个明显的缺点,是会造成数据丢失,即当节点出现故障时,新数据可能还未备份到磁盘中。

AOF(Append Only File)的出现主要弥补了 RDB 数据不一致的问题,其思想与数据库复制技术中 binary log 类似,即记录下 Redis 中所有的更新操作。

在 Redis 中,提供了三种实现 AOF 的策略:

  • AOF_FSYNC_NO (不同步),即不会自动触发写操作的同步;
  • AOF_FSYNC_EVERYSEC (每秒同步),即每隔一秒都会将写操作同步到磁盘;
  • AOF_FSYNC_ALWAYS (每次写都同步),即每次发生写操作会立即同步到磁盘。

Redis 中默认采用 AOF_FSYNC_EVERYSEC(每秒同步)的策略,因为这种策略的性能很不错,而且一旦出现故障,最多只会丢失一秒的数据。

Redis 支持主备同步

在 Redis 中,采用的是异步复制技术,但 Redis 可以通过配置 min-replicas-to-write 和 min-replicas-max-lag 这两个参数来有效地保证数据一致性。

比如,设置 min-replicas-to-write=3、min-replicas-max-lag=10,表示当至少有 3 个备数据库连接主数据库的延迟时间小于 10s 时,主数据库才可以执行写操作。延迟时间是从最后一次收到备数据库的心跳开始计算,通常每秒发送一次心跳。

除了上面对写操作的同步,在 Redis 中,还有两种情况是需要进行数据同步的:

  • 初次同步,即备数据库刚启动时的数据同步;
  • 因网络故障导致主备数据库断开连接,待网络恢复后的备数据库的数据同步。

针对这两种情况,Redis 提供了两种同步模式,即完整重同步和部分重同步:

完整重同步的流程:

  1. 当备服务器启动时,会向主服务器发送 SYNC 命令;
  2. 主服务器收到命令后会生成 RDB(快照)文件,并记录从现在起新执行的写操作;
  3. RDB 生成后会发送给备服务器,备服务器通过 RDB 文件进行数据更新;
  4. 更新完成后,主服务器再将新记录的写操作发送给备服务器,备服务器执行完这些新记录的写操作,便与主服务器的数据保持一致了。

部分重同步:当网络恢复后,主数据库将主备数据库断开连接之后的一系列写操作发送给备服务器,备数据库执行这些写操作,从而保证数据保持一致。

在这种方式的实现中,主备数据库会共同维护一个复制偏移量,这样主数据库就知道应该将哪些写操作发给备数据库,备数据库同步时也知道应该从哪里继续执行操作。

如图所示,主数据库的复制偏移量为 5000 时,向备数据库发送了 100 个字节的数据,发送结束后复制偏移量为 5100。 此时主备数据库连接断开,备数据库没有接收到这 100 个字节的数据,等到备数据库重新与主数据库连接上之后,会给主数据库发送 PSYNC 命令,并带上自己的复制偏移量 5000,主数据库接收到信息后,根据接收到的复制偏移量,将 5000 之后的数据发给备数据库,从而完成数据的部分重同步。

Memcached 分布式缓存原理

Memcached 也是一个基于内存的高性能 key-value 缓存数据库。 Memcached 比 Redis 问世更早,也有很多公司在使用,比如 Facebook、Vox、 LiveJournal 等。

Redis 的集群结构是每个节点负责一部分哈希槽,且每个节点可以设计主备。与 Redis 不同,Memcached 集群采用一致性哈希的思路,使用的是 Ketama 算法。该算法的主要思想就是,带虚拟节点的一致性哈希算法

在实际应用中,每个物理节点对应 100~200 个虚拟节点,才能到达一个较好的存储均衡。如下图所示,物理节点 1 对 应两个虚拟节点 1-1、1-2,物理节点 2 对应三个虚拟节点 2-1、2-2 和 2-3。

采用带虚拟节点的一致性哈希方法的优点:当添加或移除节点时,不会出现大规模的数据迁移。

对于数据结构的支持,Memcached 仅支持简单的 k/v 数据类型,如果想要存储复杂的数据类型,比如 List、Set 和 Hash 等,需要客户端自己处理,将其转化为字符串然后进行存储。缺点是操作不灵活。比如,Memcached 存储的数组中有一个元素需要修改,则需要将整个数组的数据取出来,修改后再整体写入到数据库中 。

对于持久化,Memcached 是不支持的。断电时 Memcached 中存储的数据将会全部丢失。因为内存是一种易失性存储设备,断电后将不会存储数据。

在 Memcached 中,服务器和服务器之间没有任何通信,即自身不支持主备。如果想要实现高可用,需要通过第三方实现。比如,Repcached 实现了 Memcached 的复制功能,支持一主一备,从而使 Memcached 满足高可用。

对比分析

知识扩展:除了分布式存储中的缓存,还有计算机体系结构和网络中的缓存, 它们又分别是什么呢?

计算机体系结构中的缓存,通常是指专用的缓存设备。由于内存和 CPU 访问速度相差很大,为了提高 CPU 的性能,计算机内部在 CPU 与内存之间设置了相应的缓存。

现在大多数机器分为三级缓存:L1 高级缓存、L2 高级缓存和 L3 高级缓存。访问速度:L1 高级缓存 > L2 高级缓存 > L3 高级缓存 > 内存。其中,L1 高级缓存的访问速度, 几乎和 CPU 中寄存器的访问速度一样快。 有了这三级缓存,很多数据不需要到内存中读取,而直接读取这三级缓存中的数据即可,缩短了数据访问的时间,使得计算机运行速度变得更快。

网络访问中的缓存,通常是指本地的“磁盘”。通过网络访问数据时,需要与远程服务器交互来进行传输,而网络间数据传输以及远程服务器对请求的响应,会耗费很多时间。如果本机器的磁盘可以对经常访问的远程内容进行存储,就不用每次都与远程服务器交互, 而减少网络数据传输与服务器响应的延迟,极大地提高性能。

总结

分布式数据:缓存技术相关推荐

  1. 浅谈缓存技术在ASP.NET中的运用

    本篇文章虽不谈架构,但是Cache又是架构中不可或缺的部分,因此,在讲解Cache的同时,将会提及到部分架构知识,关于架构部分,读者可以不用理解,或者直接跳过, 你只需关心Cache即可,具体的架构, ...

  2. 移动计算云分布式数据缓存服务,实现快速可靠的跨区域多活复制

    摘要:本文介绍了一种在移动计算云中扩展分布式数据缓存服务以实现跨区域多活复制的方案. 本文分享自华为云社区<移动计算云分布式数据缓存服务,实现快速可靠的跨区域多活复制>,作者: 敏捷的小智 ...

  3. CPU三级缓存技术解析

    CPU三级缓存技术解析 cpu存取数据 cpu存取数据大致可以认为是下图的流程(此处图比较简单) cpu拿到需要的内存地址,之后这个地址会被mmu转换成真正的物理地址,接下来会去查接下来查L1 cac ...

  4. Smarty的配置与高级缓存技术

    前言 Smarty 是一个出色的PHP模板引擎,它分离了逻辑代码和user interface. 学习和使用Smarty,没有应用到它的缓存技术是一个很大的损失,它可以将用户最终看到的HMTL文件缓存 ...

  5. Android 图片缓存之内存缓存技术LruCache,软引用

    Android 图片缓存之内存缓存技术LruCache,软引用

  6. DotNET企业架构应用实践-系统架构与性能-缓存技术与ORM中的缓存查询技术

    系列回顾 在前面的文章DotNET企业架构应用实践-系统架构与性能-理论依据及相关做法一文中我介绍了系统性能优化的理论做了一个概括的介绍,也简单的介绍了性能优化的过程及相关的技术关注点或者说是做法. ...

  7. 图片缓存之内存缓存技术LruCache,软引用

    图片缓存之内存缓存技术LruCache,软引用 每当碰到一些大图片的时候,我们如果不对图片进行处理就会报OOM异常, 这个 问题曾经让我觉得很烦恼 ,后来终于得到了解决, 那么现在就让我和大家一起分享 ...

  8. 分布式锁的应用场景_分布式缓存技术Redis:高级应用(主从、事务与锁、持久化)...

    安全性设置 设置客户端操作秘密 redis安装好后,默认情况下登陆客户端和使用命令操作时不需要密码的.某些情况下,为了安全起见,我们可以设置在客户端连接后进行任何操作之前都要进行密码验证.修改redi ...

  9. 亿级流量峰值没在怕,“缓存”技术来减压!

    许多大型互联网系统,如电商.社交.新闻等App或网站,动辄日活千万甚至上亿,每分钟的峰值流量在数十万以上,架构上如何应对如此高的流量峰值呢? 本文选自 <技术人修炼之道:从程序员到百万高管的72 ...

  10. 赠书:亿级流量峰值没在怕,“缓存”技术来减压!

    许多大型互联网系统,如电商.社交.新闻等App或网站,动辄日活千万甚至上亿,每分钟的峰值流量在数十万以上,架构上如何应对如此高的流量峰值呢? 本文选自 <技术人修炼之道:从程序员到百万高管的72 ...

最新文章

  1. 静态资源(StaticResource)和动态资源(DynamicResource)
  2. 写给师弟师妹的一封信-论在校程序员的学习方向
  3. CDI中的事务异常处理
  4. 如何在Unity3d平台下低延迟播放RTMP或RTSP流
  5. Intellij IDEA的java环境与安卓sdk配置实例教程
  6. IBM Power System P550双机系统方案
  7. 编程过度防御?只有缺乏自信的程序员才会这样做
  8. 无聊玩玩俄罗斯方块,用python自己做不带广告
  9. 五个案例“熄灭”Nginx漏洞隐患
  10. 后台传html样式展示无效_Dcat Admin v1.5.0 发布,对后端开发者高颜值后台系统构建工具...
  11. sola病毒doc变exe批量恢复方法
  12. mach_absolute_time 高效计算时间差
  13. Metric Learning详解(附带NCA算法)
  14. [声纹识别]基于MFCC的声纹识别算法
  15. 安全事件响应观察报告家族
  16. win10开启/取消自动关机
  17. java最常见的三种问题,404,500以及无法访问
  18. Go:测试库testify简介
  19. 关于过快S验证码的一些问题
  20. netstat linux查看监听端口号,linux用netstat查看服务及监听端口

热门文章

  1. 操作系统学习思维导图——2处理器管理
  2. 英雄联盟LOL静态HTML网页制作模板DⅣ+CSS学生网页作品代码游戏题材大学生网页设计作业下载
  3. 普林斯顿微积分读本:第 3 章 极限导论
  4. 普林斯顿微积分读本-[美]阿德里安·班纳著-修订版;杨爽, 赵晓婷, 高璞译
  5. gps 数据解析-NMEA 0183协议
  6. 算法之线性时间选择(最坏情况下)
  7. l298n电机哪一端为正_L298N使用说明介绍
  8. Excel的数据导入到PB的DW中
  9. 操作系统课程设计——文件系统
  10. 基于FFmpeg的Qt视频播放器