cpu缓存

第一篇:缓存有那么多,分别是干什么的?

匿名 (未验证) 提交于 2019-12-02 23:59:01
高性能章节:转自公众号:数据库开发: https://mp.weixin.qq.com/s?__biz=MzI3NDA4OTk1OQ==&mid=2649902899&idx=2&sn=fb77a500d013cbdd91e7f8391365a100&chksm=f31fbdbbc46834adeb2f57ff4c468bf95a38e2327babd9d188cb54ec98c68a9e1d3a898dee51&mpshare=1&scene=23&srcid=&sharer_sharetime=1567180359832&sharer_shareid=49e276b2e624f54fc5b024238a201770#rd 大家普遍的理解就是当我们遇到某个页面打开很慢的时候,会想到引入缓存, 这样页面打开就快了。 其实快和慢是相对的,从是技术角度来说,缓存之所以快是因为缓存是基于内存建立的,而内存的读写速度比硬盘快X倍,所以用内存来代替硬盘作为读写的介质自然能大大提高访问数据的速度. 这个过程大致是这样的,通过在内存中存储被访问过的数据供后续访问时使用,以此来达到提速的效果. 除此之外,缓存还有另外2个重要的运用方式:【预读取】和【延迟写】 【预读取】: 预读取就是预先读取将要载入的数据,也可以称作【缓存预热】。就是在系统对外提供服务之前, 先将硬盘中的一部分数据加载到内存中

[转]缓存的介绍

匿名 (未验证) 提交于 2019-12-02 23:38:02
1. 什么是缓存 缓存有很多种,从 CPU 缓存、磁盘缓存到浏览器缓存等,本文所说的缓存,主要针对后端系统的缓存。也就是将程序或系统经常要使用的对象存在内存中,以便在使用时可以快速调用,也可以避免加载数据或者创建重复的实例,以达到减少系统开销,提高系统效率的目的。 2. 为什么要用缓存 我们一般都会把数据存放在关系型数据库中,不管数据库的性能有多么好,一个简单的查询也要消耗毫秒级的时间,这样我们常说的 QPS 就会被数据库的性能所限制,我们想要提高QPS,只能选择更快的存储设备。 在日常开发有这样的一种场景:某些数据的数据量不大、不经常变动,但访问却很频繁。受限于硬盘 IO 性能或者远程网络等原因,每次都直接获取会消耗大量的资源。可能会导致我们的响应变慢甚至造成系统压力过大,这在一些业务上是不能忍的,而缓存正是解决这类问题的神器。 但是有一点需要注意,就是缓存的占用空间以及缓存的失效策略,下文也会提到。 3. 使用缓存的场景 对于缓存来说,数据不常变更且查询比较频繁是最好的场景,如果查询量不够大或者数据变动太频繁,缓存也就是失去了意义。 日常工作使用的缓存可以分为内部缓存和外部缓存。 内部缓存一般是指存放在运行实例内部并使用实例内存的缓存,这种缓存可以使用代码直接访问。 外部缓存一般是指存放在运行实例外部的缓存,通常是通过网络获取,反序列化后进行访问。

【缓存篇】本地缓存之Guava

匿名 (未验证) 提交于 2019-12-02 23:32:01
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013034640/article/details/90268955 第一,总体导图预览 提醒: 点击链接可在线查看 二,Guava是什么 1,是一种本地缓存。对于不变的内容,可以缓存在内存中,下次使用的时候,直接取出,这样可以节省大量的cpu和内存资源,提高系统的吞吐量。 本地缓存作用就是提高系统的运行速度,是一种空间换空间的取舍。实质上是一个key-value的字典。 2.是google开源的公共Java库,类似于Apache Commons,cache只是其中一个模块 3.特点 (1)并发行,支持多线程的并发写入。 (2)过期策略:具有缓存过期的时效,设置缓存时间。 (3)淘汰策略:本地缓存放在内存中,所以需要设置容量上限和淘汰策略来防止出现内存溢出的情况,设置上限一般可以支持缓存对象的数量,或者设置一个具体的内存的大小。但是在Guava中仅仅支持缓存对象的数量。 当缓存的数量超过缓存值的时候,需要按照一定的淘汰策略,淘汰数据。常用的淘汰策略包括:FIFO(先进先出),LRU(最近最少使用),LFU(最不经常使用),这个算法策略跟操作系统的内存策略是一个道理。在guava中默认采用的LRU淘汰算法。 第三,入门demo 1.引入pom引用 <!--引入guava缓存-->

Linux释放内存空间

