高并发经常会发生在有大活跃用户量来访问网站的某个点,例如用户高聚集的业务场景中,如:抢购,促销等。为了让用户流畅的访问网站,来根据自己的业务设计适合系统的处理方案。

//对于APP网站首页数据,通常是有APP请求服务端数据在本机进行绘制。APP越少的请求服务端的,就会减少服务器压力:资源和带宽。

1.服务端给APP下发的数据越少,减少无用字段的下发。就是APP需要什么,服务端下发什么。

2.APP每次请求服务端数据,服务端下发最新数据和数据版本号,APP可以缓存到本地,每次接口请求数据的时候,上传当前缓存数据的版本号,服务端也计算出最新数据的版本号,进行对比,如果版本号相同不在下发数据,APP直接调取本地数据,反之,服务端下发最新数据和数据版本好给APP。

3.服务端架构方面的设计,不在由APP请求接口时被动redis 数据或者是不做缓存操作。 而是服务端主动调取mysql数据,刷入redis,APP请求接口只从redis 读取数据

下面是为Api->app调取数据设计的服务端的架构简图,也是目前我在项目中使用的。

逻辑方面:

有cron进行主动请求mysql数据,进行刷新redis数据,app通过api接口请求redis数据。

因为cron是定时任务脚本,所以主动请求时间不能太短,频繁请求mysql数据,这样就会给mysql资源造成压力。最好是在5-10分钟之内。但是这样就有一个问题数据不同步,如后端更新数据到mysql,cron要5-10分钟才能主动请求刷新redis.稳定和性能上都比较好些,所以重构的时候采取了这样的方案。

这样就设计的刷新缓存的策略的问题

1.主动刷新

  1)后台更新时,删除缓存,主动触发cron脚本,刷新缓存

    这样先删除缓存,再写入。在用户请求是会出现访问不到数据。会影响用户体验。

2)后台更新时,主动触发cron脚本,刷新缓存

对于这样,后台大量数据更新,可能会多次对一个key写入redis,会想redis刷入不确定的数据,影响数据显示的正确性

   3)后台更新时,主动触发cron脚本,生成数据版本号,版本号作为key保存数据,存入版本号栈,最上面是最新数据的版本号,最下面是原始数据的版本号,当APP请求时,app上传的版本号和原始数据版本号,如果相同不下发数据,不同的话,弹出栈顶层版本号,下发最新数据,删除旧版本号数据(会造成垃圾数据的积累),版本号栈留下最新版本号删除其他。(做一个页面分页时采用的)

4)由cron脚本主动请求数据库,刷新数据,频率不能太高。

数据有一定的延迟性

2.被动刷新

把刷新数据的任务交给app请求,如果app请求时redis内没有数据,则请求各个接口调取数据库数据,下发数据和版本号,刷新redis缓存。

当大量访问时,会产生并发的访问,造成阻塞。

app访问整体简图

