阅读准备

阅读本文前,请先通过下面两篇文章了解该缓存依赖的设计思路和程序实现。

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%左右。所以是否使用该依赖方案,请根据项目实际情况进行取舍。

下面是使用缓存依赖的测试代码。

    /// <summary>
    /// 创建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增加缓存依赖的性能测试相关推荐

  1. 为memcached增加缓存依赖的程序实现

    节前的一篇文章中提出了为memcached增加缓存依赖的初步设想,本文对第一个思路进行实现. 实现思路 key1发生变化时,不立即移除 key2,key3.在每次返回key2,key3对象时检查key ...

  2. Memcached对象缓存详解

    一.NoSQL概述 NoSQL数据存储不需要固定的表结构,通常也不存在连接操作.在大数据存取上具备关系型数据库无法比拟的性能优势.随着互联网web2.0网站的兴起,NoSQL数据库现在成了一个极其热门 ...

  3. 【状态保持】Cache 基于SQL 数据库 的缓存依赖 轮询机制详解

    首先声明一下如果您还不了解什么是Cache(缓存)请您先搜一下有关信息然后再看这篇文章. 当数据库中的信息发生变化的时候,应用程序能够获取变化的通知是缓存依赖得以实现的基础.应用程序可以通过两种途径获 ...

  4. SQL Server SqlCacheDependency 缓存依赖

     SQL server数据缓存依赖有两种实现模式,轮询模式,通知模式. 1  轮询模式实现步骤 此模式需要SQL SERVER 7.0/2000/2005版本以上版本都支持 主要包含以下几步:  1. ...

  5. 简单的Spring Memcached – Spring缓存抽象和Memcached

    在任何读取繁重的数据库应用程序中,缓存仍然是最基本的性能增强机制之一. Spring 3.1发行版提供了一个很酷的新功能,称为Cache Abstraction . Spring Cache Abst ...

  6. 第一节 Memcached分布式缓存入门

    关于Memcached的博文太多了,以下是个人学习的收集整理. 本节讨论问题: 简单介绍与应用 下载安装注意事项 简单测试 Memcached分布式原理 一.介绍与应用 在常规的WEB开发下,基本都会 ...

  7. ASP.NET使用Memcached高缓存实例(初级教程)

    http://www.itruanjian.com/a/itruanjian/datebase/nosql/2011/0927/5706.html Memcached是一个高性能的分布式内存对象缓存系 ...

  8. memcached搭建缓存系统

    概念 Memcached是danga.com(运营LiveJournal的技术团队)开发的一套分布式内存对象缓存系统,用于在动态系统中减少数据库负载,提升性能. 适用场合 分布式应用.由于memcac ...

  9. SQL server数据缓存依赖

    为什么80%的码农都做不了架构师?>>>    SQL server数据缓存依赖有两种实现模式,轮询模式,通知模式. 1  轮询模式实现步骤 此模式需要SQL SERVER 7.0/ ...

最新文章

  1. html diy文本几秒后关闭,利用HTML优化加快网页速度
  2. C#面向对象的三大特性
  3. mysql concat的使用
  4. Java面试之synchronized和Lock有什么区别?
  5. 多个Excel文件合并成一个文件
  6. mysql-8.0.26-winx64 的下载与安装教程
  7. 创新课程管理系统——测试心得
  8. C#生成Excel出现8000401a的错误的另一种解决办法。
  9. c#html转换pdf,[C#] 网页Html转PDF档(一行程式码解决)
  10. 智能开关双控实现方法(附电路图)
  11. PHOTOSHOP 小技巧
  12. Windows 免密码登录
  13. qq空间个人档html代码,QQ空间如何进行个人档管理?
  14. 云上PDF怎么删除页眉页脚_本科论文页眉与页脚怎么设置?
  15. 见信如晤::‘卷福’读信:我全心全意去拥抱您
  16. android系统自带分享图片到微信,通过intent和无障碍服务实现分享图片+文字到微信朋友圈...
  17. WinRAR 3.93 3.92 的注册码(已经测试)
  18. python绘制热图_python使用matplotlib绘制热图
  19. 微信小程序tabBar功能实现
  20. tcp_tw_reuse、tcp_tw_recycle和tcp_timestamps

热门文章

  1. docker image
  2. matplotlib.patches.Polygon
  3. vcenter server 许可证_朝阳互联网信息服务许可证ICP内资新办时间找杜经理
  4. 张一鸣批评的互联网“语言腐败”,危害到底有多大?
  5. Windows Server 2012远程刷新客户端组策略及IE代理设置图文教程
  6. Linux系统运维人员常用速查表
  7. tidb使用坑记录TiDB和Mysql的sql差异总结
  8. Java设计模式学习总结(1)——设计模式简介
  9. Docker学习总结(21)——Docke网络bridge详解
  10. java get提交中文乱码_java get方法提交中文乱码问题