匿名 (未验证) 提交于 2019-12-02 21:56:30
Linux服务器运行一段时间后,由于其内存管理机制,会将暂时不用的内存转为buff/cache,这样在程序使用到这一部分数据时,能够很快的取出,从而提高系统的运行效率,所以这也正是linux内存管理中非常出色的一点,所以乍一看内存剩余的非常少,但是在程序真正需要内存空间时,linux会将缓存让出给程序使用,这样达到对内存的最充分利用,所以真正剩余的内存是free+buff/cache   说到清理内存,那么不得不提到/proc这一个虚拟文件系统,这里面的数据和文件都是内存中的实时数据,很多参数的获取都可以从下面相应的文件中得到,比如查看某一进程占用的内存大小和各项参数,cpu和主板的详细信息,显卡的参数等等;相应的关于内存的管理方式是在/proc/sys/vm/drop_chches文件中,一定要注意这个文件中存放的并不是具体的内存内容,而是0-3这几个数字,通过文件大小只有1B也可以知道,而这些代号分别告诉系统代表不同的含义如下:   0:0是系统默认值,默认情况下表示不释放内存,由操作系统自动管理   1:释放页缓存   2:释放dentries和inodes   3:释放所有缓存   所以根据上面的说明,分别将1,2,3这3个数字重定向到drop_caches中可以实现内存的释放,一般释放内存都是重定向3到文件中,释放所有的缓存    当前内存剩余570M左右,另外buff

缓存的优缺点

自古美人都是妖i 提交于 2019-12-02 21:16:52
转:https://www.cnblogs.com/bethunebtj/p/9159914.html 1.为何需要缓存? 在高并发请求时,为何我们频繁提到缓存技术?最直接的原因是,目前磁盘IO和网络IO相对于内存IO的成百上千倍的性能劣势。 做个简单计算,如果我们需要某个数据,该数据从数据库磁盘读出来需要0.1s,从交换机传过来需要0.05s,那么每个请求完成最少0.15s(当然,事实上磁盘和网络IO也没有这么慢,这里只是举例),该数据库服务器每秒只能响应67个请求;而如果该数据存在于本机内存里,读出来只需要10us,那么每秒钟能够响应100,000个请求。 通过将高频使用的数据存在离cpu更近的位置,以减少数据传输时间,从而提高处理效率,这就是缓存的意义。 2.在哪里用缓存? 一切地方。例如: 我们从硬盘读数据的时候,其实操作系统还额外把附近的数据都读到了内存里 例如,CPU在从内存里读数据的时候,也额外读了许多数据到各级cache里 各个输入输出之间用buffer保存一批数据统一发送和接受,而不是一个byte一个byte的处理 上面这是系统层面,在软件系统设计层面,很多地方也用了缓存: 浏览器会缓存页面的元素,这样在重复访问网页时,就避开了要从互联网上下载数据(例如大图片) web服务会把静态的东西提前部署在CDN上,这也是一种缓存 数据库会缓存查询

Volatile关键字详解

一个人想着一个人 提交于 2019-12-02 20:12:37
简介    在java中,每个线程有一块工作内存区,其中存放这被所有线程共享的主内存中变量值的拷贝。当线程执行时,它在自己的工作内存中操作这些变量。为了获取一个共享变量,一个线程先获取锁定并清除它的工作内存区,这就保证了该共享变量从所有的线程的共享主内存区正确的装入到线程的工作内存区,当线程解锁时保证该工作内存区的变量的值写回到共享主内存区。   线程工作内存和主内存的交互图如下:   从上图中可以看出,主内存和线程工作内存间的数据传输与线程工作内存和线程执行有一定的时间间隔,而且每次所消耗的时间可能还不相同,这样就存在线程操作的数据的不一致性。由于每个线程都有自己的线程工作内存,因此当一个线程改变自己工作内存中的数据的时候,对于其他系统来说可能是不可见的。因此,使用volatile关键字迫使所有的线程均读写主内存中对应的变量,从而使得volatile关键字修饰的变量在多线程间可见。   volatile修饰的变量,jvm虚拟机只是保证从主内存加载到线程工作内存的值是最新的。   声明为volatile的变量具有如下特性:   1、其他线程对变量的修改可以即时反映在当前线程中。   2、确保当前线程对volatile变量的修改,能即时的写回到共享主内存中,并被其他线程所见。   3、使用volatile修饰的变量,编译器会保证其有序性。 volatile分析    用在多线程

【转载】缓存与数据库双写一致性问题

