记录一次读取memcache缓存的优化
我们是用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缓存的优化的更多相关文章
- 云计算openstack共享组件——Memcache 缓存系统
一.缓存系统 静态web页面: 1.工作流程: 在静态Web程序中,客户端使用Web浏览器(IE.FireFox等)经过网络(Network)连接到服务器上,使用HTTP协议发起一个请求(Reques ...
- 01-08-05【Nhibernate (版本3.3.1.4000) 出入江湖】NHibernate二级缓存:第三方MemCache缓存
一.准备工作 [1]根据操作系统(位数)选择下载相应版本的MemCache, MemCache的下载和安装,参看: http://www.cnblogs.com/easy5weikai/p/37606 ...
- 云计算openstack共享组件(2)——Memcache 缓存系统
一.缓存系统 在大型海量并发访问网站及openstack等集群中,对于关系型数据库,尤其是大型关系型数据库,如果对其进行每秒上万次的并发访问,并且每次访问都在一个有上亿条记录的数据表中查询某条记录时, ...
- MySQL缓存参数优化(转)
MySQL 数据库性能优化之缓存参数优化 数据库属于 IO 密集型的应用程序,其主要职责就是数据的管理及存储工作.而我们知道,从内存中读取一个数据库的时间是微秒级别,而从一块普通硬盘上读取一个IO是在 ...
- MySQL 数据库性能优化之缓存参数优化
在平时被问及最多的问题就是关于 MySQL 数据库性能优化方面的问题,所以最近打算写一个MySQL数据库性能优化方面的系列文章,希望对初中级 MySQL DBA 以及其他对 MySQL 性能优化感兴趣 ...
- memcache缓存系统
一.缓存系统 静态web页面: 1.在静态Web程序中,客户端使用Web浏览器(IE.FireFox等)经过网络(Network)连接到服务器上,使用HTTP协议发起一个请求(Request),告诉服 ...
- OpenStack共享组件-Memcache缓存系统
1. 缓存系统 1.1 静态web页面 1> 在静态Web程序中,客户端使用Web浏览器(IE.FireFox等)经过网络(Network)连接到服务器上,使用HTTP协议发起一个请求(Requ ...
- openstack共享组件--memcache缓存(2)
一.缓存系统 一.静态web页面: 1.在静态Web程序中,客户端使用Web浏览器(IE.FireFox等)经过网络(Network)连接到服务器上,使用HTTP协议发起一个请求(Request),告 ...
- 云计算共享组件--Memcache缓存系统(4)
一.缓存系统 一.静态web页面: 1.在静态Web程序中,客户端使用Web浏览器(IE.FireFox等)经过网络(Network)连接到服务器上,使用HTTP协议发起一个请求(Request),告 ...
随机推荐
- 我所理解的网络游戏<?>:战斗逻辑设计
客户端发送消息,统一在服务器端触发战斗 服务器端驱动战斗过程 客户端端接收用户输入向服务器发送消息 客户端接收服务器消息显示客户端表现 1. 服务器--客户端交互(战斗流程) 整战斗流程分为4个状 ...
- [5.19 线下活动]Docker Meetup杭州站—拥抱Kubernetes,容器深度实践
对本次线下活动感兴趣的朋友,欢迎点击此处报名,领取免费票. 今年3月,Docker刚刚过完5岁生日,五年期间,Docker也逐渐在技术和实践方面趋于成熟,更是在去年年底主动拥抱Kubernetes. ...
- Python廖雪峰学习笔记——单元测试
定义:对一个模块.一个类.一个函数进行进行正确性检验的测试性工作.当我们对函数或者模块等进行修改时,单元测试就显得尤为重要. 单元测试 = 测试用例(用来测试的数据)+测试模块
- 配置阿里yum源,设置命令
配置阿里yum源 #linux的软件包管理 安装 软件的方式有三种 .源代码编译安装() .下载python3的源代码 .解压缩源代码 .进入源代码目录,开始编译安装 .配置环境变量 .yum方式安装 ...
- 面向对象进阶-类的内置方法 __str__ 、__repr__、__len__、__del__、__call__(三)
# 内置的类方法 和 内置的函数之间有着千丝万缕的联系# 双下方法# obj.__str__ str(obj)# obj.__repr__ repr(obj) # def __str__(self): ...
- LOJ#3088. 「GXOI / GZOI2019」旧词(树剖+线段树)
题面 传送门 题解 先考虑\(k=1\)的情况,我们可以离线处理,从小到大对于每一个\(i\),令\(1\)到\(i\)的路径上每个节点权值增加\(1\),然后对于所有\(x=i\)的询问查一下\(y ...
- 频繁项集挖掘之Aprior和FPGrowth算法
频繁项集挖掘的应用多出现于购物篮分析,现介绍两种频繁项集的挖掘算法Aprior和FPGrowth,用以发现购物篮中出现频率较高的购物组合. 基础知识 项:“属性-值”对.比如啤酒2罐. 项集:项的集 ...
- php内核为变量的值分配内存的几个宏
在php5.3之前,为某变量分配内存是用宏 MAKE_STD_ZVAL; 737 #define MAKE_STD_ZVAL(zv) \ # /Zend/zend.h738 ALLOC_ZVAL(zv ...
- php判断是否使用手机访问
直接上代码 /** * 检测是否使用手机访问 * @access public * @return bool */ public function isMobile() { if (isset($_S ...
- js时间的应用(再看看前面,会发现不一样的)
1.年份(1970-) 获取 date.getFullYear(); 设置 date.setFullYear(2016); 2.月份(0-11) 0代表1月 获取 date.getMonth() 设置 ...