.Net下的分布式缓存(2)--实现分布式缓存同步的手段

  前不久,俺写了篇文章谈到了.Net下面的分布式缓存的一些问题,并结合DNT里面实现模式发表了一些自己的看法,近来通过学习相关的东西又有了一些新的体会, 写在这里作为分布式缓存列系文章的第二部分.

  其实对于性的扩展无非是Scale Up(向上扩展)或者是Scale Out(向外扩展), 微软对此的看法是一个App的缓存最好是以它自己为物理边界进行读写,而不要放到别处去,这样带的问题可能有对象的序列化传送,反序列化,网络连接开销,跨进程的开销,对于高性能的站点来说都是不能忽视的问题.出于对这些因素的考虑微推荐的作法不是把多个应用放在一起在多台Server布署,而是将一个App划分成若干个小的应用布署到不同的服务器,下面的关系图展示了这种关系, 这样每种应用就可以独立管理自己的缓存数据,但是对于象用户数据这样的通用数据仍然会存在多处.

两种解决方案

  为了解决缓存同步的问题,有人想出了解决办法, 可以参考这两个地方,这个是MS的,这里还有一个,先来看看Peter的这个吧, 主要思想就是把要放到缓存里面的东西加上一层包装CacheControlItem, 实现代码请去原文出处下载.

  每台机器都维护一个WebFarm里面的成员服务器的列表,如果有新的服务器进来发现自己不在这个列表中则会通知其它的服务器把它加到这个名单里面。添加缓存的这程是这样, A服务器需要插入一个新的缓存值,它把这个项目插入到自己的缓存中,然后用它初始化一个CacheControlItem并指定它的缓存策略(优先级,缓存生存时间),设定它的动作,即添加,然后把这个结象序列化通过Web传送到每一个成员服务器,接受到这些数据的服务器跟据这个对象的Action指令,把反序列化后的对象加入到自己的缓存里面,这样一个同步的过程就完成了,移除缓存对象的过程与之类似,只不过不需要传送对象,只在包装类里面设定它的Action为删除就可以了. 当然,为了提高性能,可以实现一个异步的侦听线程专门用来响应缓存通知的请求. 总体上讲这处办法的效率比较低,在数据量较大的情况下可能会造成大量缓存数据的同步数据流。

  我们再来看看M$是怎么做的,它的想法类似,只不过它不在WebFarm的成员服务器之间同步缓存,而只是保证每台机器不要读到已经失效的缓存数据,当缓存数据失效时(相关依赖数据被更新), 通过维护一个需要通知的服务器列表依次调用每台服务器上的WebService,如果当前服务器上存在这键值的缓存则使它失效.

  这两个老外写的东西似乎都比较索,不过对初学者来说比较友好,可以一步步地知道这件事情的来龙去脉,理解会清楚更刻一些。

Memcached到底有多快?

  看了这些如果还不满意,那么您可以试试Memcached它可以运行在Win32平台下,在上篇文章中我们已经提到了这个东西,但是它在.Net的平台下面究竟表现如何?是否能象在PHP平台下面一样地优秀,我们现在来做一个简单的测试, 对比使用.Net自带的Cache和Memcached两种实现方式,看看差距究竟有多大,过程是这样,分别生成10000个字符串对象并分别设定键值插入到缓存中,然后再取出来,看看花费的总时间. 服务器端:memcached-1.2.1-win32, 客户端: memcacheddotnet_clientlib-1.1.5, 服务器端的使用也比较简单,解压文件之后在命令行下面输入: c:\memcached -d install 先安装服务, 接着 c:\memcached -d start就可以了,详细使用方法见说明文件 -h 是查看帮助, 测试环境如下:

  Memcached服务器 : Win2003 sp1, Framework 2.0,P4 D 3.4G, 768MB 内存, 千兆网卡.

  Memcached客户机 : Win2003 sp1, Framework 2.0,T2060, 1G内存( 沙加的神舟笔记本;) ), 千兆网卡.

  两台机器通过直连线相连.

  .Net Cache单机测试 : P4 D 3.4G, 768MB 内存.

  测试结果, 存取10000个条目的时间:

Memcached

Set(秒) 1.48 1.37 1.48 1.37 1.46 Get(秒) 2.42 2.42 2.42 2.43 2.42

HttpRuntime.Cache

Set(秒) 0.015 0.015 0.015 0.015 0.015 Get(秒)

  0.015 0.015 0.015 0.015 0.015 .Net内建缓存测试代码HttpRuntime.Cache

    protected void 
