缓存服务器

深入解析OkHttp3

不打扰是莪最后的温柔 提交于 2020-01-24 05:52:02
OkHttp是一个精巧的网络请求库,有如下特性: 
1)支持http2,对一台机器的所有请求共享同一个socket 
2)内置连接池,支持连接复用,减少延迟 
3)支持透明的gzip压缩响应体 
4)通过缓存避免重复的请求 
5)请求失败时自动重试主机的其他ip,自动重定向 
6)好用的API 其本身就是一个很强大的库,再加上Retrofit2、Picasso的这一套组合拳,使其愈发的受到开发者的关注。本篇博客,我将对Okhttp3进行分析(源码基于Okhttp3.4)。 如何引入Okhttp3? 配置Okhttp3非常简单,只需要在Android Studio 的gradle进行如下的配置: compile 'com.squareup.okhttp3:okhttp:3.4.1' * 1 添加网络权限: <uses-permission android:name="android.permission.INTERNET"/> * 1 Okhttp3的基本使用 okHttp的get请求 
okHttp的一般使用如下,okHttp默认使用的就是get请求 String url = "http://write.blog.csdn.net/postlist/0/0/enabled/1"; mHttpClient = new OkHttpClient(); Request request =

MySQL数据库优化

不羁的心 提交于 2020-01-24 00:55:09
MySQL数据库优化 概览 软优化 1.优化查询语句 2.优化子查询 3.命中索引 4.分解表 5.增加中间表 6.增加冗余字段 7.分析表、检查表、优化表 硬优化 1.cpu、内存、磁盘 2.配置参数 3.分库分表 4.缓存集群 概览 软优化 :1.优化查询语句;2.优化子查询;3.命中索引;4.分解表;5.增加中间表;6.增加冗余字段;7.分析表、检查表、优化表 硬优化 :1.cpu、内存、磁盘;2.配置参数;3.分库分表+读写分离;4.缓存集群 软优化 1.优化查询语句 使用EXPLAIN或者DESCRIBE(可简写为DESC)命令分析一条查询语句的执行信息 输入: DESC SELECT * FROM user 显示: select_type:代表查询类型,分为简单查询、子查询等等 type:代表查询策略,分为全表扫描(ALL)、索引合并(index_merge)等等 possible_keys:可能用到的索引 key:实际用到的索引 Extra:额外信息,包含Using intersect(index1,index2)、Using where、Using index等等 2.优化子查询 应该尽量使用join查询代替子查询。子查询是一个嵌套的查询,外层查询嵌套内层查询,查询时会建立内层查询的临时表,查询完毕会删除该临时表,建立和删除会有较大的系统开销

缓存在高并发场景下的常见问题

生来就可爱ヽ(ⅴ<●) 提交于 2020-01-23 02:33:58
当数据时效性要求很高时,需要保证缓存中的数据与数据库中的保持一致,而且需要保证缓存节点和副本中的数据也保持一致,不能出现差异现象。这就比较依赖缓存的过期和更新策略。一般会在数据发生更改的时,主动更新缓存中的数据或者移除对应的缓存。 缓存并发问题 缓存过期后将尝试从后端数据库获取数据,这是一个看似合理的流程。 但是,在高并发场景下,有可能多个请求并发的去从数据库获取数据,对后端数据库造成极大的冲击,甚至导致 “雪崩”现象。 此外,当某个缓存key在被更新时,同时也可能被大量请求在获取,这也会导致一致性的问题。那如何避免类似问题呢?我们会想到类似“锁”的机制,在缓存更新或者过期的情况下,先尝试获取到锁,当更新或者从数据库获取完成后再释放锁,其他的请求只需要牺牲一定的等待时间,即可直接从缓存中继续获取数据。 缓存穿透问题 缓存穿透在有些地方也称为“击穿”。很多朋友对缓存穿透的理解是:由于缓存故障或者缓存过期导致大量请求穿透到后端数据库服务器,从而对数据库造成巨大冲击。 这其实是一种误解。真正的缓存穿透应该是这样的: 在高并发场景下,如果某一个key被高并发访问,没有被命中,出于对容错性考虑,会尝试去从后端数据库中获取,从而导致了大量请求达到数据库,而当该key对应的数据本身就是空的情况下,这就导致数据库中并发的去执行了很多不必要的查询操作,从而导致巨大冲击和压力。

大数据笔记之Redis

