我们是用mvc做web,大部分数据都用memcache做了缓存

有2台memcache缓存服务器

数据并不大。

某页面响应较慢,大概在4s左右。

页面本身很简单只是显示一个表单。

但是layout相对复杂,有很多局部页,并且页面上有若干filter控制权限,局部页上也有

以上是背景

 

主要的业务逻辑是这样的:

取公司的结构缓存,里面存了公司里所有的人(id)。

取每个人的缓存,获取一些他的名字,头像之类的详细信息。

开发环境下,本地程序连本地缓存,读一个用户仅耗时1ms。

一个50人的公司,耗时50ms,因为各种filter,局部页等地方,都是传递的公司id,所以同样的逻辑可能要跑多次,假设是10次,500ms,是可以接受的范围。

 

测试环境,2台缓存服务,局域网。

读一个人的缓存,耗时上升到4-6ms。

 

生产环境,2台缓存服务,局域网。

读一个人的缓存,耗时上升到6-12ms。

 

买糕的,每个提升10倍,整体提升10倍,于是页面响应速度从半秒上升到了5s。

 

各种filter和方法都不仅仅在一个页面里使用,都是一些相对原子化的,若干组合成一个完整的业务。

但是读这么多次,数据是完全一样的,即便是1ms,他也是浪费的。

能不能在同一个请求中,对同一个缓存,只读一次?!

祭出HttpContext.Current.Item。每次读缓存时,先判断item里有没有,如果有,就不取缓存服务器读了,直接用这个item里的,如果没有,就读缓存,然后把结果存到item里,相当于在item里对缓存的数据又做了一次缓存。

 

好在我们的读缓存是用的一个相对底层的方法,而不是拿来一个缓存客户端就直接使用的,很方便加上。

另一个好在,当时为了避免内存碎片,我们把若干用户分组存到了memcache里,比如没100个用户1组,一次就能从缓存读出来100个人。

所以经过上面优化后,只需要读一次缓存就可以取到很多用户。取完全部50用户,理论上最多需要50次;但是实际上可能几次就够了。

 

加上对缓存的缓存,就目前我们的业务逻辑来说,响应速度基本可提升10倍。

在生产环境,页面响应有4-5s 提高到400-500ms,

而在本机,则可以提高到50ms左右

 

 

ps:

for 100次读缓存,在for之前和之后拿Stopwatch卡时间,for中的每次读取,分别拿另一个Stopwatch卡时间,并把每次的时间累加

结果for外层的耗时要比每次的耗时累加多50ms,但是空跑for耗时0(只是不读缓存了,改有的stopwatch的start stop,累加等还有),难道是编辑器已经智能到这个程度了?我没看il代码到底是什么

不解

ps2:

本机连本机缓存,不走局域网,这个好理解。

但是测试环境是web一台,memcache另外两台,而生产环境是web1台,memcache两台,但是其中1台与web是同一台,也就是说,当memcache的某key做部分hash的时候,他有50%的几率是可以分布到与web同一台的,平均耗时应该是大于本机但是小于测试。

而实际情况却是生产环境最慢。

不解。

ps3:

测试环境之所以叫测试环境就是因为他基本是完全模拟了生产环境,那在这两种基本相同的情况下,为什么还会有如此差异。如果测试环境慢,反而好理解,因为测试机,包括用的交换机等都不如生产环境的强大。我们的网站访问量很小(刚刚上线,基本只有公司内部人访问),基本可以排除因为生产环境的压力大造成的。

不解。

