"个性化空间"性能优化方案设计初步
一、问题的提出
在九月中开始,我们要打造个性化空间,领导要求的是只进行原型的设计,逻辑的设计,不进行技术开发。其实是严重不正确的,因为个性化空间其特点与现有的技术模型完全不同,现有的技术方案未必能适应开发工作,会造成看起来工作正常,但一旦大规模压力测试将性能一塌糊涂.....
所以,我们当然要听从领导安排,但私下准备好个性化空间的技术方案也是势在必行。
二、初步技术方案
根据以往的性能优化方案,我们一般采用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 ...
随机推荐
- 201621044079《Java程序设计》第1周学习总结
1. 本周学习总结 首先要认识到java这门课程的重要性 了解java语言的发展历史 以及java的特点(*跨平台) 了解JDK JRE JVM的含义以及关系 JVM 是实现平台无关性的关键 学会独立 ...
- Bootstrap中的Affix插件
我们为什么要用bootstrap?因为懒!哦....不,是因为方便,呃...意思差不多. 今天来说说Affix这个插件,它可以使导航栏固定,免去了自己手写的麻烦,用着非常方便,废话不多说,下面是用法. ...
- Hibernate常用方法之_插入
1.使用session的save方法进行插入 public void saveUser(User user){ Session session = null; Transaction transact ...
- JVM GC Q&A(补充ing)
1.如果一个对象没有与其相连的GC ROOT,一定会被回收吗? 这个对象并非是非死不可的,这时他只是处于死缓阶段,要真正宣告一个对象的死亡,至少要经历两次标记过程:如果对象在进行可达性分析后发现并没有 ...
- TCP/IP Note1
TCP/IP(Transmission Control Protocol / Internet Protocol)是用于Internet的通信协议. 计算机通信协议:是指对那些计算机必须遵守以便彼此通 ...
- CMD批处理把txt文本中的每行写入一个新文件,第一列作文件名
需求 现在有一个文件格式如图 ID 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17001 89.84 8.87 1.29 -0.0 0.0 68.99 0.0 0. ...
- 【luogu 1439 最长公共子序列】
题目描述 给出1-n的两个排列P1和P2,求它们的最长公共子序列. 输入输出格式 输入格式: 第一行是一个数n, 接下来两行,每行为n个数,为自然数1-n的一个排列. 输出格式: 一个数,即最长公共子 ...
- 12.25模拟赛T1
可以区间dp,但是复杂度太高. 所以应该是贪心,怎么贪心呢? 这种题目,最好还是手玩找一些规律. 可以发现,由于保证可以m次填完,所以颜色之间没有相互包含关系. 比较像分治的模型. 所以考虑拿到一个区 ...
- WordPress后台edit-tags.php里无限栏目分类实现
在 WordPress 里 http://localhost/wordpress3.6.1/wp-admin/edit-tags.php?taxonomy=category 这个链接可以显示 WP 里 ...
- 使用google api material icons在网页中插入图标
在<head></head>中加入这一句: <link rel='stylesheet' href='http://fonts.googleapis.com/icon?f ...