缓存服务器

缓存雪崩,缓存穿透解决方案

孤街醉人 提交于 2019-12-19 23:49:50
问题1- 雪崩(缓存击穿) :缓存的数据量非常大,缓存服务器不持久化。在高并发的情况下海量用户请求涌入,这时缓存失效,海量用户请求就去请求数据库,数据库承受不了,造成数据库宕机,重启后海量请求并未消失,继续涌入,继续造成数据库服务器宕机。永远起不来。这种情况就叫雪崩。 解决雪崩问题 :让缓存的数据定时的写磁盘,当缓存服务器意外停止,重启,当海量请求过来时,重启缓存服务器,如果本地有缓存文件,直接从文件中读取。放在内存中。redis是c语言写的,而且放入磁盘的内容的结构和内存中的结构一致。所以读取非常快。即使有部分的请求在恢复过程中访问到数据库,因为数量非常少,数据库还是能承受的。缓存恢复后,其他的大量的海量的请求就都被拦截了,这样就可以保证数据库不受威胁。 问题2- 缓存有多种,为什么选择redis? 主流缓存框架: 1)ehcache,框架底层喜欢用这个spring 、 hibernate 、mybatis(二级缓存) 2)memCache分布式缓存框架,百万级别,但是存在一个最重要的缺点-不落地,重启服务器内存中的数据就没有了。数据类型:字符串,多线程。 3)redis多个随时落地。数据持久化。提供“丰富”数据类型:string/list/hash/set/oset(排序)多线程和多时例。内存数据库。 来源: https://www.cnblogs.com/dgsh/p

HTTP请求常见错误大全

二次信任 提交于 2019-12-19 23:41:57
常见的Http请求错误提示 1xx - 信息提示 这些状态代码表示临时的响应。客户端在收到常规响应之前,应准备接收一个或多个 1xx 响应。 100 - 继续 101 - 切换协议 2xx - 成功 这类状态代码表明服务器成功地接受了客户端请求。 200 - 确定。客户端请求已成功 201 - 已创建 202 - 已接受 203 - 非权威性信息 204 - 无内容 205 - 重置内容 206 - 部分内容 3xx - 重定向 客户端浏览器必须采取更多操作来实现请求。例如,浏览器可能不得不请求服务器上的不同的页面,或通过代理服务器重复该请求。 302 - 对象已移动。 304 - 未修改。 307 - 临时重定向。 4xx - 客户端 错误 发生错误,客户端似乎有问题。例如,客户端请求不存在的页面,客户端未提供有效的身份验证信息。 400 - 错误的请求 401 - 访问被拒绝 · 401.1 - 登录失败。 · 401.2 - 服务器配置导致登录失败。 · 401.3 - 由于 ACL 对资源的限制而未获得授权。 · 401.4 - 筛选器授权失败。 · 401.5 - ISAPI/CGI 应用程序授权失败。 · 401.7 – 访问被 Web 服务器上的 URL 授权策略拒绝。这个错误代码为 IIS 6.0 所专用。 403 - 禁止访问 · 403.1 - 执行访问被禁止。

高并发架构以及处理的几种方式

流过昼夜 提交于 2019-12-19 23:34:41
1、HTML静态化 其实大家都知道,效率最高、消耗最小的就是纯静态化的html页面,所以我们尽可能使我们的网站上的页面采 用静态页面来实现,这个最简单的方法其实也是最有效的方法。但是对于大量内容并且频繁更新的网站,我们无法全部手动去挨个实现,于是出现了我们常见的信息 发布系统CMS,像我们常访问的各个门户站点的新闻频道,甚至他们的其他频道,都是通过信息发布系统来管理和实现的,信息发布系统可以实现最简单的信息录 入自动生成静态页面,还能具备频道管理、权限管理、自动抓取等功能,对于一个大型网站来说,拥有一套高效、可管理的CMS是必不可少的。 除了门户和信息发布类型的网站,对于交互性要求很高的社区类型网站来说,尽可能的静态化也是提高性能的必要手段,将社区内的帖子、文章进行实时的静态化,有更新的时候再重新静态化也是大量使用的策略,像Mop的大杂烩就是使用了这样的策略,网易社区等也是如此。 同 时,html静态化也是某些缓存策略使用的手段,对于系统中频繁使用 数据库 查询但是内容更新很小的应用,可以考虑使用html静态化来实现,比如论坛中论 坛的公用设置信息,这些信息目前的主流论坛都可以进行后台管理并且存储再数据库中,这些信息其实大量被前台程序调用,但是更新频率很小,可以考虑将这部分 内容进行后台更新的时候进行静态化,这样避免了大量的数据库访问请求。 2、图片服务器分离 大家知道