二次信任 提交于 2020-01-22 22:12:57
Redis简介 redis是一个开源的使用 C 语言编写,支持网络,基于内存并且可持久化的日志 K-V 非关系型数据库。支持多种语言的API。支持多种数据类型(String、List、Set等) Redis应用场景 缓存: 当系统接口比较慢时,可以把系统数据接口的数据缓存起来,下次可直接从缓存中读取。 数据存储: redis有两种持久化机制【AOF和RDB】,可以将数据持久化到硬盘中,保证数据的完整性,安全性。 为什么使用Redis 高性能共享: 当数据需要被多个线程/进程/节点频繁读取时,redis基于内存读写效率高。 并发缓存: 当多个写请求需要连接其他数据库时,使用redis做一个缓存,将多个并发连接转化为一次连接。 Redis原理 数据结构 String: 最基本的数据类型,可以包含任何数据。一个 redis 字符串 value 最多可以是 512M hash: 散列,是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对 象。 list: 单键多值,就是一个简单的字符串列表。底层是一个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。 set: 自动去重 zset: 有序无重复集合 持久化 RDB持久化: 在指定时间间隔内 redis 会将内存中所有数据以二进制方式生成一份副本存储到硬盘上(相当于快照),

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、缓存粒度:

浏览器中F5和CTRL F5的行为区别及如何强制更新资源

别来无恙 提交于 2020-01-22 12:30:51
一、浏览器中F5和CTRL F5的行为区别    我们直接来看效果,下面是我打开qq网页,分别使用F5和CTRL F5,我们来看区别。 F5: CTRL F5: 区别:   首先直观上的区别是CTRL F5明显比F5加载速度慢了。观察资源加载发现,F5中大部分资源的状态码都是304,也就是重定向,使用了很多缓存资源;而CTRL F5中所有资源状态码都是200,都是重新下载了资源。 1.F5使用缓存,并且只有在资源内容发生变化的时候才会去更新资源 当刷新一个页面的时候,浏览器会尝试使用各种类型的缓存,并且会发送 If-Modified-Since 头到服务器,如果服务器返回 304 Not Modified ,那么浏览器会使用本地的缓存;如果服务器返回 200 OK 和资源内容,那么浏览器会使用返回的资源内容,并把资源内容进行缓存,待下次使用。 注:刷新页面,会让浏览器向服务端发起验证,忽略 max-age 。 2.CTRL-F5 强制更新页面资源的缓存 MSIE会发送 Cache-Control: no-cache 头,Firefox和Chrome除了发送 Cache-Control: no-cache 头之外,还会发送 Pragma: no-cache 头。Opera比较另类,不发送任何和缓存相关的头。 二、如何强制更新资源 1.加上请求头If-Modified

F5和CTRL+F5的区别

六眼飞鱼酱① 提交于 2020-01-22 12:30:11
背景 我司的网站是框架结构的,一个页面里有多个iframe.正因为这个原因,每次当我自信满满的把修改过的JS文件提交到SVN上后,没过多久,某个后台程序员就会来找我说:怎么JS还报错呢,我已经CTRL+F5了啊,你提交对了吗.我只好到他座位上拿起鼠标进行操作:右键->本帧->在新标签中打开新帧->CTRL+F5->切换到原标签->F5.这一番操作之后,终于对了.同样的事情已经发生过很多次了.这也证明了不少程序员同志还是不够了解浏览器的缓存机制. 基础知识 问题的根本原因就是,在火狐里,CTRL+F5清除不了框架页面的缓存.包括框架页面本身和其所有的嵌入元素(.js,.css,.jpg等).所以本文的真正标题是"Firefox中如何才能跳过缓存刷新框架内的页面".首先我要讲一下相关的基础知识. 一.读取缓存 搞WEB开发的经常会说:有缓存,CTRL+F5一下.或者:有缓存,CTRL+SHIFT+DEL清一下.那么你知道浏览器有几种方式来读取缓存文件吗.从是否发送了HTTP请求来区分,我觉的可以分两种: 1.浏览器从服务器返回的过期时间判断得出,该文件还没有过期,所以直接从缓存文件夹读取缓存文件,显示网页,并没有走任何网络连接. 2.浏览器发送HTTP请求,请求头中包含了If-Modified-Since 和 If-None-Match字段.让服务器来判断是否应该读取缓存文件

前端性能毫秒必争方案(二)HTTP缓存

