文档章节

Java架构师第十二步——架构中的缓存架构(读书笔记)

ND小龙
 ND小龙
发布于 2017/07/06 22:22
字数 1037
阅读 28
收藏 1

缓存

  缓存在wiki上的定义:用于存储数据的硬件或软件的组成部分,以使得后续更快访问相应的数据。缓存中的数据可能是提前计算好的结果、数据的副本等。典型的应用场景:有cpu cache, 磁盘cache等。本文中提及到缓存主要是指互联网应用中所使用的缓存组件。

为什么引入缓存

  传统的后端业务场景中,访问量以及对响应时间的要求均不高,通常只使用DB即可满足要求。这种架构简单,便于快速部署,很多网站发展初期均考虑使用这种架构。但是随着访问量的上升,以及对响应时间的要求提升,单DB无法再满足要求。这时候通常会考虑DB拆分(sharding)、读写分离、甚至硬件升级(SSD)等以满足新的业务需求。但是这种方式仍然会面临很多问题,主要体现在:

  • 性能提升有限,很难达到数量级上的提升,尤其在互联网业务场景下,随着网站的发展,访问量经常会面临十倍、百倍的上涨。
  • 成本高昂,为了承载N倍的访问量,通常需要N倍的机器,这个代价难以接受。

 

大部分的业务场景下,80%的访问量都集中在20%的热数据上(适用二八原则)。因此,通过引入缓存组件,将高频访问的数据,放入缓存中,可以大大提高系统整体的承载能力,原有单层DB的数据存储结构,也变为Cache+DB的结构。

 

根据业务场景,通常缓存有以下几种使用方式

  • 懒汉式(读时触发):写入DB后, 然后把相关的数据也写入Cache
  • 饥饿式(写时触发):先查询DB里的数据, 然后把相关的数据写入Cache
  • 定期刷新:适合周期性的跑数据的任务,或者列表型的数据,而且不要求绝对实时性

主流的缓存

Memcached

Redis

 

分布式缓存实现

构建大型互联网系统会面临很多的挑战,主要有:

  • 百万级QPS的资源调用 (高并发)
  • 99.99%的可用性 (高可用)
  • 毫秒级的核心请求响应时间 (高性能)

  设计这样的互联网系统,不可避免的要考虑使用分布式缓存,并从可用性、并发性、性能多个方面进行综合考量。

 

数据分片

  数据分片就是把数据均匀分散到多个实例中。数据分片可以采用以下几种规则:区间分片、hash分片、 slot分片。对于hash分片,主要的哈希算法有静态哈希和一致性哈希,静态哈希和一致性哈希对比如下:

  • 静态哈希(取模求余)

  优点:算法简单

  缺点:加减节点时震荡厉害, 命中率下降厉害

  • 一致性哈希

  优点:加减节点时震荡较小, 保持较高命中率

  缺点:自动rehash场景下会数据不一致的问题(同一份数据的请求在不同节点漂移)

  数据分片的实现方式分为三种:

  • 客户端实现:memcached,redis 2.x

  客户端实现数据分片

  优点:简单,容易实现

  缺点:扩缩容需要重新上线,手动数据迁移;

  • proxy实现:twemproxy,codis,微博内部实现了CacheService

  通过引入一层代理,将数据分片策略放在代理层实现,客户端通过代理来访问数据。

  优点:逻辑在proxy实现,客户端使用简单,支持多语言

  缺点:数据访问多一跳,有一定的性能损耗

  • 服务端实现:redis 3.x,cassandra

  由缓存组件本身,实现数据分片机制。

  优点:扩缩容方便,自动数据迁移

  缺点:数据存储与分布式逻辑耦合在一起,服务端复杂

本文转载自:http://kb.cnblogs.com/page/554341/

ND小龙
粉丝 12
博文 45
码字总数 2295
作品 0
福州
私信 提问
用思维导图来学java虚拟机,轻松易懂!

说明 本篇文章是对周志明的《深入理解Java虚拟机》的读书笔记,思维导图使用Mindjet MindManager。曾经看到过这样一句话: 关于教育,有一个经典的定义是:把在学校里学到的东西全部忘掉,最...

小刀爱编程
2018/10/12
176
0
全新互联网Java后端开发技术思维导图

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/t4i2b10X4c22nF6A/article/details/82714797 图文里的技术如何学习,有没有免费资料? 对Java的技术,架构技术...

JAVA高级架构v
2018/09/15
0
0
阿里P8架构师总结的互联网Java架构系统化学习路线

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/t4i2b10X4c22nF6A/article/details/83181980 网络应用,最常见的研发语言是Java的和PHP。 后端服务,最常见的...

JAVA高级架构v
2018/10/19
0
0
从多核硬件架构,看Java内存模型

在了解Java内存模型之前,先来看一下多核硬件架构。 我们应该都知道,计算机在执行程序的时候,每条指令都是在CPU中执行的,而执行的时候,又免不了要和数据打交道。而计算机上面的数据,是存...

消失er
2018/09/02
0
0
系统原理分析架构-开篇 (对于架构师与开发语言及被青春饭的一些想法)

感谢朋友支持本博客,欢迎共同探讨交流,由于能力和时间有限,错误之处在所难免,欢迎指正! 如有转载,请保留源作者博客信息。 tantexian的博客:my.oschina.net/tantexian 如需交流,欢迎大...

tantexian
2016/02/29
1K
1

没有更多内容

加载失败,请刷新页面

加载更多

一起来学Java8(三)——方法引用

在一起来学Java8(一)——函数式编程中有一个简单的函数式编程的例子: import java.util.function.Consumer;class Person { public static void sayHello(String name) { S...

猿敲月下码
1分钟前
0
0
读书笔记:深入理解ES6(十一)

第十一章 Promise与异步编程   Promise可以实现其他语言中类似Future和Deferred一样的功能,是另一种异步编程的选择,它既可以像事件和回调函数一样指定稍后执行的代码,也可以明确指示代码...

张森ZS
24分钟前
3
0
面试官,Java8 JVM内存结构变了,永久代到元空间

在文章《JVM之内存结构详解》中我们描述了Java7以前的JVM内存结构,但在Java8和以后版本中JVM的内存结构慢慢发生了变化。作为面试官如果你还不知道,那么面试过程中是不是有些露怯?作为面试...

程序新视界
32分钟前
20
0
Elasticsearch 实战(一) - 简介

官腔 Elasticsearch,分布式,高性能,高可用,可伸缩的搜索和分析系统 基本等于没说,咱们慢慢看 1 概述 百度:我们比如说想找寻任何的信息的时候,就会上百度去搜索一下,比如说找一部自己喜...

JavaEdge
37分钟前
14
0
【jQuery基础学习】11 jQuery性能简单优化

本文转载于:专业的前端网站➦【jQuery基础学习】11 jQuery性能简单优化 关于性能优化 合适的选择器 $("#id")会直接调用底层方法,所以这是最快的。如果这样不能直接找到,也可以用find方法继...

前端老手
46分钟前
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部