这一生的挚爱 提交于 2019-12-02 17:50:51
原文: https://learnku.com/articles/25012 前言 周所周知,在项目性能优化、提升的时候,我们引进了一个缓存的概念,即一款缓存数据的技术,项目在最初期架构规划时都会引进的一个组件。使用缓存有很多好处:加快请求的响应速度、减少数据库的交互与浪费大量的 IO 操作等,但是在某些场景下使用缓存也有可能会造成雪崩、穿透、数据不一致等问题,我们研究下使用缓存会导致有哪些数据不一致的情况发生以及在哪些场景会使用哪些具体的解决方案,首先我们必然还是会使用缓存的。 缓存更新策略 先更新数据库再更新缓存 浪费资源 每次去更新数据库再更新缓存都是需要申请 CPU 进行数据库的修改的,同时倘若数据的修改比较频繁以及数据的读操作却又比较少的时候,这种策略会导致出现冷数据的情况。 数据脏读 如果两个操作同时对数据进行操作时,举个栗子:线程 A 在线程 B 更新数据库成功后、更新缓存成功之前读取到数据,也就是读取到了缓存的旧数据。 该策略比较适合更新的频次比较少的场景下,比如博客的文章、基础数据、个人信息等场景。 先更新数据库再删除缓存 数据脏读 一个请求处理中过程中,倘若数据库更新成功了但是缓存更新失败了,那么后面的请求读取的数据都是旧数据、则脏数据。可以通过缓存过期时间定义缓存的有效期 (推荐),或者使用消息队列在删除缓存失败的时候再次异步更新缓存,直到成功为止

缓存

回眸只為那壹抹淺笑 提交于 2019-12-02 16:42:32
   CPU缓存(Cache Memory)是位于CPU与内存之间的临时存储器,它的容量比内存小的多但是交换速度却比内存要快得多。高速缓存的出现主要是为了解决CPU运算速度与内存读写速度不匹配的矛盾,因为CPU运算速度要比内存读写速度快很多,这样会使CPU花费很长时间等待数据到来或把数据写入内存。在缓存中的数据是内存中的一小部分,但这一小部分是短时间内CPU即将访问的,当CPU调用大量数据时,就可先缓存中调用,从而加快读取速度。 来源: https://www.cnblogs.com/liujianing/p/11755390.html

后端服务性能优化实战篇

故事扮演 提交于 2019-12-02 16:36:08
本文简单介绍下后端服务开发中常用的一些性能优化策略。 1、代码 优化代码实现是第一位的,特别是一些不合理的复杂实现。如果结合需求能从代码实现的角度,使用更高效的算法或方案实现,进而解决问题,那是最简单有效的。 2、数据库 数据库的优化,总体上有3个方面: 1) SQL调优:除了掌握SQL基本的优化手段,使用慢日志定位到具体问题SQL,使用explain、profile等工具来逐步调优。 2) 连接池调优:选择高效适用的连接池,结合当前使用连接池的原理、具体的连接池监控数据和当前的业务量作一个综合的判断,通过反复的几次调试得到最终的调优参数。 3) 架构层面:包括读写分离、主从库负载均衡、水平和垂直分库分表等方面,一般需要的改动较大,需要从整体架构方面综合考虑。 3、缓存 分类 本地缓存(HashMap/ConcurrentHashMap、Ehcache、RocksDB、Guava Cache等)。 缓存服务(Redis/Tair/Memcache等)。 设计关键点 1、什么时候更新缓存?如何保障更新的可靠性和实时性? 更新缓存的策略,需要具体问题具体分析。基本的更新策略有两个: 1) 接收变更的消息,准实时更新。 2) 给每一个缓存数据设置5分钟的过期时间,过期后从DB加载再回设到DB。这个策略是对第一个策略的有力补充,解决了手动变更DB不发消息

内存缓存与磁盘缓存详解

浪尽此生 提交于 2019-12-02 16:09:56
转载:https://blog.csdn.net/as02446418/article/details/47913387 内存缓存 高速缓存(英语:cache,英语发音:/kæʃ/ kash [1][2][3],简称缓存),其原始意义是指访问速度比一般随机存取存储器(RAM)快的一种RAM,通常它不像系统主存那样使用DRAM技术,而使用昂贵但较快速的SRAM技术。 原理 Cache一词来源于1967年的一篇电子工程期刊论文。其作者将法语词“cache”赋予“safekeeping storage”的涵义,用于电脑工程领域。 当CPU处理数据时,它会先到Cache中去寻找,如果数据因之前的操作已经读取而被暂存其中,就不需要再从随机存取存储器(Main memory)中读取数据——由于CPU的运行速度一般比主内存的读取速度快,主存储器周期(访问主存储器所需要的时间)为数个时钟周期。因此若要访问主内存的话,就必须等待数个CPU周期从而造成浪费。 提供“缓存”的目的是为了让数据访问的速度适应CPU的处理速度,其基于的原理是内存中“程序执行与数据访问的局域性行为”,即一定程序执行时间和空间内,被访问的代码集中于一部分。为了充分发挥缓存的作用,不仅依靠“暂存刚刚访问过的数据”,还要使用硬件实现的指令预测与数据预取技术——尽可能把将要使用的数据预先从内存中取到缓存里。