扶醉桌前 提交于 2020-01-22 09:14:12
web最好的体验是不需要与服务器通信 响应消除所有的网络延迟,并避免数据传输的数据开销。 为了实现这一目标,HTTP规范允许服务器返回多个不同的缓存控制指令来控制如何,以及多长时间可以通过浏览器和其他中间缓存缓存单个响应。 0.0.1. 好在每个现代浏览器都自带了 HTTP 缓存实现功能。 您只需要确保每个服务器响应都提供正确的 HTTP 标头指令,以指示浏览器何时可以缓存响应以及可以缓存多久。 0.0.2. 作为开发者,怎么利用HTTP Cache? 浏览器会替我们完成所有工作,它会自动检测之前是否指定了验证令牌,它会将验证令牌追加到发出的请求上,并且它会根据从服务器接收的响应在必要时更新缓存时间戳。 0.0.3. 唯一要做的 就是确保服务器提供必要的 ETag 令牌。检查您的服务器文档中有无必要的配置标志。** 0.0.4. 送上Ngix 实战配置,不玩虚的 # 为JS 文件添加长时间缓存 location ~* \.js$ { add_header "section" "long expire"; # 仅供说明 add_header Cache-Control "max-age=31536000"; } # 或者为JS文件删除ETags location ~* \.js$ { add_header "section" "no etags"; # 仅供说明 etag off;

架构之CDN缓存

与世无争的帅哥 提交于 2020-01-22 03:44:33
CDN缓存 CDN主要解决将数据缓存到离用户最近的位置,一般缓存静态资源文件(页面,脚本,图片,视频,文件等)。国内网络异常复杂,跨运营商的网络访问会很慢。为了解决跨运营商或各地用户访问问题,可以在重要的城市,部署CDN应用。使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。 CND原理 CDN的基本原理是广泛采用各种缓存服务器,将这些缓存服务器分布到用户访问相对集中的地区或网络中,在用户访问网站时,利用全局负载技术将用户的访问指向距离最近的工作正常的缓存服务器上,由缓存服务器直接响应用户请求。 (1) 未部署CDN应用前 网络请求路径: 请求:本机网络(局域网)——》运营商网络——》应用服务器机房 响应:应用服务器机房——》运营商网络——》本机网络(局域网) 在不考虑复杂网络的情况下,从请求到响应需要经过3个节点,6个步骤完成一次用户访问操作。 (2) 部署CDN应用后 网络路径: 请求:本机网络(局域网)——》运营商网络 响应:运营商网络——》本机网络(局域网) 在不考虑复杂网络的情况下,从请求到响应需要经过2个节点,2个步骤完成一次用户访问操作。 与不部署CDN服务相比,减少了1个节点,4个步骤的访问。极大的提高的系统的响应速度。 CDN优缺点 (1)优点(摘自百度百科) 1、本地Cache加速:提升访问速度,尤其含有大量图片和静态页面站点; 2、镜像服务

大型网站架构系列:缓存在分布式系统中的应用(一)

混江龙づ霸主 提交于 2020-01-22 03:36:04
缓存是分布式系统中的重要组件,主要解决高并发,大数据场景下,热点数据访问的性能问题。提供高性能的数据快速访问。 本文是缓存在分布式应用第一篇文章,介绍缓存的原理,缓存的分类,缓存的设计,CDN缓存(原理,架构参考和技术实践),反向代理缓存(原理,Squid架构实践和常用代理缓存之间的比较)。本文主要是自己的学习总结和网络文章摘录,供学习之用。 本次分享大纲 缓存概述 CDN缓存 反向代理缓存 分布式缓存 本地缓存 缓存架构示例 参考资料 分享总结 一、缓存概述 缓存是分布式系统中的重要组件,主要解决高并发,大数据场景下,热点 数据访问的性能问题 。 提供高性能的数据快速访问 。 1.1缓存的原理 (1)将数据写入/读取速度更快的存储(设备); (2)将数据缓存到离应用最近的位置; (3)将数据缓存到离用户最近的位置。 1.2缓存分类 在分布式系统中,缓存的应用非常广泛,从部署角度有以下几个方面的缓存应用。 (1)CDN缓存; (2)反向代理缓存; (3)分布式Cache; (4)本地应用缓存; 1.3缓存媒介 常用中间件:Varnish,Ngnix,Squid,Memcache,Redis,Ehcache等; 缓存的内容:文件,数据,对象; 缓存的介质:CPU,内存(本地,分布式),磁盘(本地,分布式) 1.3缓存设计 缓存设计需要解决以下几个问题: (1)缓存什么?