为memcached增加缓存依赖的性能测试
阅读准备
阅读本文前,请先通过下面两篇文章了解该缓存依赖的设计思路和程序实现。
1、 为memcached增加缓存依赖的初步设想。
2、 为memcached增加缓存依赖的程序实现。
测试环境
环境:本机测试,memcached和站点都搭建在本地。 下面是我机器的配置。
工具:测试工具是WAS。使用介绍请参考之前写的这篇文章。
测试结果
一、未使用memcached
对一个空白的aspx页面进行测试。
运行时间 |
结果 |
2分钟 |
Run length: 00:02:00 Number of threads: 200 Requests per Second: 1906.39 |
5分钟 |
Run length: 00:05:00 Number of threads: 200 Requests per Second: 1860.21 |
二、使用memcached
(一)、正常使用memcached,一次创建一个key
运行时间 |
结果 |
2分钟 |
Run length: 00:02:00 Requests per Second: 651.16 Number of threads: 200 |
5分钟 |
Run length: 00:05:00 Requests per Second: 670.73 Number of threads: 200 |
(二)、使用缓存依赖
keyA: key1+六位随机数。
不依赖其他cache,创建的cache有:DATA_keyA和CTIME_keyA。
keyB:keyN+六位随机数[N>1]。
依赖于keyA,创建的cache有:DATA_keyB、CTIME_keyB、DEPEND_keyB和DEPCTIME_keyB。
1、创建keyA
运行时间 |
结果 |
2分钟 |
Run length: 00:02:00 Requests per Second: 505.45 Number of threads: 200 |
5分钟 |
Run length: 00:05:00 Requests per Second: 530.68 Number of threads: 200 |
2、keyA已经存在,创建keyB。 所有的keyB都依赖于同一个keyA。
运行时间 |
结果 |
2分钟 |
Run length: 00:02:00 Requests per Second: 290.03 Number of threads: 200 |
5分钟 |
Run length: 00:05:00 Requests per Second: 308.27 Number of threads: 200 |
3、创建keyA和一个keyB。
运行时间 |
结果 |
2分钟 |
Run length: 00:02:00 Requests per Second: 266.01 Number of threads: 200 |
5分钟 |
Run length: 00:05:00 Requests per Second: 275.95 Number of threads: 200 |
4、创建keyA和两个keyB。
运行时间 |
结果 |
2分钟 |
Run length: 00:02:00 Requests per Second: 188.12 Number of threads: 200 |
5分钟 |
Run length: 00:05:00 Requests per Second: 199.03 Number of threads: 200 |
通过测试数据来看,【651.16-670.73】VS 【505.45-530.68】 。使用缓存依赖后并发数会下降20%左右。所以是否使用该依赖方案,请根据项目实际情况进行取舍。
下面是使用缓存依赖的测试代码。
/// 创建keyA
/// </summary>
private void AddTest1()
{
CacheContext context = CacheContext.GetCacheService();
string key1 = RandomKey("key1");
string vaule1 = "我是" + key1;
context.AddObject(key1, vaule1);
}
/// <summary>
/// 使用前请先创建 key1
/// keyA已经存在,创建keyB。 所有的keyB都依赖于同一个keyA。
/// </summary>
private void AddTest2()
{
CacheContext context = CacheContext.GetCacheService();
string key2 = RandomKey("key2");
string value2 = "我是" + key2;
ICacheDependency dep = new MemCacheDependency("key1");
context.AddObject(key2, value2, dep);
}
/// <summary>
/// 创建keyA和一个keyB。
/// </summary>
private void AddTest3()
{
CacheContext context = CacheContext.GetCacheService();
string key1 = RandomKey("key1");
string key2 = RandomKey("key2");
string vaule1 = "我是" + key1;
string value2 = "我是" + key2;
context.AddObject(key1, vaule1);
ICacheDependency dep = new MemCacheDependency(key1);
context.AddObject(key2, value2, dep);
}
/// <summary>
/// 创建keyA和两个keyB。
/// </summary>
private void AddTest4()
{
CacheContext context = CacheContext.GetCacheService();
string key1 = RandomKey("key1");
string key2 = RandomKey("key2");
string key3 = RandomKey("key3");
string vaule1 = "我是" + key1;
string value2 = "我是" + key2;
string value3 = "我是" + key3;
context.AddObject(key1, vaule1);
string[] depkeys = { key1 };
context.AddObject(key2, value2, depkeys);
ICacheDependency dep = new MemCacheDependency(key1);
context.AddObject(key3, value3, dep);
}
/// <summary>
/// 生成随机key
/// </summary>
/// <param name="prefix"></param>
/// <returns></returns>
public string RandomKey(string prefix)
{
Random r = new Random();
string number = r.Next(999999).ToString();
string temp = "000000";
string item = temp + number;
item = item.Substring(item.Length - 6, 6);
return prefix + item;
}
补充说明
同生同灭
该依赖方案基于这样一个假设,姑且叫“同生同灭”特性:多份cache同时创建同时移除。
keyA对应DATA_keyA和CTIME_keyA。这两份cache同生同灭。
keyB对应DATA_keyB、CTIME_keyB、 DEPEND_keyB和DEPCTIME_keyB。这四份cache同生同灭。
memcached中的LRU
memcached会优先使用已超时的记录的空间,但即使如此,也会发生追加新记录时空间不足的情况,此时就要使用名为Least Recently Used(LRU)机制来分配空间。即删除“最近最少使用”的记录。因此,当memcached的内存空间不足时就从最近未被使用的记录中搜索,并将其空间分配给新的记录。
该依赖方案存在的问题
看出问题了吧:
1、如果内存空间不足,就会启动LRU(当然可以禁止LRU),这样就没法保证“同生同灭”了。
2、如果某份cache出现不可预见的异常,也可能没法保证“同生同灭”特性。
对于问题1来说可以禁止LRU或者保证足够用的内存。问题2目前没什么办法。
转载于:https://www.cnblogs.com/tenghoo/archive/2010/02/23/Memcached_key_Depend_Performance.html
为memcached增加缓存依赖的性能测试相关推荐
- 为memcached增加缓存依赖的程序实现
节前的一篇文章中提出了为memcached增加缓存依赖的初步设想,本文对第一个思路进行实现. 实现思路 key1发生变化时,不立即移除 key2,key3.在每次返回key2,key3对象时检查key ...
- Memcached对象缓存详解
一.NoSQL概述 NoSQL数据存储不需要固定的表结构,通常也不存在连接操作.在大数据存取上具备关系型数据库无法比拟的性能优势.随着互联网web2.0网站的兴起,NoSQL数据库现在成了一个极其热门 ...
- 【状态保持】Cache 基于SQL 数据库 的缓存依赖 轮询机制详解
首先声明一下如果您还不了解什么是Cache(缓存)请您先搜一下有关信息然后再看这篇文章. 当数据库中的信息发生变化的时候,应用程序能够获取变化的通知是缓存依赖得以实现的基础.应用程序可以通过两种途径获 ...
- SQL Server SqlCacheDependency 缓存依赖
SQL server数据缓存依赖有两种实现模式,轮询模式,通知模式. 1 轮询模式实现步骤 此模式需要SQL SERVER 7.0/2000/2005版本以上版本都支持 主要包含以下几步: 1. ...
- 简单的Spring Memcached – Spring缓存抽象和Memcached
在任何读取繁重的数据库应用程序中,缓存仍然是最基本的性能增强机制之一. Spring 3.1发行版提供了一个很酷的新功能,称为Cache Abstraction . Spring Cache Abst ...
- 第一节 Memcached分布式缓存入门
关于Memcached的博文太多了,以下是个人学习的收集整理. 本节讨论问题: 简单介绍与应用 下载安装注意事项 简单测试 Memcached分布式原理 一.介绍与应用 在常规的WEB开发下,基本都会 ...
- ASP.NET使用Memcached高缓存实例(初级教程)
http://www.itruanjian.com/a/itruanjian/datebase/nosql/2011/0927/5706.html Memcached是一个高性能的分布式内存对象缓存系 ...
- memcached搭建缓存系统
概念 Memcached是danga.com(运营LiveJournal的技术团队)开发的一套分布式内存对象缓存系统,用于在动态系统中减少数据库负载,提升性能. 适用场合 分布式应用.由于memcac ...
- SQL server数据缓存依赖
为什么80%的码农都做不了架构师?>>> SQL server数据缓存依赖有两种实现模式,轮询模式,通知模式. 1 轮询模式实现步骤 此模式需要SQL SERVER 7.0/ ...
最新文章
- html diy文本几秒后关闭,利用HTML优化加快网页速度
- C#面向对象的三大特性
- mysql concat的使用
- Java面试之synchronized和Lock有什么区别?
- 多个Excel文件合并成一个文件
- mysql-8.0.26-winx64 的下载与安装教程
- 创新课程管理系统——测试心得
- C#生成Excel出现8000401a的错误的另一种解决办法。
- c#html转换pdf,[C#] 网页Html转PDF档(一行程式码解决)
- 智能开关双控实现方法(附电路图)
- PHOTOSHOP 小技巧
- Windows 免密码登录
- qq空间个人档html代码,QQ空间如何进行个人档管理?
- 云上PDF怎么删除页眉页脚_本科论文页眉与页脚怎么设置?
- 见信如晤::‘卷福’读信:我全心全意去拥抱您
- android系统自带分享图片到微信,通过intent和无障碍服务实现分享图片+文字到微信朋友圈...
- WinRAR 3.93 3.92 的注册码(已经测试)
- python绘制热图_python使用matplotlib绘制热图
- 微信小程序tabBar功能实现
- tcp_tw_reuse、tcp_tw_recycle和tcp_timestamps
热门文章
- docker image
- matplotlib.patches.Polygon
- vcenter server 许可证_朝阳互联网信息服务许可证ICP内资新办时间找杜经理
- 张一鸣批评的互联网“语言腐败”,危害到底有多大?
- Windows Server 2012远程刷新客户端组策略及IE代理设置图文教程
- Linux系统运维人员常用速查表
- tidb使用坑记录TiDB和Mysql的sql差异总结
- Java设计模式学习总结(1)——设计模式简介
- Docker学习总结(21)——Docke网络bridge详解
- java get提交中文乱码_java get方法提交中文乱码问题