缓存

Guava-学习

我们两清 提交于 2020-03-06 16:12:16
学习准备 源码地址:https://github.com/google/guava API地址:https://guava.dev/releases/snapshot-jre/api/docs/ 学习方式:1、根据github说明使用 。2、下载源码,研究里面的测试例子。3、查看API里面的例子。 中文地址:https://ifeve.com/google-guava/ 概念说明-github网页翻译 Guava是Google的一组核心Java库,其中包括新的集合类型(例如多图和多集),不可变的集合,图形库以及用于并发,I / O,哈希,缓存,基元,字符串等的实用程序!它广泛用于Google的大多数Java项目中,也被许多其他公司广泛使用。 JRE版本需要JDK 1.8或更高版本。 Guava的好处 标准化 - Guava库是由谷歌托管。 高效 - 可靠,快速和有效的扩展JAVA标准库 优化 - Guava库经过高度的优化。 1. 函数式编程 -增加JAVA功能和处理能力。 2. 实用程序 - 提供了经常需要在应用程序开发的许多实用程序类。 3. 验证 -提供标准的故障安全验证机制。 4. 最佳实践 - 强调最佳的做法。 包含内容 一、基本工具 二、新集合类型 三、不可变集合 四、强大的集合工具 五、函数式编程 六、字符串处理 七、并发编程 八、原生类型 九、区间 十、缓存 十一

[读书笔记] 高性能网站建设指南

对着背影说爱祢 提交于 2020-03-06 13:44:17
绪言A:前端性能的重要性 性能黄金法则:只有10%~20%的最终用户响应时间花在了下载HTML文档上,其余80%~90%时间花在了下载页面中的所有组件上。 规则1:减少HTTP请求 图片地图 图片地图允许在一个图片上关联多个URL,目标URL的选择取决于用户点击了图片上的哪个位置。 图片地图有两种类型 服务器端图片地图:将用户点击提交到服务端,并向其传递用户点击的x、y坐标。Web应用程序将x、y映射为适当的操作。 客户端图片地图:通过HTML的MAP标签实现。 CSS Sprites 任何支持背景图片的HTML元素都能CSS Sprites,通过background-image和background-position来实现。 内联图片 通过使用data:URL模式可以在Web页面中包含图片但无需任何额外的HTTP请求。 data:[<mediatype>][;base64],<data> 由于data:URL是内联在页面中的,在跨越不同页面时不会被缓存 合并脚本和样式表 规则2:使用内容发布网络(CDN) 如果应用程序Web服务器离用户更近,则一个HTTP请求响应时间将缩短。另一方面,如果组件Web服务器离用户更近,则多个HTTP请求的响应时间将缩短。 内容发布网络 内容发布网络是一组分布在多个不同地理位置的Web服务器,用于更加有效地向用户发布内容。 优点: 缩短响应时间

【易实战】Spring Cloud Greenwich Hystrix:服务容错保护

倖福魔咒の 提交于 2020-03-06 11:10:09
写作时间:2020-03-06 Spring Cloud: Greenwich, Spring Boot: 2.1, JDK: 1.8, IDE: IntelliJ IDEA 说明 Spring Cloud Hystrix 是Spring Cloud Netflix 子项目的核心组件之一,具有服务容错及线程隔离等一系列服务保护功能,本文将对其用法进行详细介绍。 在微服务架构中,服务与服务之间通过远程调用的方式进行通信,一旦某个被调用的服务发生了故障,其依赖服务也会发生故障,此时就会发生故障的蔓延,最终导致系统瘫痪。Hystrix实现了断路器模式,当某个服务发生故障时,通过断路器的监控,给调用方返回一个错误响应,而不是长时间的等待,这样就不会使得调用方由于长时间得不到响应而占用线程,从而防止故障的蔓延。Hystrix具备服务降级、服务熔断、线程隔离、请求缓存、请求合并及服务监控等强大功能。 1. 拷贝Eureka Server和UserServiceClient工程 1.1 【易实战】Spring Cloud Greenwich Ribbon:负载均衡的服务调用 的项目 EurekaServer 和 项目 UserServiceClient 。 1.2 Run Dashboard 运行应用 EurekaServerApplication 和应用 ClientApplication

浏览器输入url按回车背后经历了哪些?