springboot中使用redis

五迷三道 提交于 2019-12-19 23:29:15
https://www.cnblogs.com/nfcm/p/7833032.html redis连接工厂类 第一步,需要加上springboot的redis jar包 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 然后我们写一个配置类,创建了一个redis连接的工厂的spring bean。(Redis连接工厂会生成到Redis数据库服务器的连接) @Configuration public class RedisConfig { @Bean public RedisConnectionFactory redisCF(){ //如果什么参数都不设置,默认连接本地6379端口 JedisConnectionFactory factory = new JedisConnectionFactory(); factory.setPort(6379); factory.setHostName("localhost"); return factory; } } 单元测试,看看这个工厂方法的使用 @RunWith(SpringJUnit4ClassRunner.class)

squid介绍及其简单配置

六月ゝ 毕业季﹏ 提交于 2019-12-19 18:50:01
squid的简单介绍 squid的概念 squid是一种用来缓存Internet数据的软件。接受来自人们需要下载的目标(object)的请求并适当的处理这些请求。也就是说,如果一个人想下载一web界面,他请求squid为他取得这个页面。squid随之连接到远程服务器并向这个页面发出请求。然后,squid显式地聚集数据到客户端机器,而且同时复制一份。当下一次有人需要同一页面时, squid可以简单的从磁盘中读到它,那样数据会立即传输到客户机上。 squid代理的作用 通过缓存的方式为用户提供Web访问加速 对用户的Web访问进行过滤控制 工作流程 当代理服务器中有客户端需要的数据时: a. 客户端向代理服务器发送数据请求; b. 代理服务器检查自己的数据缓存; c. 代理服务器在缓存中找到了用户想要的数据,取出数据; d. 代理服务器将从缓存中取得的数据返回给客户端。 当代理服务器中没有客户端需要的数据时: 客户端向代理服务器发送数据请求; 代理服务器检查自己的数据缓存; 代理服务器在缓存中没有找到用户想要的数据; 代理服务器向Internet 上的远端服务器发送数据请求; 远端服务器响应,返回相应的数据; 代理服务器取得远端服务器的数据,返回给客户端,并保留一份到自己的数据缓存中。 Squid代理服务器工作在TCP/IP应用层 Squid各种代理的定义 正向代理

memcache在大型网站的应用策略

北战南征 提交于 2019-12-19 17:29:48
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 【部署策略】     基于memcached的slab和dump的内存管理方式,它产生的内存碎片比较少,不需要OS去做繁杂的内存回收,所以它对CPU的占用率那是相当的低。所以建议将它跟占用CPU较高的WEB服务器一起使用来节省成本。当然如果你有大量的廉价PC,那用来专门做memcached服务器也不错。由于32位操作系统中,每个进程最多只能使用2GB内存,所以如果你有大内存的话,可以以daemon的方式启动两个以上的memcached服务,或者干脆用64位的CPU和OS。 【服务监控】      memcached支持分布式机制,php通过memcache::addserver来实现该机制,它实现了如果服务器列表中的一台down掉的时候在参数retry_interval指定的时间就不会再连接该服务器的机制。所以只要你在该时间段内重启或者修复了该服务器,则不会对前端造成太大的影响。当然了,如果你一直不去重启该服务器的话,我测试过addserver再次连接一台down掉的服务器的时间将比平时延长了1秒的时间。可以通过addserver的最后一个参数failure_callback定义一个回调函数来实现邮件通知或者短信通知管理员的功能。     如果是手工重启,我建议将该值设置为20分钟

分布式锁的几种实现方式

落爺英雄遲暮 提交于 2019-12-19 09:52:44
目前几乎很多大型网站及应用都是分布式部署的,分布式场景中的数据一致性问题一直是一个比较重要的话题。分布式的CAP理论告诉我们“任何一个分布式系统都无法同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance),最多只能同时满足两项。”所以,很多系统在设计之初就要对这三者做出取舍。在互联网领域的绝大多数的场景中,都需要牺牲强一致性来换取系统的高可用性,系统往往只需要保证“最终一致性”,只要这个最终时间是在用户可以接受的范围内即可。 在很多场景中,我们为了保证数据的最终一致性,需要很多的技术方案来支持,比如分布式事务、分布式锁等。有的时候,我们需要保证一个方法在同一时间内只能被同一个线程执行。在单机环境中, Java 中其实提供了很多并发处理相关的API,但是这些API在分布式场景中就无能为力了。也就是说单纯的 Java Api并不能提供分布式锁的能力。所以针对分布式锁的实现目前有多种方案。 针对分布式锁的实现,目前比较常用的有以下几种方案: 基于 数据库 实现分布式锁 基于缓存( Redis ,memcached,tair)实现分布式锁 基于Zookeeper实现分布式锁 在分析这几种实现方案之前我们先来想一下,我们需要的分布式锁应该是怎么样的?(这里以方法锁为例,资源锁同理) 可以保证在分布式部署的应用集群中