网站的优化----首页优化---app调取服务端数据的更多相关文章

  1. 无框架完整搭建安卓app及其服务端(一)

    技术背景: 我的一个项目做的的是图片处理,用 python 实现图片处理的核心功能后,想部署到安卓app中,但是对于一个对安卓和服务器都一知半解的小白来说要现学的东西太多了. 而实际上,我们的项目要求 ...

  2. [SignalR]SignalR与WCF双工模式结合实现服务端数据直推浏览器端

    原文:[SignalR]SignalR与WCF双工模式结合实现服务端数据直推浏览器端 之前开发基于WinForm监控的软件,服务端基于Wcf实现,里面涉及双工模式,在客户端里面,采用心跳包机制保持与服 ...

  3. android菜鸟学习笔记24----与服务器端交互(一)使用HttpURLConnection和HttpClient请求服务端数据

    主要是基于HTTP协议与服务端进行交互. 涉及到的类和接口有:URL.HttpURLConnection.HttpClient等 URL: 使用一个String类型的url构造一个URL对象,如: U ...

  4. python的flex服务端数据接口开发

    python的flex服务端数据接口开发 python 如果给flex提供服务端,需要提供一个网关和一个可供客户端(flex)调用的类.这方面我更加推荐用twisted来写这个网关,因为twisted ...

  5. APP和服务端-架构设计(二)

    1. App架构设计经验谈:接口的设计 App与服务器的通信接口如何设计得好,需要考虑的地方挺多的,在此根据我的一些经验做一些总结分享,旨在抛砖引玉. 1.1 安全机制的设计 现在,大部分App的接口 ...

  6. 支付宝app支付服务端流程

    支付宝APP支付服务端详解 前面接了微信支付,相比微信支付,支付宝APP支付提供了支付封装类,下面将实现支付宝APP支付.订单查询.支付结果异步通知.APP支付申请参数说明,以及服务端返回APP端发起 ...

  7. APP和服务端-架构设计(一)

    架构因人而异,不同的架构师大多会有不同的看法:架构也因项目而异,不同的项目需求不同,相应的架构也会不同.然而,有些东西还是通用的,是所有架构师都需要考虑的,也是所有项目都会有的需求,比如API如何设计 ...

  8. android客户端app和服务端交互token的作用

    Android客户端和服务端如何使用Token和Session niceheart关注1人评论34644人阅读2014-09-16 16:38:44   对于初学者来说,对Token和Session的 ...

  9. pacejs进度条监控服务端数据加载是否完毕

    记得刚刚入职新公司的时候,公司在做app里面的h5页面.跟之前公司的流程不太一样.之前都是写完静态页面后通过ajax加载接口数据,这公司省事了,写完静态页面直接扔给服务端,他们来填数据,确实给前端省事 ...

随机推荐

  1. 使用 Nuget打包类库

    使用 Nuget打包类库 NuGet是个开源项目,项目包括 NuGet VS插件/NuGet Explorer/NuGetServer/NuGet命令行等项目,.NET Core项目完全使用Nuget ...

  2. Entity Framework with MySQL 学习笔记一(乐观并发)

    在做项目时,通常我们对乐观并发有几种处理模式 1. 告诉用户此数据已被其他人捷足先登,更改了.你就算新一下重来吧. 2.直接把数据覆盖上去,我最大. 3.用被人的数据. 这里给出 code first ...

  3. keil #pragma disable

    μVision2 控制:这条命令不能在命令行使用,只能在源文件中使用. 功能:DISABLE 指令使得编译器在函数运行期间禁止所有中断产生.DISABLE命令必须在函数的前面以#pragma 参数的形 ...

  4. LeetCode - 204. Count Primes - 埃拉托斯特尼筛法 95.12% - (C++) - Sieve of Eratosthenes

    原题 原题链接 Description: Count the number of prime numbers less than a non-negative number, n. 计算小于非负数n的 ...

  5. MyBatis的简单操作

    这里将的是简单的增.删.改.查等基本操作 首先创建java项目,导入相应的依赖包,这里可以参考上一篇博客 1.添加数据 在jike.book.pojo包中,新建java类 JiKeUser.java: ...

  6. iOS--创建uiscrollview

    //创建uiscrollview self.PageHeight = self.view.bounds.size.height; self.PageWidth = self.view.bounds.s ...

  7. asdasd

    adasdasd asdasd asdasd asd

  8. 《UNIX环境高级编程》笔记--信号集

    1.信号集基本操作 我们需要有一个能表示多个信号--信号集(signal set)的数据类型.POSIX.1定义了数据类型sigset_t以包含一个信号 集,并且定义了一下五个处理信号处理信号集函数. ...

  9. Javascript:sort()方法快速实现对数组排序

    定义和用法: sort() 方法用于对数组的元素进行排序. 语法: arrayObject.sort(sortby) 注释:sortby,可选,规定排序顺序,必须是函数. 说明: 如果调用该方法时没有 ...

  10. 详细介绍android rom移植知识普及

    详细介绍android rom移植知识普及 最近接到很多兄弟们的求助,也回答过无数个和下面这个问题类似的问题: 如何编译android 原生代码得到一个rom,然后跑到某某手机上. 鉴于很多兄弟对这块 ...