Page_Load(object sender, EventArgs e)

    {

            int start = 200;

            int runs = 10000;

string keyBase = "testKey";

            string obj = "This is a test of an object blah blah es, serialization does not seem to slow things down so much.  The gzip compression is horrible horrible performance, so we only use it for very large objects.  I have not done any heavy benchmarking recently";

long begin = DateTime.Now.Ticks;

            for(int i = start; i < start+runs; i++) 

            {

                HttpRuntime.Cache.Add(keyBase + i, obj,null,System.Web.Caching.Cache.NoAbsoluteExpiration,

                    TimeSpan.FromMinutes(1),System.Web.Caching.CacheItemPriority.Normal,null);

            }

            long end = DateTime.Now.Ticks;

            long time = end - begin;

Response.Write(runs + " sets: " + new TimeSpan(time).ToString() + "ms<br />");

begin = DateTime.Now.Ticks;

            int hits = 0;

            int misses = 0;

            for(int i = start; i < start+runs; i++) 

            {

                string str = (string) HttpRuntime.Cache.Get(keyBase + i);

                if(str != null)

                    ++hits;

                else

                    ++misses;

            }

            end = DateTime.Now.Ticks;

            time = end - begin;

Response.Write(runs + " gets: " + new TimeSpan(time).ToString() + "ms");

    }Memcached测试代码Memcached

namespace Memcached.MemcachedBench

{

    using System;

    using System.Collections;

using Memcached.ClientLibrary;

public class MemcachedBench 

    {

        [STAThread]

        public static void Main(String[] args) 

