"个性化空间"性能优化方案设计初步
一、问题的提出
在九月中开始,我们要打造个性化空间,领导要求的是只进行原型的设计,逻辑的设计,不进行技术开发。其实是严重不正确的,因为个性化空间其特点与现有的技术模型完全不同,现有的技术方案未必能适应开发工作,会造成看起来工作正常,但一旦大规模压力测试将性能一塌糊涂.....
所以,我们当然要听从领导安排,但私下准备好个性化空间的技术方案也是势在必行。
二、初步技术方案
根据以往的性能优化方案,我们一般采用REDIS进行一级缓存,特殊场景应对大并发,采用二级缓存办法。如果按以前的方式,那么方案是这样的:
1、在REDIS中记录此空间ID,比如ID:5,有几个模块,都是什么模块ID,比如:模块3,模块9,模块10,模块20,等。
2、每个模块的内容都单独保存到REDIS中。
3、每个模块单独记录最后的UPDATE时间,比如如果某个模块的内容删除了,更新了等,都需要在缓存中更新一下此模块的最后UPDATE时间为当前时间戳。
4、当用户初次来访问时,由LUA查询到此个性化空间有哪些模块, 然后根据每个模块的REDIS缓存,组装成一个JSON串,同时在REDIS中记录一个HASH,
包含如下信息:哪个空间ID(在KEY里体现),都有哪些模块,这些模块都是最后的更新时间是啥?
5、JSON数据经NGINX的GZIP压缩后返回。
6、当用户再次访问时,LUA查询此个性化空间有哪些模块,是不是在模块个数(或个数相同,同容变成其它模块了),模块的最后更新时间有区别,如果没有,则不重复组装,直接拿现成的JSON数据返回即可。
7、当某个模块的数据变化时,要求JAVA修改模块的最后修改时间,这样,LUA再次查询时,将不再读取保存好的JSON数据,而是重新组装返回,并再次缓存JSON数据。
三、技术方案进化
上面的方案应对一般的需求是很好的,在资源库列表的压力测试中取得了很好的成绩,由1000并发上升到3000并发应该不是问题,但应对这个需求就怕是要有问题了:
个性化空间具有可扩展性,比如,现在只开发了十个模块,用户最多可以启用十个模块,每个模块的数据量在10K左右,那么最多是100K,数据量不大,后期随着项目的进展,很可能空间出现大规模模块增加,我们以短期内可以接受的50个为上限计算,那么就在500K左右。大家知道,NGINX我们是启用了GZIP压缩的,本来GZIP压缩的效率很高,对于简单的JSON数据我们可以放心的使用GZIP压缩提高传输效率,但对于一个500K的流量,每请求一次就要实时压缩一下,效率可想而知。而此请求是一个动态请求,还不能使用效率更好的STATIC_GZIP方式,那么如果在这样的场景下,CPU的疲劳是可想而知的。因为小的JSON它压缩起来不费力,但大的呢?它也是十分吃力的,这一点我们以前在看JQUERY.MIN.JS每次让它压缩就看的出来,JQUERY.MIN.JS才只有120K左右,它就疲于奔命了,所以,这个方案存在先天的问题。
为此,黄海提出了一个新的设计思路:JSON数据的压缩不由GZIP实时进行,
参考:
http://www.cnblogs.com/kgdxpr/archive/2014/07/11/3837264.html
每次请求时先检查是不是需要更新gz文件,如果不需要,直接将静态gz文件返回即可。如需要,使用lua组织Redis进行json串的生成,然后调用 系统安装的zip命令进行压缩。
==================================================================================================
"个性化空间"性能优化方案设计初步的更多相关文章
- Web性能优化:What? Why? How?
为什么要提升web性能? Web性能黄金准则:只有10%~20%的最终用户响应时间花在了下载html文档上,其余的80%~90%时间花在了下载页面组件上. web性能对于用户体验有及其重要的影响,根据 ...
- Android客户端性能优化(魅族资深工程师毫无保留奉献)
本文由魅族科技有限公司资深Android开发工程师degao(嵌入式企鹅圈原创团队成员)撰写,是degao在嵌入式企鹅圈发表的第一篇原创文章,毫无保留地总结分享其在领导魅族多个项目开发中的Androi ...
- 面向.Net程序员的后端性能优化实战
最近2个月没做什么新项目 完全是对于旧的系统进行性能优化 避免超时 死锁 数据处理能力不够等常见的性能问题 这里不从架构方面出发 毕竟动大手脚成本比较高 那么我们以实例为前提 从细节开始 优化角度 一 ...
- Python代码性能优化技巧
摘要:代码优化能够让程序运行更快,可以提高程序的执行效率等,对于一名软件开发人员来说,如何优化代码,从哪里入手进行优化?这些都是他们十分关心的问题.本文着重讲了如何优化Python代码,看完一定会让你 ...
- Python 代码性能优化技巧(转)
原文:Python 代码性能优化技巧 Python 代码优化常见技巧 代码优化能够让程序运行更快,它是在不改变程序运行结果的情况下使得程序的运行效率更高,根据 80/20 原则,实现程序的重构.优化. ...
- 浅谈.NET Micro Framework性能优化 转自 软件中国
.NET Micro Framework的可剪裁性,高定执行,和天生对硬件高集成度都让它的前途一片光明.当然,它现在还很年轻,就发布的SDK v3.0来看,它还有很长的路要走. 废话不说,就这几个月我 ...
- Python 代码性能优化技巧
选择了脚本语言就要忍受其速度,这句话在某种程度上说明了 python 作为脚本的一个不足之处,那就是执行效率和性能不够理想,特别是在 performance 较差的机器上,因此有必要进行一定的代码优化 ...
- SQL性能优化没有那么神秘
经常听说SQL Server最难的部分是性能优化,不禁让人感到优化这个工作很神秘,这种事情只有高手才能做.很早的时候我在网上看到一位高手写的博客,介绍了SQL优化的问题,从这些内容来看,优化并不都是一 ...
- 《Android开发艺术探索》读书笔记 (13) 第13章 综合技术、第14章 JNI和NDK编程、第15章 Android性能优化
第13章 综合技术 13.1 使用CrashHandler来获取应用的Crash信息 (1)应用发生Crash在所难免,但是如何采集crash信息以供后续开发处理这类问题呢?利用Thread类的set ...
随机推荐
- chrome谷歌浏览器导致的密码被修改现象
版本 68.0.3440.106(正式版本) (32 位)记住密码功能有个缺陷,会把自己的密码自动填写到别人的密码框中,假如这个时候点击保存密码,就会导致其他用户的密码被修改为登录用户的密码. 很 ...
- Github & DMCA Takedown Policy
Github & DMCA Takedown Policy Digital Millennium Copyright Act 数字千年版权法案 https://help.github.com/ ...
- P1268 树的重量
题目描述 树可以用来表示物种之间的进化关系.一棵“进化树”是一个带边权的树,其叶节点表示一个物种,两个叶节点之间的距离表示两个物种的差异.现在,一个重要的问题是,根据物种之间的距离,重构相应的“进化树 ...
- CLion 终于支持 jump outside closing bracket/quote with Tab 了!
我觉得这个 feature 真的很有用.一直期待 CLion 加上这个 feature.今天才知道最新版本(CLion 2018.3.4)中已经有这个功能了,不过我不清楚从哪个版本开始支持的. How ...
- BZOJ5322 [Jxoi2018]排序问题 【贪心】
题目链接 BZOJ5322 题解 意思就是使有序的排列尽量少 就是使相同的数尽量少 然后大力贪心即可 #include<algorithm> #include<iostream> ...
- 线程 condition_variable
http://www.cnblogs.com/haippy/p/3252041.html 理解wait():当前线程调用 wait() 后将被阻塞(此时当前线程应该获得了锁(mutex).在线程被阻塞 ...
- 使用 URLDecoder 和 URLEncoder 对中文字符进行编码和解码
原文: https://blog.csdn.net/justloveyou_/article/details/57156039 使用 URLDecoder 和 URLEncoder 对中文字符进行编码 ...
- last_query_cost
The total cost of the last compiled query as computed by the query optimizer. This is useful for com ...
- [hdu 3949]线性基+高斯消元
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3949 一开始给做出来的线性基wa了很久,最后加了一步高斯消元就过了. 之所以可以这样做,证明如下. 首 ...
- 用JSR的@Inject代替@Autowired完成自动装配
从spring3.0开始spring支持JSR-330 的标准注解.主要是javax.inject这个包下的: 下面的例子用@Inject代替@Autowired.完成自动装配: MovieFinde ...