守給你的承諾、 提交于 2020-03-06 05:47:56
在PC浏览器的地址栏输入一串URL,然后按Enter键这个页面渲染出来,这个过程中都发生了什么事? 1、首先,在浏览器地址栏中输入url,先解析url,检测url地址是否合法 2、浏览器先查看浏览器缓存-系统缓存-路由器缓存,如果缓存中有,会直接在屏幕中显示页面内容。若没有,则跳到第三步操作。 浏览器缓存:浏览器会记录DNS一段时间,因此,只是第一个地方解析DNS请求; 操作系统缓存:如果在浏览器缓存中不包含这个记录,则会使系统调用操作系统,获取操作系统的记录(保存最近的DNS查询缓存); 路由器缓存:如果上述两个步骤均不能成功获取DNS记录,继续搜索路由器缓存; ISP缓存:若上述均失败,继续向ISP搜索。 3、在发送http请求前,需要域名解析(DNS解析),解析获取相应的IP地址。 4、浏览器向服务器发起tcp连接,与浏览器建立tcp三次握手。 5、握手成功后,浏览器向服务器发送http请求,请求数据包。 6、服务器处理收到的请求,将数据返回至浏览器 7、浏览器收到HTTP响应 8、浏览器解码响应,如果响应可以缓存,则存入缓存。 9、 浏览器发送请求获取嵌入在HTML中的资源(html,css,javascript,图片,音乐······),对于未知类型,会弹出对话框。 10、 浏览器发送异步请求。 11、页面全部渲染结束。 来源: https://www.cnblogs

Mybatis:一级缓存和二级缓存

|▌冷眼眸甩不掉的悲伤 提交于 2020-03-06 01:46:46
缓存Cache 概述 存在于内存中的临时数据 作用 减少和数据库的交互次数,提高执行效率 适用场景 经常查询并且不经常改变的;数据的正确与否对最终结果影响不大的。(数据的有效性和实时性) 不适用 经常改变的数据;数据的正确与否对最终结果影响很大的 一级缓存 Mybatis 使用到了两种缓存:本地缓存(local cache)和二级缓存(second level cache),但是在没有配置的默认情况下,它只开启一级缓存。每当一个新 session 被创建,MyBatis 就会创建一个与之相关联的本地缓存。任何在 session 执行过的查询语句本身都会被保存在本地缓存中,那么,相同的查询语句和相同的参数所产生的更改就不会二度影响数据库了。本地缓存会被增删改、提交事务、关闭事务以及关闭 session 所清空。 一级缓存:指的是Mybatis中 SqlSession 对象的缓存 作用域:SqlSession范围,当在同一个sqlSession中执行两次相同的sql语句时,第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次查询时会从缓存中获取数据,不再去底层数据库查询,从而提高查询效率。 不同的sqlSession之间的缓存数据区域(HashMap)是互相不影响的。 如何会重新提交数据?: 关闭SqlSession对象close() ;如果SqlSession调用了close

Fresco-Facebook的图片加载框架的使用

我们两清 提交于 2020-03-06 00:33:24
目前常用的开源图片加载框架有:1.Universal-Image-Loader,该项目存在于Github上面 https://github.com/nostra13/Android-Universal-Image-Loader ; 2.fresco,该项目的中文网站是: http://www.fresco-cn.org/ ,在Github上面是: https://github.com/facebook/fresco 之前一直用的是Universal-Image-Loader,改用fresco之后,在有大图展示的页面,能明显感觉到fresco在渲染速度和图片呈现效果上更胜一筹。fresco与Universal-Image-Loader比起来,最直观的几个优点是: 1.在显示圆形、圆角图片时,不需要另行引入CircleImageView等第三方或者自定义控件; 2.更容易实现图片View的点击效果; 3.默认的渐入显示效果; 下面来说一下fresco的使用: 1.如果使用的是Android Studio,则需要在build.gradle中引入fresco项目: [java] view plain copy dependencies { ...... compile 'com.facebook.fresco:fresco:0.9.0+' ...... 其中0.9.0是fresco的版本;

redis知识梳理

孤者浪人 提交于 2020-03-05 22:12:01
redis: redis的数据类型 redis支持的几种数据类型: String(字符串) Hash(哈希) List(有序可重复元素集合) Set(无序不重复元素集合) ZSet(有序不重复元素集合) String: 键和值都是字符串,存储简单字符串数据类型,一个键最大能存储512M 。 命令 功能 set key value 设置值(多次设置相同的key的value值会覆盖) get key 获取值 setnx key value 不存在则设置值 del key 删除键值 setex key 有效期时间 value 键值有效期之后自动失效 mset key1 value1 key2 value2 …keyn valuen 一次设置多个值 getset key value 一次获取多个值 incr / decr key 对一个值进行自增或自减 incrby / decrby key 步长 对一个值进行步长自增或自减 append key val 给key的value追加val的字符串 strlen key 返回key对应的字符串的长度 mget key1 key2 …keyn 一次获取多个值 Hash: Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。 可以理解为:filed=对象,key=对象的属性,value

