一、问题的提出

在九月中开始,我们要打造个性化空间,领导要求的是只进行原型的设计,逻辑的设计,不进行技术开发。其实是严重不正确的,因为个性化空间其特点与现有的技术模型完全不同,现有的技术方案未必能适应开发工作,会造成看起来工作正常,但一旦大规模压力测试将性能一塌糊涂.....

所以,我们当然要听从领导安排,但私下准备好个性化空间的技术方案也是势在必行。

二、初步技术方案

根据以往的性能优化方案,我们一般采用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命令进行压缩。

==================================================================================================

"个性化空间"性能优化方案设计初步的更多相关文章

  1. Web性能优化:What? Why? How?

    为什么要提升web性能? Web性能黄金准则:只有10%~20%的最终用户响应时间花在了下载html文档上,其余的80%~90%时间花在了下载页面组件上. web性能对于用户体验有及其重要的影响,根据 ...

  2. Android客户端性能优化(魅族资深工程师毫无保留奉献)

    本文由魅族科技有限公司资深Android开发工程师degao(嵌入式企鹅圈原创团队成员)撰写,是degao在嵌入式企鹅圈发表的第一篇原创文章,毫无保留地总结分享其在领导魅族多个项目开发中的Androi ...

  3. 面向.Net程序员的后端性能优化实战

    最近2个月没做什么新项目 完全是对于旧的系统进行性能优化 避免超时 死锁 数据处理能力不够等常见的性能问题 这里不从架构方面出发 毕竟动大手脚成本比较高 那么我们以实例为前提 从细节开始 优化角度 一 ...

  4. Python代码性能优化技巧

    摘要:代码优化能够让程序运行更快,可以提高程序的执行效率等,对于一名软件开发人员来说,如何优化代码,从哪里入手进行优化?这些都是他们十分关心的问题.本文着重讲了如何优化Python代码,看完一定会让你 ...

  5. Python 代码性能优化技巧(转)

    原文:Python 代码性能优化技巧 Python 代码优化常见技巧 代码优化能够让程序运行更快,它是在不改变程序运行结果的情况下使得程序的运行效率更高,根据 80/20 原则,实现程序的重构.优化. ...

  6. 浅谈.NET Micro Framework性能优化 转自 软件中国

    .NET Micro Framework的可剪裁性,高定执行,和天生对硬件高集成度都让它的前途一片光明.当然,它现在还很年轻,就发布的SDK v3.0来看,它还有很长的路要走. 废话不说,就这几个月我 ...

  7. Python 代码性能优化技巧

    选择了脚本语言就要忍受其速度,这句话在某种程度上说明了 python 作为脚本的一个不足之处,那就是执行效率和性能不够理想,特别是在 performance 较差的机器上,因此有必要进行一定的代码优化 ...

  8. SQL性能优化没有那么神秘

    经常听说SQL Server最难的部分是性能优化,不禁让人感到优化这个工作很神秘,这种事情只有高手才能做.很早的时候我在网上看到一位高手写的博客,介绍了SQL优化的问题,从这些内容来看,优化并不都是一 ...

  9. 《Android开发艺术探索》读书笔记 (13) 第13章 综合技术、第14章 JNI和NDK编程、第15章 Android性能优化

    第13章 综合技术 13.1 使用CrashHandler来获取应用的Crash信息 (1)应用发生Crash在所难免,但是如何采集crash信息以供后续开发处理这类问题呢?利用Thread类的set ...

随机推荐

  1. php数据缓存到文件类设计

    // 自定义缓存类 class Cache_Filesystem { // 缓存写保存 function set ($key, $data, $ttl) { //打开文件为读/写模式 $h = fop ...

  2. BZOJ1558 [JSOI2009]等差数列 【线段树】

    题目链接 BZOJ1558 题解 等差数列,当然是差分一下 差分值相同的连续位置形成等差数列,我们所选的两个等差数列之间可以有一个位置舍弃 例如: \(1 \; 2 \; 3 \; 6 \; 8 \; ...

  3. 洛谷 P2486 [SDOI2011]染色/bzoj 2243: [SDOI2011]染色 解题报告

    [SDOI2011]染色 题目描述 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同 ...

  4. HDU4280:Island Transport(最大流)

    Island Transport Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Other ...

  5. 自己实现的JDBC工具类

    最近做了个后台应用程序,刚开始用Spring+iBatis来做的,后来因为种种原因,不让用Spring.iBatis以及一些开源的工具包.   于是用JDBC重写了原来的Service实现,项目做完了 ...

  6. SpringMVC学习 -- IDEA 创建 HelloWorld

    SpringMVC 概述: Spring 为展现层提供的基于 MVC 实际理念的优秀 Web 框架 , 是目前最主流的 MVC 框架之一. 自 Spring3.0 发布及 2013 年 Struts ...

  7. css实现九宫格图片自适应布局

    我之前写九宫格自适应布局的时候,每个格子是使用媒体查询器(@media)或者js动态设置css,根据不同的手机屏幕宽度,适配不同手机,但是这样有个很大的缺点,那就是移动端的屏幕尺寸太多了,就得写很多代 ...

  8. jquery 的相关 width 和 height 方法辨析

    width() 设置或返回元素的宽度(不包括内边距.边框或外边距). height() 设置或返回元素的高度(不包括内边距.边框或外边距). innerWidth() 返回元素的宽度(包括内边距). ...

  9. 【CF1023E】Down or Right(交互,贪心)

    题意: n<=500 思路:From https://blog.csdn.net/csdnjiangshan/article/details/81813227 #include<cstdi ...

  10. linux内核源码中两个重要的宏

    转载:http://www.cnblogs.com/skywang12345/p/3562146.html 倘若你查看过Linux Kernel的源码,那么你对 offsetof 和 containe ...