cpu缓存

页面缓存优化

别等时光非礼了梦想. 提交于 2020-02-05 09:09:49
为什么要使用页面缓存技术? 系统都是逐渐演进的,一个系统在运行中必须是根据场景逐渐地提高优化性能。高并发就是对资源的节约的考验,这种考验除了更换优秀和先进的技术,优化架构,还在于从小处出发,对尽可能节约的资源进行节约。而在一个系统的数据访问中,系统的瓶颈往往是来自于数据库,因此我们要尽可能减少对数据库的访问!在不影响用户体验的情况下,对于一些静态或者变化不大的页面,我们使用缓存来减少对数据库的访问! 缓存技术的原理 在一个请求中,逻辑越复杂,调用,依赖,访问数据库的越多,耗时也就越长,响应时间也就越长,性能也就越差!因此降低逻辑复杂度,减低耦合,提高内聚,减少数据库访问,将频繁用到的变化不大的数据给缓存起来也就成为了提高性能的主要核心。 缓存雪崩-数据穿透问题 缓存穿透 缓存穿透,是指查询一个数据库一定不存在的数据。正常的使用缓存流程大致是,数据查询先进行缓存查询,如果key不存在或者key已经过期,再对数据库进行查询,并把查询到的对象,放进缓存。如果数据库查询对象为空,则不放进缓存。 想象一下这个情况,如果传入的参数为-1,会是怎么样?这个-1,就是一定不存在的对象。就会每次都去查询数据库,而每次查询都是空,每次又都不会进行缓存。假如有恶意攻击,就可以利用这个漏洞,对数据库造成压力,甚至压垮数据库。即便是采用UUID,也是很容易找到一个不存在的KEY,进行攻击。 缓存雪崩

作为一个程序员,内存和磁盘的这些事情,你不得不知道啊!!!

大城市里の小女人 提交于 2020-02-03 02:54:44
截止目前,我已经分享了如下几篇文章: 一个程序在计算机中是如何运行的?超级干货!!! 作为一个程序员,CPU的这些硬核知识你必须会! 作为一个程序员,内存的这些硬核知识你必须懂! 这些知识可以说是我们之前都不太重视的基础知识,可能大家在上大学的时候都学习过了,但是嘞,当时由于老师讲解的没那么有趣,又加上这些知识本身就比较枯燥,所以嘞,大家当初几乎等于没学。 再说啦,学习这些,也看不出来有什么用啊! 我现在告诉你,这些知识很有用,尤其对于作为程序员的你,这些是让你写代码的过程中让你不仅知其然,还知其所以然的知识,了解了这些,对你的编程只有大大的好处。 以上三篇文章可谓都是干货中的干货,看了一定让你功力大增😎 今天再来分享一下关于内存和磁盘的有关重要知识,如此一来, CPU,内存和磁盘 这比较重要的几个货,我们就都有所了解了。 关于磁盘,你了解多少? 可能大伙听到的比较多的是硬盘,毕竟这是我们每天使用电脑接触比较多的一个概念,再加上现在买电脑基本上从之前的机械硬盘都过渡到了现在的固态硬盘。 所以大家对硬盘这个名词不陌生,相对的,对磁盘的概念似乎就有点陌生了 啥是磁盘 首先记住,磁盘是个总的,也就是说 磁盘包括硬盘 ,那么还要知道磁盘是干嘛的, 磁盘最主要的功能就是保存电脑里面的信息 ,但是磁盘又有一些分类,不过我们首先要知道,在计算机中,保存信息的有这么两类: 第一:内部存储器

Java并发67问

