cpu缓存

天猫浏览型应用的CDN静态化架构演变

倖福魔咒の 提交于 2019-12-01 06:44:42
在天猫双11活动中,商品详情、店铺等浏览型系统,通常会承受超出日常数倍甚至数十倍的流量冲击。随着历年来双11流量的大幅增加,每年这些浏览型系统都要面临容量评估、硬件扩容、性能优化等各类技术挑战。因此,架构方面的重点在于,如何能够利用合理成本应对瞬间飙高的峰值请求,并确保活动完整周期中系统容量的可伸缩性、用户响应时间的稳定性,以及外部依赖系统出现问题时的高可用性。此外,作为最主要的页面流量承载体系,架构方面还需考虑防爬攻击、流控容灾等安全、稳定的需求,并综合衡量网络带宽、硬件成本、缓存效率等各方面要素,找准平衡点,从而达到以不变应万变的理想效果。 演进 为此,自2011年起,以天猫商品详情系统为代表,天猫浏览型系统在架构上的主要工作之一就是通过静态化技术实现了动静态信息分离、利用缓存技术存放静态化内容、利用少量动态数据异步加载填充。整个过程历经单机静态化、统一缓存接入,到2013年双11前彻底CDN化三个阶段(如图1所示),有效解决了缓存命中率、流量自然分布、系统扩容简化、用户端响应速度等关键问题。 图1 CDN化的三个阶段 目前,天猫浏览型系统最新使用的这套基于CDN的静态化架构,可以满足高可用持续伸缩的原始预期,并包含如下特性。 动静分离:HTML静态化和热点分离。 分布式缓存体系:利用CDN节点分布式缓存。 多级缓存机制:CDN两级+应用一级。 统一服务静态化集群。 一致性维持

redis缓存命中率

眉间皱痕 提交于 2019-12-01 03:30:23
redis缓存命中率如何计算 /home/pubsrv/redis-2.8.12/src/redis-cli -p 6379 -h 192.168.11.13 -a ZTZmZDc4ODAwMjMx 192.168.11.14:6379> info 缓存命中率 = keyspace_hits / (keyspace_hits + keyspace_misses) 影响缓存命中率的因素 1. 业务场景 缓存适合“读多写少”的业务场景,反之,使用缓存的意义不大,命中率会很低。缓存时间越长,命中率会越高。时效性要求越低,就越适合缓存。 2. 更新策略 缓存的粒度越小,命中率会越高。举个实际的例子说明: 当缓存单个对象的时候(例如:单个用户信息),只有当该对象对应的数据发生变化时,我们才需要更新缓存或者让移除缓存。而当缓存一个集合的时候(例如:所有用户数据),其中任何一个对象对应的数据发生变化时,都需要更新或移除缓存。2. 3. 清理策略 对于持续运行的服务器来说, 服务器需要定期对自身的资源和状态进行必要的检查和整理,有三种不同的删除策略,立即删除会短时间内占用大量cpu,惰性删除会在一段时间内浪费内存,所以定时删除是一个折中的办法。 (1)立即清理。在设置键的过期时间时,创建一个回调事件,当过期时间达到时,由时间处理器自动执行键的删除操作。 (2)惰性清理。键过期了就过期了,不管。当读

从原理到场景 系统讲解 PHP 缓存技术☆

匆匆过客 提交于 2019-11-30 22:11:41
缓存已经成了项目中是必不可少的一部分,它是提高性能最好的方式,例如减少网络I/O、减少磁盘I/O 等,使项目加载速度变的更快。 缓存可以是CPU缓存、内存缓存、硬盘缓存,不同的缓存查询速度也不一样(CPU缓存 优于 内存缓存 优于 硬盘缓存)。 接下来,给大家逐一进行介绍。 浏览器缓存 浏览器将请求过的页面存储在客户端缓存中,当访问者再次访问这个页面时,浏览器就可以直接从客户端缓存中读取数据,减少了对服务器的访问,加快了网页的加载速度。 强缓存 用户发送的请求,直接从客户端缓存中获取,不请求服务器。 根据 Expires 和 Cache-Control 判断是否命中强缓存。 代码如下: header('Expires: '. gmdate('D, d M Y H:i:s', time() + 3600). ' GMT'); header("Cache-Control: max-age=3600"); //有效期3600秒 Cache-Control 还可以设置以下参数: public:可以被所有的用户缓存(终端用户的浏览器/CDN服务器) private:只能被终端用户的浏览器缓存 no-cache:不使用本地缓存 no-store:禁止缓存数据 协商缓存 用户发送的请求,发送给服务器,由服务器判定是否使用客户端缓存。 代码如下: $last_modify = strtotime(

Java内存模型详解