上传AppStore时遇到关于 “Authenticating with the App Store” 解决方案-2020-03-05

 ̄綄美尐妖づ 提交于 2020-03-05 21:51:26
在上传应用的时总是卡住提示 “Authenticating with the App Store” ,尝试了多次还是不行,使用其他方式 Transporter 提交,同样卡住不动,提示 “正在验证 APP - 正在通过App Store进行认证…”。 原因 1、在上传 ipa 文件时需要使用 java 程序的 iTMSTransporter 处理。 2、在第一次上传应用时,iTMSTransporter 需要从 Internet 下载一组 jar 文件并将其缓存在本地文件夹中。我们遇到的问题就是卡在了这一步,下载不下来! 传包卡在authenticating with the app store 情况下,可以尝试: 1、更换网络,比如手机热点 2、不同的上传方式,xcode、Transporter.app、fastlane 3、参考以下步骤删除缓存 解决方法 XCode11 及以上解决方法: iTMSTransporter 文件位置: XCode 中位置: /Applications/Xcode.app/Contents/SharedFrameworks/ContentDeliveryServices.framework/itms/bin/iTMSTransporter 或者在 Transporter 中位置: /Applications/Transporter.app

什么是伪共享问题?

本小妞迷上赌 提交于 2020-03-05 21:08:58
伪共享指的是多线程在对不同变量进行修改操作时,如果变量位于同一个缓存行,当多线程竞争缓存行所有权时,每个核都同时对缓存行进行修改,缓存子系统将会使其他核的缓存行失效导致cache miss,最后升级到L3缓存进行修改,最后大大影响程序的执行效率,如果竞争的核不在同一个cpu插槽即不共享L3缓存,那就会去内存中进行修改,这样引起的问题就是伪共享问题。 参考资料: 伪共享(False Sharing) 图1 图1说明了伪共享的问题。在核心1上运行的线程想更新变量X,同时核心2上的线程想要更新变量Y。不幸的是,这两个变量在同一个缓存行中。每个线程都要去竞争缓存行的所有权来更新变量。如果核心1获得了所有权,缓存子系统将会使核心2中对应的缓存行失效。当核心2获得了所有权然后执行更新操作,核心1就要使自己对应的缓存行失效。这会来来回回的经过L3缓存,大大影响了性能。如果互相竞争的核心位于不同的插槽,就要额外横跨插槽连接,问题可能更加严重。 对于HotSpot JVM,所有对象都有两个字长的对象头。第一个字是由24位哈希码和8位标志位(如锁的状态或作为锁对象)组成的Mark Word。第二个字是对象所属类的引用。如果是数组对象还需要一个额外的字来存储数组的长度。每个对象的起始地址都对齐于8字节以提高性能。因此当封装对象的时候为了高效率,对象字段声明的顺序会被重排序成下列基于字节大小的顺序:

CASPP学习笔记:高速缓存

冷暖自知 提交于 2020-03-05 16:20:41
文章目录 高速缓存 如何在缓存中读取目标字节: 直接映射缓存(E = 1) E向关联缓存 如何进行缓存写操作: 缓存层次结构 编写缓存友好的代码 存储器山 改变内层循环的空间局部性 使用分块技术提高时间局部性 使用分块技术提高时间局部性 高速缓存 性质:体积小速度快的SRAM组成,完全由硬件控制,集成在CPU芯片内,储存着经常被访问的来自主存(main memory)的块(blocks)。 结构:S,E,B,其中s表示有多少个sets,e表示每个set有多少Line,b表示每个block中需偏移几个字节才能找到目标bytes。总容量是S * E * B 如何在缓存中读取目标字节: 先确定在哪个set,然后根据tag确定在哪个Line,然后根据block offset确定字节位置。 直接映射缓存(E = 1) 定义:每个set只有一行,当tag和当前set中的block.tag不复合(或者valid位为0),miss,此set.block被替换。 模拟:通过以下模拟可以发现当只有一行时,有相同set index的block会经常发生替换。(注意此处主存大小M是16字节怎么计算而来) E向关联缓存 定义:每一行set有多列(E>1),此时CPU会通过复杂的硬件,比较同一个set不同块的tag值,从而找到目标的block,目前能实现的最大E为16。 block的大小是一个平衡值