我们是用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. C# InDepth 第一章

    深入理解C#第一部分,第一章介绍了C#开发得进化史. 1 从数据类型定义引入c#1到4中得改变 c#2:强类型集合(泛型) c#3:自动实现得属性和简化得初始化 c#4:命名实参 2 排序和过滤 排序 ...

  2. oracle 游标简单案例

    oracle  游标简单案例 一.案例: DECLARE IDO NUMBER; DABH CHAR); t_count ); CURSOR TJ_CURSOR IS SELECT IDO,DABH ...

  3. 网易云首席安全架构师谈安全新形势:DDOS两三天,游戏玩家数从几万降到几百

    本文由  网易云发布. 安全是一个永恒的话题,在业务不断云化.攻击越来越复杂的当下,互联网安全呈现了出什么样的严峻形势?对这些形势,网易云又是如何应对的? 网易云首席安全架构师沈明星 4月13日,网易 ...

  4. 如何使用socket进行java网络编程(三)

    本篇文章继续记录java网络通讯编程的学习.在本系列笔记的第一篇中曾经记录过一个项目中的程序,当时还处于项目早期,还未进入与第三方公司的联调阶段,笔者只是用java写了一个client程序模拟了一下第 ...

  5. XCode - vmware虚拟机安装XCode进行iPhone真机调试

    1.vmware安装黑苹果,然后在appStore安装XCode http://blog.csdn.net/forgot2015/article/details/51104329 2.真机调试证书等申 ...

  6. Python 第三方包上传至 PyPI 服务器

    PyPI 服务器主要功能是?PyPI 服务器怎么搭建? PyPI 服务器可以用来管理自己开发的 Python 第三包. Pypi服务器搭建 Python 第三方包在本地打包 # 本地目录执行以下命令应 ...

  7. win10 下Oracle安装

    在win10 64bit下安装oracle 11的时候,有些问题不注意,安装的时候才遇到就gg了.下面将介绍win10下安装oracle 11的步骤以及安装过程中遇到的一些问题及解决方案. 安装过程中 ...

  8. php程序开销比较

    内存最快 文件次之 数据库最慢

  9. Hector 入门

    导入jar包 为了能够使用hector操作Cassandra数据库,首先导入hector的jar包,注意根据实际情况修改版本号 <dependency> <groupId>me ...

  10. webpack快速入门——配置文件:入口和出口,多入口、多出口配置

    1.在根目录新建一个webpack.config.js文件,然后开始配置: const path = require('path'); module.exports={ //入口文件的配置项 entr ...