记录一次读取memcache缓存的优化的更多相关文章

  1. 云计算openstack共享组件——Memcache 缓存系统

    一.缓存系统 静态web页面: 1.工作流程: 在静态Web程序中,客户端使用Web浏览器(IE.FireFox等)经过网络(Network)连接到服务器上,使用HTTP协议发起一个请求(Reques ...

  2. 01-08-05【Nhibernate (版本3.3.1.4000) 出入江湖】NHibernate二级缓存:第三方MemCache缓存

    一.准备工作 [1]根据操作系统(位数)选择下载相应版本的MemCache, MemCache的下载和安装,参看: http://www.cnblogs.com/easy5weikai/p/37606 ...

  3. 云计算openstack共享组件(2)——Memcache 缓存系统

    一.缓存系统 在大型海量并发访问网站及openstack等集群中,对于关系型数据库,尤其是大型关系型数据库,如果对其进行每秒上万次的并发访问,并且每次访问都在一个有上亿条记录的数据表中查询某条记录时, ...

  4. MySQL缓存参数优化(转)

    MySQL 数据库性能优化之缓存参数优化 数据库属于 IO 密集型的应用程序,其主要职责就是数据的管理及存储工作.而我们知道,从内存中读取一个数据库的时间是微秒级别,而从一块普通硬盘上读取一个IO是在 ...

  5. MySQL 数据库性能优化之缓存参数优化

    在平时被问及最多的问题就是关于 MySQL 数据库性能优化方面的问题,所以最近打算写一个MySQL数据库性能优化方面的系列文章,希望对初中级 MySQL DBA 以及其他对 MySQL 性能优化感兴趣 ...

  6. memcache缓存系统

    一.缓存系统 静态web页面: 1.在静态Web程序中,客户端使用Web浏览器(IE.FireFox等)经过网络(Network)连接到服务器上,使用HTTP协议发起一个请求(Request),告诉服 ...

  7. OpenStack共享组件-Memcache缓存系统

    1. 缓存系统 1.1 静态web页面 1> 在静态Web程序中,客户端使用Web浏览器(IE.FireFox等)经过网络(Network)连接到服务器上,使用HTTP协议发起一个请求(Requ ...

  8. openstack共享组件--memcache缓存(2)

    一.缓存系统 一.静态web页面: 1.在静态Web程序中,客户端使用Web浏览器(IE.FireFox等)经过网络(Network)连接到服务器上,使用HTTP协议发起一个请求(Request),告 ...

  9. 云计算共享组件--Memcache缓存系统(4)

    一.缓存系统 一.静态web页面: 1.在静态Web程序中,客户端使用Web浏览器(IE.FireFox等)经过网络(Network)连接到服务器上,使用HTTP协议发起一个请求(Request),告 ...

随机推荐

  1. Mac OS 10.12 - 安装JAVA!

    一,下载JDK: 下载地址:版本1.8.0 http://download.oracle.com/otn-pub/java/jdk/8u121-b13/e9e7ea248e2c4826b92b3f07 ...

  2. 769. Max Chunks To Make Sorted

    Given an array arr that is a permutation of [0, 1, ..., arr.length - 1], we split the array into som ...

  3. Masnory 学习

    1:typeof <一元运算符,放在一个运算数之前,运算数可以是任何类型, 用于获取括号中的运算数的数据类型如:NSString CGFloat Int NSArray等> 2:  str ...

  4. zoj3497 Mistwald(矩阵快速幂)

    题意:给定一个有向图(最多25个节点,每个节点的出度最多为4),给定起点和终点,然后从起点开始走,走到终点就停止,否则一直往下走,问能不能P步到达终点.也就是说从起点出发,走一条长度为P的路径,路径中 ...

  5. 微信小程序与vueJs的异同

    简而言之,所有的框架都是建立在原生javascript基础之上的,所以对于有一定js基础的同学来说,各种框架都是比较容易入手的,但不同的框架之间又有一定的差别,有时候切换使用时就会掉入坑了. 一.微信 ...

  6. 优化 JS 条件语句的 5 个技巧

    优化 JS 条件语句的 5 个技巧 原创: 前端大全 前端大全 昨天 (给前端大全加星标,提升前端技能) 编译:伯乐在线/Mr.Dcheng http://blog.jobbole.com/11467 ...

  7. python的强制转换(当出现 not supported between instances of 'str' and 'int' 的错误时)

    当我们编程时,有时会出现如下错误:TypeError: '>' not supported between instances of 'str' and 'int' 如下图: 这是因为input ...

  8. 解析ASP.NET WebForm和Mvc开发的区别 分类: ASP.NET 2013-12-29 01:59 11738人阅读 评论(5) 收藏

    因为以前主要是做WebFrom开发,对MVC开发并没有太深入的了解.自从来到创新工场的新团队后,用的技术都是自己以前没有接触过的,比如:MVC 和EF还有就是WCF,压力一直很大.在很多问题都是不清楚 ...

  9. Nginx配置访问权限

    基于IP配置Nginx的访问权限 Nginx配置通过两种途径支持基本访问权限的控制,其中一种是由HTTP标准模块ngx_http_access_module支持的,通过IP来判断客户端是否拥有对Ngi ...

  10. JAVA使用Gecco爬虫 抓取网页内容(附Demo)

    JAVA 爬虫工具有挺多的,但是Gecco是一个挺轻量方便的工具. 先上项目结构图. 这是一个 JAVASE的 MAVEN 项目,要添加包依赖,其他就四个文件.log4j.properties 加上三 ...