喜欢而已 提交于 2019-11-30 18:21:53
Java内存模型详解 前几天,发了一篇文章,介绍了一下 JVM内存结构、Java内存模型以及Java对象模型之间的区别 。有很多小伙伴反馈希望可以深入的讲解下每个知识点。Java内存模型,是这三个知识点当中最晦涩难懂的一个,而且涉及到很多背景知识和相关知识。 网上有很多关于Java内存模型的文章,在《深入理解Java虚拟机》和《Java并发编程的艺术》等书中也都有关于这个知识点的介绍。但是,很多人读完之后还是搞不清楚,甚至有的人说自己更懵了。本文,就来整体的介绍一下Java内存模型,目的很简单,让你读完本文以后,就知道到底Java内存模型是什么,为什么要有Java内存模型,Java内存模型解决了什么问题等。 本文中,有很多定义和说法,都是笔者自己理解后定义出来的。希望能够让读者可以对Java内存模型有更加清晰的认识。当然,如有偏颇,欢迎指正。 为什么要有内存模型 在介绍Java内存模型之前,先来看一下到底什么是计算机内存模型,然后再来看Java内存模型在计算机内存模型的基础上做了哪些事情。要说计算机的内存模型,就要说一下一段古老的历史,看一下为什么要有内存模型。 内存模型,英文名Memory Model,他是一个很老的老古董了。他是与计算机硬件有关的一个概念。那么我先给你介绍下他和硬件到底有啥关系。 CPU和缓存一致性 我们应该都知道,计算机在执行程序的时候

从原理到场景 系统讲解 PHP 缓存技术(全)

夙愿已清 提交于 2019-11-30 15:07:06
概述 缓存已经成了项目中是必不可少的一部分,它是提高性能最好的方式,例如减少网络I/O、减少磁盘I/O 等,使项目加载速度变的更快。 缓存可以是CPU缓存、内存缓存、硬盘缓存,不同的缓存查询速度也不一样(CPU缓存 优于 内存缓存 优于 硬盘缓存)。 接下来,给大家逐一进行介绍。 浏览器缓存 浏览器将请求过的页面存储在客户端缓存中,当访问者再次访问这个页面时,浏览器就可以直接从客户端缓存中读取数据,减少了对服务器的访问,加快了网页的加载速度。 强缓存 用户发送的请求,直接从客户端缓存中获取,不请求服务器。 根据 Expires 和 Cache-Control 判断是否命中强缓存。 代码如下: header('Expires: '. gmdate('D, d M Y H:i:s', time() + 3600). ' GMT'); header("Cache-Control: max-age=3600"); //有效期3600秒 Cache-Control 还可以设置以下参数: public:可以被所有的用户缓存(终端用户的浏览器/CDN服务器) private:只能被终端用户的浏览器缓存 no-cache:不使用本地缓存 no-store:禁止缓存数据 协商缓存 用户发送的请求,发送给服务器,由服务器判定是否使用客户端缓存。 代码如下: $last_modify =

Java内存模型

我怕爱的太早我们不能终老 提交于 2019-11-30 14:25:20
为什么要有内存模型 在介绍Java内存模型之前,先来看一下到底什么是计算机内存模型,然后再来看Java内存模型在计算机内存模型的基础上做了哪些事情。要说计算机的内存模型,就要说一下一段古老的历史,看一下为什么要有内存模型。 内存模型,英文名Memory Model,他是一个很老的老古董了。他是与计算机硬件有关的一个概念。那么我先给你介绍下他和硬件到底有啥关系。 CPU和缓存一致性 我们应该都知道,计算机在执行程序的时候,每条指令都是在CPU中执行的,而执行的时候,又免不了要和数据打交道。而计算机上面的数据,是存放在主存当中的,也就是计算机的物理内存啦。 刚开始,还相安无事的,但是随着CPU技术的发展,CPU的执行速度越来越快。而由于内存的技术并没有太大的变化,所以从内存中读取和写入数据的过程和CPU的执行速度比起来差距就会越来越大,这就导致CPU每次操作内存都要耗费很多等待时间。 这就像一家创业公司,刚开始,创始人和员工之间工作关系其乐融融,但是随着创始人的能力和野心越来越大,逐渐和员工之间出现了差距,普通员工原来越跟不上CEO的脚步。老板的每一个命令,传到到基层员工之后,由于基层员工的理解能力、执行能力的欠缺,就会耗费很多时间。这也就无形中拖慢了整家公司的工作效率。 可是,不能因为内存的读写速度慢,就不发展CPU技术了吧,总不能让内存成为计算机处理的瓶颈吧。 所以

2019-05-16-日常零碎知识点