微信小程序学习:开发注意点

若如初见. 提交于 2019-12-19 08:36:18
11月2日更新: 微信小程序支持内嵌网页,新增 <web-view /> 组件调试支持: 传送门 <!-- wxml --> <!-- 指向微信公众平台首页的web-view --> <web-view src="https://mp.weixin.qq.com/"></web-view>    一、小程序的特点: 1::小程序适合做简单的,用完即走的应用 2:小程序适合低频的应用 3:小程序适合性能要求不高的应用 例如: 外卖类,电影票类,打车类的应用 。 二 、 小程序组件 1:text 只有text组件内的文本可以被长按选中 text组件可以嵌套使用: <text>hello <text style='color:red'>你好</text></text> 2:swiper组件 swiper-item 仅可放置在 <swiper/> 组件中,宽高自动设置为100%。所以只有设置 <swiper/> 组件的宽高才行。 <swiper> <swiper-item>sweiper1</swiper-item> <swiper-item>sweiper2</swiper-item> <swiper-item>sweiper3</swiper-item> </swiper>    3:block组件 相当于循环的括号: <block wx:for="{{posts_key}}" wx

MySQL 慢查询优化

喜欢而已 提交于 2019-12-19 07:52:17
为什么查询速度会慢    1.慢是指一个查询的响应时间长。一个查询的过程: 客户端发送一条查询给服务器 服务器端先检查查询缓存,如果命中了缓存,则立可返回存储在缓存中的结果。否则进入下一个阶段 服务器端进行SQL解析、预处理,再由优化器生成对应的执行计划。 MySQL根据优化器生成的执行计划,调用存储引擎的API来执行查询。 将结果返回给客户端    2.数据访问 是否向数据库请求了不需要的数据 是否扫描额外的记录    3.查询的方式 一个复杂的查询还是多个简单的查询 切分查询(将大查询切分成小查询,循环完成小查询) 分解关联查询 慢查询分析   问题SQL     把复杂的SQL分成多个简单SQL并执行,查看具体那个字段会慢,区分度不高。   EXPLAIN     显示SQL如何使用索引的执行计划。     执行计划的参数: table 显示这一行的数据是关于哪张表的 type 显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、indexhe和ALL possible_keys 显示可能应用在这张表中的索引。如果为空,没有可能的索引。可以为相关的域从WHERE语句中选择一个合适的语句 key 实际使用的索引。如果为NULL,则没有使用索引。很少的情况下,MYSQL会选择优化不足的索引。这种情况下,可以在SELECT语句中使用USE

ORACLE数据库SQL语句的执行过程

老子叫甜甜 提交于 2019-12-19 06:40:30
SQL语句在数据库中处理过程是怎样的呢?执行顺序呢?在回答这个问题前,我们先来回顾一下:在ORACLE数据库系统架构下,SQL语句由用户进程产生,然后传到相对应的服务端进程,之后由服务器进程执行该SQL语句,如果是SELECT语句,服务器进程还需要将执行结果回传给用户进程。 SQL语句的执行过程一般如下: 解析(PARSE)—— 绑定(BIND)——执行(EXECUTE)——提取(FETCH 只有SELECT才需要这步) 解析 服务器进程接收到一个SQL语句时,首先要将其转换成执行这个SQL语句的最有效步骤,这些步骤被称为执行计划。 Step 1:检查共享池中是否有之前解析相同的SQL语句后所存储的SQL文本、解析树和执行计划。如果能从共享池的缓存库中找到之前解析过生成的执行计划,则SQL语句则不需要再次解析,便可以直接由库缓存得到之前所产生的执行计划,从而直接跳到绑定或执行阶段,这种解析称作软解析。 但是如果在共享池的库缓存中找不到对应的执行计划,则必须继续解析SQL、生成执行计划,这种解析称作硬解析 在缓存池解析过的SQL,会有一个对应的哈希值与之对应,你可以通过V$SQL视图来查询,请看下面一个例子: SQL>SELECT * FROM SCOTT.DEPT WHERE DEPTNO =10; SQL>SELECT * FROM SCOTT.DEPT WHERE DEPTNO