网站的优化----首页优化---app调取服务端数据

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

//对于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访问整体简图

时间: 2024-08-05 15:41:42

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

专业移动APP 手机APP后台服务端开发

专业移动APP 手机APP后台服务端开发优势:8年PHP 9年JAVA开发经验采用THINKPHP 和JFINAL ,SBadmin 2框架进行开发完善的开发文档免费一年BUG维护 可签协议,可先预付20%,也可分段付款, 亲 请带好需求文档! QQ 184377367 报价原则1:功能列表2:兼容性3:安全要求等级4:是否需要完善的开发文档5:后台UI是否有要求

关于支付宝app支付服务端的实现-Java版

前言 最近在工作中需要使用支付宝app支付,在初次使用过程中也不可避免的出现了一些问题,那么本次随笔主要是概述支付宝app支付服务端的整个实现过程以及就服务端出现的一些问题做一些总结. 1.准备工作 1.1 入驻蚂蚁金服开放平台 https://open.alipay.com/platform/home.htm 1.2 创建应用 首先需要创建一个应用. 然后需要设置应用公钥. 下载支付宝密钥生成器.生成成功之后将公钥复制到这里. 最后提交审核,等待. 2.Maven依赖 首先需要下载SDK,ht

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

python的flex服务端数据接口开发 python 如果给flex提供服务端,需要提供一个网关和一个可供客户端(flex)调用的类.这方面我更加推荐用twisted来写这个网关,因为twisted有很好的异步机制. 下面的我写的一个简单的验证用户的python服务端: ______________________________DBServer.py # Copyright (c) 2009-2010 The Newjh Project."""@author: Roy@s

LigerUI中通过加载服务端数据进行表格的分页显示

前言:我的这一篇文章是紧接着上一篇关于LigerUI的文章(http://www.zifangsky.cn/379.html)写的,因此在这里我就省略了相关的环境搭建,直接进入正题 一 介绍 在LigerUI中显示表格是用的ligerGrid,同时我们可以通过配置url参数就可以加载远程数据并显示成表格形式.不仅如此,ligerGrid还可以进行数据的排序和分页显示: (1)排序:需要用到"sortname"和"sortorder"这两个参数,分别表示按哪个字段排序

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

主要是基于HTTP协议与服务端进行交互. 涉及到的类和接口有:URL.HttpURLConnection.HttpClient等 URL: 使用一个String类型的url构造一个URL对象,如: URL url = new URL(http://10.0.2.2/index.php); openConnection()方法返回一个对指定url的资源的连接.返回类型是URLConnection,但是,由于这里我们一般用的是http协议,所以返回的实际是HttpURLConnection对象,故一

Unity中使用协程进行服务端数据验证手段

近期在做项目中的个人中心的一些事情,用户头像上传,下载,本地缓存,二级缓存,压缩,这些都要做,麻雀虽小五脏俱全啊,也是写的浑浑噩噩的, 当我们在上传用户头像的时候,向服务端发送上传头像请求之前,一般都会做一次验证,向服务端获取token验证信息,来确保非法上传,如果不做这个那么会有非法用户上传非法图像,使你的服务器 带来未知的灾难. 而验证的逻辑很好写,并没有什么难度,比如: Server.SendMessage("获取token"); Client.Receive(string to

android菜鸟学习笔记25----与服务器端交互(二)解析服务端返回的json数据及使用一个开源组件请求服务端数据

补充:关于PHP服务端可能出现的问题: 如果你刚好也像我一样,用php实现的服务端程序,采用的是apache服务器,那么虚拟主机的配置可能会影响到android应用的调试!! 在android应用中访问的IP都是10.0.2.2,如果在apache虚拟主机配置文件中配置了多个虚拟主机,那么将默认解析为对第一个虚拟主机的请求,所以,在调试android应用时,应该将对应的服务端所配置的那个虚拟主机放在配置文件中的第一个虚拟主机的位置.否则就会出现请求的文件不存在等的错误. 服务端返回JSON数据及

html5客户端跨域访问php服务端数据

客户端代码: var param = $.param( { feed:JSON.stringify({ content:'abcd' }) } ); $http({ url: 'http://61.153.100.80/pay/talent.php', method: "POST", data:param, headers: {'Content-Type': 'application/x-www-form-urlencoded'} }).success(function(data, s

struts2(三)---struts2中的服务端数据验证框架validate

struts2为我们提供了一个很好的数据验证框架–validate,该框架可以很方便的实现服务端的数据验证. ActionSupport类提供了一个validate()方法,当我们需要在某一个action中进行数据验证时,可以重写这个方法.数据验证往往是在客户端向服务端提交表单信息时进行的,比如execute方法负责处理表单信息并返回相应的结果,在此之前,validate会先对提交的表单信息进行验证: ->验证通过:会执行execute的相应操作. ->验证失败: –>定义了失败后的re