守給你的承諾、 提交于 2020-01-31 04:00:54
1. 并发和并行 2. 进程和线程 对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程,打开一个Word就启动了一个Word进程。 而在多个进程之间切换的时候,需要进行上下文切换。但是上下文切换势必会耗费一些资源。于是人们考虑,能不能在一个进程中增加一些“子任务”,这样减少上下文切换的成本。比如我们使用Word的时候,它可以同时进行打字、拼写检查、字数统计等,这些子任务之间共用同一个进程资源,但是他们之间的切换不需要进行上下文切换。 在一个进程内部,要同时干多件事,就需要同时运行多个“子任务”,我们把进程内的这些“子任务”称为线程。 随着时间的慢慢发展,人们进一步的切分了进程和线程之间的职责。 把进程当做资源分配的基本单元,把线程当做执行的基本单元,同一个进程的多个线程之间共享资源 3. 类变量,成员变量和局部变量 Java中共有三种变量,分别是类变量、成员变量和局部变量。他们分别存放在JVM的方法区、堆内存和栈内存中 public class Variables { /** * 类变量 */ private static int a ; /** * 成员变量 */ private int b ; /** * 局部变量 * @param c */ public

AMD和Intel的CPU对比

爱⌒轻易说出口 提交于 2020-01-28 18:19:00
http://www.lotpc.com/yjzs/5825.html 推荐文章: 小白看AMD与intel的cpu架构,AMD慢的原因 CPU核心的发展方向是更低的电压、更低的功耗、更先进的制造工艺、集成更多的晶体管、更小的核心面积等。 一、温度 1、老一代的CPU,因为AMD用的架构不同,集成比INTEL多的东西 如HT总线、 内存控制器 等,使CPU的 集成度 加大, 晶体管 多了,发热也随之增大。而INTEL的不同,FSB和 内存控制器 都在 主板北桥 里的,所以 集成度 不大,发热也少很多。 2、如今新的CPU,intel也集成了 内存控制器 等,但是 发热量 控制还是要比AMD的CPU好,那是因为Intel的 制程工艺 普遍是22nm和14nm,而AMD目前是28nm。第二intel都是低外频高 倍频 ,而AMD正好相反。提高外频需要加电压多,所以温度高。 3、如今AMD在走当年intel的老路了,高频低能长流水线。且AMD的cpu一般缓存都比较大,高 主频 与大缓存也让处理器功耗大涨。 4、 核心数量 的关系。核心越多,且 主频 越高, 发热量 越大。如今AMD为了体现性价比优势,打着双打单,四打二的方法,导致堆叠的核心越多, 发热量 越大 二、制造工艺 主要是因为intel的制造工艺先进,而且半导体开发比AMD强,从线程缓存就可以看得出来,用 i7 4770K

并发专题(三)Volatile

这一生的挚爱 提交于 2020-01-26 10:10:41
Java语言规范第三版中对volatile的定义如下: java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致的更新,线程应该确保通过排他锁单独获得这个变量。 Volatile的定义和原理 Volatile是轻量级的Synchronized,比之执行成本更低,因为它不会引起线程的上下文切换,它在多处理器开发中保证了共享变量的“可见性”,“可见性”的意思是当一个线程修改一个变量时,另外一个线程能读到这个修改的值。Java语言提供了volatile,在某些情况下比锁更加方便。如果一个字段被声明成volatile,java线程内存模型确保所有线程看到这个变量的值是一致的。 package com.own.learn.concurrent.Volatile; public class VolatileBarrierExample { volatile Long v1 = null; public static void main(String[] args) { VolatileBarrierExample ex = new VolatileBarrierExample(); ex.readAndWrite(); } void readAndWrite() { v1 = 1L; } } JIT转化汇编代码:(v1变量) 0x00007f55cd100684: mov 0x20

高性能编程-- 1.1.4 内存屏障和CPU缓存

喜欢而已 提交于 2020-01-25 21:42:10
CPU性能优化手段 - 缓存 为了提高程序运行的性能,现代CPU在很多方面对程序进行了优化。 例如:CPU高速缓存。尽可能地避免处理器访问主内存的时间开销,处理器大多会利用缓存(cache)以提高性能。 多级缓存 : L1 Cache(一级缓存)是CPU第一层高速缓存,分为数据缓存和指令缓存。一般服务器CPU的L1缓存的容量通常在32-4096KB。 L2 由于L1级高速缓存容量的限制,为了再次提高CPU的运算速度,在CPU外部放置一高速存储器,即二级缓存。 L3 现在的都是内置的。而它的实际作用即是,L3缓存的应用可以进一步降低内存延迟,同时提升大数据量计算时处理器的性能。具有较大L3缓存的处理器提供更有效的文件系统缓存行为及较短消息和处理器队列长度。 一般是多核共享一个L3缓存 。 缓存同步协议 多CPU读取同样的数据进行缓存,进行不同的运算之后,最终写入主内存以哪个CPU为准? 在这种高速缓存回写的场景下,有一个缓存一致性协议多数CPU厂商对它进行了实现。 MESI 协议,它规定每条缓存有个状态位,同时定义了下面四个状态: 修改态(Modified) - 此cache行已被修改过(脏行),内容已不同于主存,为此cache专有; 专有态(Exclusive) - 此cache行内容同于主存,但不出现于其他cache中; 共享态(Shared) - 此cache行内容同于主存

最后的性能优化策略[关闭]

大憨熊 提交于 2020-01-25 09:17:09
这个网站上已经有很多性能问题,但我发现几乎所有问题都是针对特定问题而且相当狭窄。 几乎所有人都重复这些建议,以避免过早优化。 我们假设: 代码已经正常工作 所选择的算法对于问题的情况已经是最佳的 已经测量了代码,并且已经隔离了违规的例程 所有优化尝试也将被测量,以确保它们不会使事情变得更糟 我在这里寻找的是在一个关键算法中挤出最后几个百分点的策略和技巧,除此之外别无他法。 理想情况下,尝试使答案语言不可知,并在适用的情况下指出建议策略的任何缺点。 我将使用我自己的初步建议添加回复,并期待Stack Overflow社区可以想到的任何其他内容。 #1楼 我花了一些时间来优化在低带宽和长延迟网络(例如卫星,远程,离岸)上运行的客户端/服务器业务系统,并且能够通过相当可重复的过程实现一些显着的性能改进。 措施 :首先了解网络的基础容量和拓扑。 与业务中的相关网络人员交谈,并利用ping和traceroute等基本工具在典型的运营期间(至少)建立每个客户端位置的网络延迟。 接下来,对显示有问题症状的特定最终用户功能进行准确的时间测量。 记录所有这些测量值,以及它们的位置,日期和时间。 考虑在客户端应用程序中构建最终用户“网络性能测试”功能,允许高级用户参与改进过程; 当你处理因表现不佳的系统而感到沮丧的用户时,像这样赋予他们权力可能会产生 巨大的 心理影响。 分析

redis 缓存设计和性能优化

China☆狼群 提交于 2020-01-22 17:31:30
请求缓存: https://blog.csdn.net/xiaowangku/article/details/90409224 缓存的受益与成本 通过缓存加速读写速度:CPU L1/L2/L3 Cache、Linux page Cache加速硬盘读写、浏览器缓存、Ehcache缓存数据库结果。 降低后端负载 后端服务器通过前端缓存降低负载:业务端使用Redis降低后端MySQL负载等。 成本 数据不一致:缓存层和数据层有时间窗口不一致,和更新策略有关。 代码维护成本:多了一层缓存逻辑 使用场景 对高消耗的SQL:join结果集/分组统计结果缓存 加速请求响应:利用Redis、Memcache优化IO响应时间 大量写合并为批量写:如计数器先Redis累加再批量写DB 缓存的更新策略: LRU方法,LFU方法FIFO方法: 例如maxmemory-policy。 超时提出: 例如:例如 expire 主动更新:开发控制生命周期: 策略: 一致性 维护成本 LRU/LIRS算法剔除 最差 低 超时剔除 较差 低 主动更新 强 高 缓存在细粒度的控制: 1、从MySQL获取用户信息: select * from user where id={id} 2、设置用户信息缓存: set user:{id} `select * from user where id={id}` 3、缓存粒度:

Redis面试题总结

不羁岁月 提交于 2020-01-19 15:12:42
如何用Redis做异步队列 一般使用list结构作为队列,rpush生产消息,lpop消费消息,当lpop没有消息的时候,需要适当sleep一会再重试 或者不用sleep使用blpop在没有消息的时候,它会阻塞住直到消息的到来 可以使用pub/sub主题订阅者模式,可以实现1:N的消息队列 pub/sub缺点:在消费者下线的情况下,生产的消息会丢失,要使用专业的消息队列(RocketMQ) Redis如何实现延时队列 使用sortedset,拿时间戳作为score,消息内容作为key调用zadd来生产消息,消费者用zrangebyscore指令获取N秒之前的数据轮询进行处理 机器突然掉电会怎么样 取决于AOF日志sync属性的配置,如果不要求性能,在每条指令时都sync一下磁盘,就不会丢失数据。但在高性能的要求下一般都是使用定时sync。 Pipeline有什么好处,为什么要使用Pipeline 可以将多次IO往返的时间缩减为一次,前提是pipeline执行的指令之间没有因果相关性。使用redis-benchmark进行压测的时候可以发现影响redis的QPS峰值的一个重要因素是pipeline批次指令的数目。 多个操作系统同时操作Redis带来的数据问题 可以基于Zookeeper实现分布式锁,每个系统通过Zookeeper获取分布式锁,确保同一时间

nginx缓存

时光毁灭记忆、已成空白 提交于 2020-01-18 08:13:35
nginx缓存 cache of nginx 缓存即数据交换的缓冲区,当A与B进行数据交互时,先去找缓存中是否有数据,若在缓存中找不到想要的数据,那么再去B中找;找到了就直接返回不用和B再打交道了。 1.缓存概述 生活中有很多场景,都和缓存相似。这不过年了,秃头男突然想吃猪肉炖粉条了,就去冰箱里去拿猪肉,发现冰箱里空空如也,于是乎就去集市买了两斤。单身汉一人一顿也吃不完啊,于是切了半斤把剩余的又放冰箱里了,美美的吃了一顿。下次再吃就不用去集市了,直接从冰箱里拿即可,等吃完再去集市买呗。 哲学上说存在即合理,那么缓存的存在肯定有他的优势,相反的,有好处就必然会有坏处,事物总是有两面性的。 我们购买电脑的时候常常会看到CPU的描述会有6m或者8m、二级或者三级缓存,对于普通消费者来说肯定是一脸懵逼不知所云,光听销售员吹的天花乱坠去了。对于开发者来说,缓存已经不是一个陌生的东西了,在这个21世纪快速消费的时代,满足消费者的极致体验和与消费者的快速交互,是互联网产品都要解决的一大难题。从而应运而生的各种技术,百家齐放,相互竞争,以让自家产品稳定运行、响应速度快人一等。 缓存追求的是快。在没有缓存时,一个get请求要从服务器获取数据,一般都会经过服务器方的统一网关入口,然后再到具体的服务器,服务器中存储数据的地方一般都是数据库,所以在服务器这里还要再调用应用程序比如MySQL