        {

            int runs = 100;

            int start = 200;

            if(args.Length > 1)

            {

                runs = int.Parse(args[0]);

                start = int.Parse(args[1]);

            }

string[] serverlist = { "140.192.34.72:11211", "140.192.34.73:11211" };

// initialize the pool for memcache servers

            SockIOPool pool = SockIOPool.GetInstance();

            pool.SetServers(serverlist);

pool.InitConnections = 3;

            pool.MinConnections = 3;

            pool.MaxConnections = 5;

pool.SocketConnectTimeout = 1000;

            pool.SocketTimeout = 3000;

pool.MaintenanceSleep = 30;

            pool.Failover = true;

pool.Nagle = false;

            pool.Initialize();

MemcachedClient mc = new MemcachedClient();

            mc.EnableCompression = false;

string keyBase = "testKey";

            string obj = "This is a test of an object blah blah es, serialization does not seem to slow things down so much.  The gzip compression is horrible horrible performance, so we only use it for very large objects.  I have not done any heavy benchmarking recently";

long begin = DateTime.Now.Ticks;

            for(int i = start; i < start+runs; i++) 

            {

                mc.Set(keyBase + i, obj);

            }

            long end = DateTime.Now.Ticks;

            long time = end - begin;

Console.WriteLine(runs + " sets: " + new TimeSpan(time).ToString() + "ms");

begin = DateTime.Now.Ticks;

            int hits = 0;

            int misses = 0;

            for(int i = start; i < start+runs; i++) 

            {

                string str = (string) mc.Get(keyBase + i);

                if(str != null)

                    ++hits;

                else

                    ++misses;

            }

            end = DateTime.Now.Ticks;

            time = end - begin;

Console.WriteLine(runs + " gets: " + new TimeSpan(time).ToString() + "ms");

            Console.WriteLine("Cache hits: " + hits.ToString());

            Console.WriteLine("Cache misses: " + misses.ToString());

IDictionary stats = mc.Stats();

            foreach(string key1 in stats.Keys)

            {

                Console.WriteLine(key1);

                Hashtable values =

时间: 2024-10-22 16:25:47

.Net下的分布式缓存(2)--实现分布式缓存同步的手段的相关文章

一起谈.NET技术,.Net下的分布式缓存(2)--实现分布式缓存同步的手段

前不久,俺写了篇文章谈到了.Net下面的分布式缓存的一些问题,并结合DNT里面实现模式发表了一些自己的看法,近来通过学习相关的东西又有了一些新的体会, 写在这里作为分布式缓存列系文章的第二部分. 其实对于性的扩展无非是Scale Up(向上扩展)或者是Scale Out(向外扩展), 微软对此的看法是一个App的缓存最好是以它自己为物理边界进行读写,而不要放到别处去,这样带的问题可能有对象的序列化传送,反序列化,网络连接开销,跨进程的开销,对于高性能的站点来说都是不能忽视的问题.出于对这些因素的

缓存应用--Memcached分布式缓存简介

 一.   什么是Memcached Memcached 是一个高性能的分布式内存 对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象 来减少读取数据库的次数,从而提供动态.数据库驱动网站的速度. 相信很多人都用过缓存,在 .net 中也有内置的缓存机制,还有很多第三方工具如apache,nginx等可以做静态资源的缓存,同时我们也可 以制定自己的缓存机制,缓存数据库查询的数据以减少对数据库的频繁操作.但是很多时候我们总是感觉这些缓存总不尽人意, Memcached可

请大神,白话的说下分布式算法究竟是个什么东西,分布式相对于非分布式有什么优点

问题描述 请大神,白话的说下分布式算法究竟是个什么东西,分布式相对于非分布式有什么优点 在对paxos算法和一致性hash算法了解后,还是觉得没有get到分布式算法的这个点,所以请大神给我白话的说下,谢谢啦! 解决方案 分布式算法就是同时利用多个计算机(这里说的计算机是指有独立操作系统运行相对独立的计算机)利用多个计算机并行计算提高运算速度.分布式算法的难度在于减少节点之间的通讯开销和同步开销,并且找到并行化的算法.

centos 7下Hadoop 2.7.2 伪分布式安装

centos 7 下Hadoop 2.7.2 伪分布式安装,安装jdk,免密匙登录,配置mapreduce,配置YARN.详细步骤如下: 1.0 安装JDK 1.1 查看是否安装了openjdk [lei@bogon ~]$ java -version openjdk version "1.8.0_65" OpenJDK Runtime Environment (build 1.8.0_65-b17) OpenJDK 64-Bit Server VM (build 25.65-b01,

在Linux系统下建立基于MPICH2的高性能分布式并行计算环境

MPICH2 提供了在现有的软硬件架构下对大数据进行并行.分布式处理的一个平台.本文将介绍如何在 Linux 系统下建立基于 MPICH2 的高性能分布式并行计算环境. MPI(Message Passing Interface)是由 MPI 委员会制定的一个消息传递标准,其中定义了一系列用于分布式环境中进行进程间通信的编程接口,目前有 MPI-1 和 MPI-2 两个版本.MPICH2 就是对 MPI 的一个具体实现,MPICH2 在保证高性能的同时保持了高度的可移植性,支持包括 AIX.Li

缓存应用--Memcached分布式缓存简介(二)

1 命令行查看状态   很多时候我们需要去查看Memcached 的使用状态,比如Memcached 的运行时间,使用状态等等.在Windows系统中我们可以使用telnet 命令来查看Memcached 的相关运行情况.   开始->运行àcmd 运行得到如下:   输入telnet命令: telnet 服务地址 端口    Memcached 的默认端口号是11211      输入stats 命令: 在这里屏幕是空白,看不到输入的内容,回车之后可以看到Memcached的运行相关信息. 

云时代的分布式数据库:阿里分布式数据库服务DRDS

摘要:伴随着系统性能.成本及扩展性的新时代需要,以HBase.MongoDB为代表的NoSQL数据库和以阿里DRDS.VoltDB.ScaleBase为代表的分布式NewSQL数据库如雨后春笋般不断涌现出来.本文详细介绍了阿里分布式数据库服务DRDS. 随着互联网时代的到来,计算机要管理的数据量呈指数级别地飞速上涨,而我们却完全无法对用户数做出准确预估.我们的系统所需要支持的用户数,很可能在短短的一个月内突然爆发式地增长几千倍,数据也很可能快速地从原来的几百GB飞速上涨到了几百个TB.如果在这爆

云时代的分布式数据库:阿里分布式数据库服务 DRDS

随着互联网时代的到来,计算机要管理的数据量呈指数级别地飞速上涨,而我们却完全无法对用户数做出准确预估.我们的系统所需要支持的用户数,很可能在短短 的一个月内突然爆发式地增长几千倍,数据也很可能快速地从原来的几百GB飞速上涨到了几百个TB.如果在这爆发的关键时刻,系统不稳定或无法访问,那么对 于业务将会是毁灭性的打击. 伴随着这种对于系统性能.成本以及扩展性的新需要,以HBase.MongoDB为代表的NoSQL数据库和以阿里DRDS.VoltDB.ScaleBase为代表的分布式NewSQL数据

分布式系统-web开发分为分布式开发和非分布式开发,这个怎么区别,来个精品答案

问题描述 web开发分为分布式开发和非分布式开发,这个怎么区别,来个精品答案 分布式和非分布式怎么区别 ,java中有哪些著名的分布式系统,和非分布式系统,举例说明 解决方案 很简单,如果你只有一个服务器,那就不是分布式,否则就是分布式.位什么要分布式?因为单一的服务器的性能不可能无限的增长,比如处理器,如果你要比目前的处理器快100倍的,那有钱也买不到. 但是性能的需求是无止境的,比如12306,需要几百万人同时使用,只能通过增加服务器的办法提高性能了.此时就要用分布式. 解决方案二: 分布式