喜夏-厌秋 提交于 2019-11-30 12:19:57
版权声明:本文为 Jiawei Xu 于2019年5月16日所写,未经允许不得转载。 Linux网络编程 socketaddr socktaddr_in socketaddr_un UNIX Domain Socket,虽然网络socket也可以用于同一台主机的进程间通讯(通过loopback地址127.0.0.1),但是UNIX Domain Socket用于IPC更有效率:不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序号和应答,只是将应用层数据从一个进程拷贝到另一个进程。这是因为,IPC机制本质上是可靠的通讯,而网络协议是为不可靠的通讯设计的。Unix Domain Socket也提供面向流和面向数据包两种API接口,类似于TCP和UDP,但是面向消息的UNIX Domain Socket也是可靠的,消息既不会丢失也不会顺序错乱。X Window服务器和GUI程序之间就是通过UNIX Domain Socket通讯的。 使用UNIX Domain Socket的过程和网络socket十分相似,也要先调用socket()创建一个socket文件描述符,address family指定为AF_UNIX,type可以选择SOCK_DGRAM或SOCK_STREAM,protocol参数仍然指定为0即可。 UNIX Domain

Java volatile关键字-禁用CPU缓存

Deadly 提交于 2019-11-30 12:06:14
可见性: 一个县城对共享变量的修改,另一个线程能够立刻看到。 volatile的意义时禁用CPU缓存 public class VolatileExample { int x = 0; volatile boolean v = false; public void writer(){ x = 42; v = true; } public void reader(){ if (v){ System.out.println(x); } } 假设线程A执行writer()方法,按照 volatile语义,会把变量 “v=true” 写入内存;假 设线程B执行reader()方法,同样按照 volatile 语义,线程B会从内存中读取变量v,如果线程B看到 “v == true” 时,那么线程B看到的变量x是多少呢? 1.5以前的版本会出现x=0的情况因为变量x可能被CPU缓存而导致 可见性问题。这个问题在1.5版本已经被圆满解决了。x=42,为什么呢? 如果线程B读到了“v=true”,那么线程A设置的“x=42”对线程B是可见的。也就是说,线程B能看到 “x == 42” ,有没有一种恍然大悟的感觉?这就是1.5版本对volatile语义的增强,这个增强意义重大,1.5版本 的并发工具包(java.util.concurrent)就是靠volatile语义来搞定可见性的。 ****

【转】Guava cache使用总结

狂风中的少年 提交于 2019-11-30 02:19:32
缓存分为本地缓存和远端缓存。常见的远端缓存有Redis,MongoDB;本地缓存一般使用map的方式保存在本地内存中。一般我们在业务中操作缓存,都会操作缓存和数据源两部分。如:put数据时,先插入DB,再删除原来的缓存;ge数据时,先查缓存,命中则返回,没有命中时,需要查询DB,再把查询结果放入缓存中 。如果访问量大,我们还得兼顾本地缓存的线程安全问题。必要的时候也要考虑缓存的回收策略。 今天说的 Guava Cache 是google guava中的一个内存缓存模块,用于将数据缓存到JVM内存中。他很好的解决了上面提到的几个问题: 很好的封装了get、put操作,能够集成数据源 ; 线程安全的缓存,与ConcurrentMap相似,但前者增加了更多的元素失效策略,后者只能显示的移除元素; Guava Cache提供了三种基本的缓存回收方式:基于容量回收、定时回收和基于引用回收。定时回收有两种:按照写入时间,最早写入的最先回收;按照访问时间,最早访问的最早回收; 监控缓存加载/命中情况 Guava Cache的架构设计灵感ConcurrentHashMap,在简单场景中可以通过HashMap实现简单数据缓存,但如果要实现缓存随时间改变、存储的数据空间可控则缓存工具还是很有必要的。Cache存储的是键值对的集合,不同时是还需要处理缓存过期、动态加载等算法逻辑,需要额外信息实现这些操作

Redis学习笔记八(缓存设计)

試著忘記壹切 提交于 2019-11-30 02:03:30
目录: 缓存更新策略 缓存粒度 缓存穿透 缓存雪崩 缓存击穿 缓存更新策略: 1、内存溢出淘汰策略 当redis的使用内存超过 maxmemory 时会触发相应的策略,具体策略由 maxmemory-policy 参数控制 淘汰策略分为六种: )noeviction: 默认策略 ,此策略不会删除任何数据;当客户端还进行写操作时将返回OOM(内存溢出) )volatile-lru:根据LRU算法删除设置了过期时间的key,如果没有可删除的key,回退到noevication策略 )volatile-random:随机删除过期的key )allkeys-lru:根据LRU算法从所有的key里删除 )allkeys-random:随机算出所有的key )volatile-ttl:根据对象ttl属性删除最近将要过期的key,若没有回退到noevication策略 不推荐使用noevication、allkeys-lru 2、过期删除 )惰性删除:redis有一个专门存储设置了过期时间的过期字典,每当客户端要访问一个key时,先回去这个过期字典里查,若已过期则返回空;但仅只有这一个删除策略的话就会导致一些长期未使用的key也占用这内存,故有了一个定时删除的策略 )定时删除:redis内部维护了一个job,默认每10秒运行一次;它会根据key的过期比例,使用快慢两种模式回收key 3