我们是用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. 实现单台测试机6万websocket长连接

    本文由作者郑银燕授权网易云社区发布. 本文是我在测试过程中的记录,实现了单台测试机发起最大的websocket长连接数.在一台测试机上,连接到一个远程服务时的本地端口是有限的.根据TCP/IP协议,由 ...

  2. SSM集成Easyui框架及多模块开发的认识

    首先我们需要建立好一个emaven项目,并且在pom.xml中导入响应的jar包, <?xml version="1.0" encoding="UTF-8" ...

  3. oh-my-zsh 安装及使用

    什么是 oh-my-zsh oh-my-zsh 是基于 zsh 的功能做了一个扩展,方便的插件管理.主题自定义,以及漂亮的自动完成效果. oh-my-zsh 安装及插件安装 查看系统中 zsh 及版本 ...

  4. javascript中的数据类型和变量

    Number JavaScript不区分整数和浮点数,统一用Number表示,以下都是合法的Number类型: 123; // 整数123 0.456; // 浮点数0.456 1.2345e3; / ...

  5. 双向链表的实现——java

    实现类: /** * Java 实现的双向链表. * 注:java自带的集合包中有实现双向链表,路径是:java.util.LinkedList * * @author skywang * @date ...

  6. thinkphp5的mkdir() Permission denied问题

    最近一直在用tp5写项目,在此遇到的问题也比较多.今天来谈谈“mkdir() Permission denied”错误. 你如果不仅仅写代码,还得部署到线上,那么这个tp5的这个错误,你有很大概率会遇 ...

  7. Java并发工具类之CountDownLatch

    CountDownLatch允许一个或则多个线程等待其他线程完成操作. 假如我们有这样的需求:我们需要解析一个excel文件中的多个sheet,我们可以考虑使用多线程,每一个线程解析excel中的一个 ...

  8. sublime text 内调试Javascript代码

    转自:sublime内调试Javascript代码 之前用webstorm, 可以直接调试js, 在浏览器中也可以调试js,最近换了sublime text, 在想它是否支持调试js代码,于是找到了这 ...

  9. jmeter测试计划配置

    用户定义的变量: 测试计划上可以添加用户定义的变量.一般添加一些系统常用的配置.如果测试过程中想切换环境,切换配置,一般不建议在测试计划上添加变量,因为不方便启用和禁用,一般是直接添加用户自定义变量组 ...

  10. 1. Python中如何使用其他语言?(python的胶水作用,python又叫胶水语言)

    1. python中如何插入C语言运行? (1)编写C语言代码: #include<stdio.h> void CFun() { printf("---------我是c语言:- ...