sakko51150 发表于 2018-12-24 11:55:38

使用Memcached提高.NET应用程序的性能

  在应用程序运行的过程中总会有一些经常需要访问并且变化不频繁的数据,如果每次获取这些数据都需要从数据库或者外部文件系统中去读取,性能肯定会受到影响,所以通常的做法就是将这部分数据缓存起来,只要数据没有发生变化每次获取这些数据的时候直接从内存中区获取性能肯定会大大地提高。在.NET中提供了一个Cache类可以实现这些功能。在ASP.NET中可以通过HttpContext 对象的 Cache 属性或 Page 对象的 Cache 属性来获取这个类的实例。 在大部分情况下我们都可以使用Cache类来提高ASP.NET的性能,但是使用Cache类也有一些不足,比如我们不能指定Cache类所占用的内存的大小,此外在Cache中缓存的数据没有办法被另一台机器上的应用程序直接访问,因此在本文中提出另一种数据缓存方案,那就是使用分布式缓存。分布式缓存的特点是缓存的数据不必和应用程序在同一台机器上,从而大大增强了缓存数据的复用性。在本文介绍如何在.NET应用中使用Memcache作为分布式缓存。
Memcached介绍
Memcached 是以LiveJournal 旗下Danga Interactive 公司的Brad Fitzpatric 为首开发的一款软件。在通常的应用中我们都会将数据保存到数据库中,每次需要的时候都会从数据库去查询这些数据,如果应用程序的用户很多就会出现大量并发访问数据库的情况,这样就会增加应用程序的响应时间,使用Memcached就可以有效解决这个问题。memcached是高性能的分布式内存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。像大名鼎鼎的Facebook网站就使用了Memcached。周公稍后会提供Windows平台上32位和64位的Memcached程序。
为了提高性能,Memcached中的数据都保存在Memcached内置的存储空间中。因为当Memcached重启会导致其中的数据全部丢失,所以一般的方案是将数据保存在数据库中,每次请求数据的时候先查看在Memcached有没有缓存,如果有就直接从缓存中取出数据;如果没有,就从数据库中取出数据返回给应用程序并将请求的数据缓存到Memcached中,这样一来下次请求相同的数据就可以直接从Memcached中读取而不用再去查数据库了;一旦对数据有更新,同时更新数据库和Memcached。
Memcached是一个命令行窗口程序,可以在命令行窗口中启动也可以封装在系统服务中启动。在启动Memcached时需要提供一些必须的参数,指定Memcached运行时监听的端口和最大使用的内存大小等。如果缓存的数据大小超过指定内存,那么Memcached就会按照LRU(Least Recently Used)算法自动“删除”不使用的缓存(标记为失效),新增的缓存数据就可以使用这些标记为失效的数据所占用的内存,这样就不用担心Memcached超出所指定内存的问题。此外,为了提高性能,在缓存数据过期后Memcached并不是从物理内存中删除缓存的数据,仅仅在取出改数据的时候检查它是否已经过了有效期。
目前有多种平台的Memcached版本,比如Linux、FreeBSD、Solaris (memcached 1.2.5以上版本)、Mac OS X及Windows平台,在Windows平台上还有32位和64位版本。
Memcached有一套协议,利用这套协议可以对Memcached进行数据存取和查看Memcached的状态,很多程序语言都依据这套协议来操作Memcached,比如PHP、Java、C、C++及C#等。
获取了对应平台的Memcached版本就可以运行Memcached了。在这里仅以Windows平台上的32位Memcached为例。
运行Memcached:
memcached.exe -p 11121 -m 64
上面的命令是运行Memcached,指定它的监听端口是11121(这是它的默认端口,可以指定为其它大于1024的端口,因为小于1024的端口已经有了默认指定),最大使用内存为64m,如果启用了Windows防火墙,切记要在防火墙上打开这个端口。
在调试程序时可以使用下面的命令行来运行:
memcached.exe -p 11121 -m 64 -vv
这样就会看到如下的结果:
slab class   1: chunk size   88 perslab 11915
slab class   2: chunk size    112 perslab9362
slab class   3: chunk size    144 perslab7281
slab class   4: chunk size    184 perslab5698
slab class   5: chunk size    232 perslab4519
slab class   6: chunk size    296 perslab3542
slab class   7: chunk size    376 perslab2788
slab class   8: chunk size    472 perslab2221
slab class   9: chunk size    592 perslab1771
slab class10: chunk size    744 perslab1409
slab class11: chunk size    936 perslab1120
slab class12: chunk size   1176 perslab   891
slab class13: chunk size   1472 perslab   712
slab class14: chunk size   1840 perslab   569
slab class15: chunk size   2304 perslab   455
slab class16: chunk size   2880 perslab   364
slab class17: chunk size   3600 perslab   291
slab class18: chunk size   4504 perslab   232
slab class19: chunk size   5632 perslab   186
slab class20: chunk size   7040 perslab   148
slab class21: chunk size   8800 perslab   119
slab class22: chunk size11000 perslab    95
slab class23: chunk size13752 perslab    76
slab class24: chunk size17192 perslab    60
slab class25: chunk size21496 perslab    48
slab class26: chunk size26872 perslab    39
slab class27: chunk size33592 perslab    31
slab class28: chunk size41992 perslab    24
slab class29: chunk size52496 perslab    19
slab class30: chunk size65624 perslab    15
slab class31: chunk size82032 perslab    12
slab class32: chunk size 102544 perslab    10
slab class33: chunk size 128184 perslab   8
slab class34: chunk size 160232 perslab   6
slab class35: chunk size 200296 perslab   5
slab class36: chunk size 250376 perslab   4
slab class37: chunk size 312976 perslab   3
slab class38: chunk size 391224 perslab   2
slab class39: chunk size 489032 perslab   2
页: [1]
查看完整版本: 使用Memcached提高.NET应用程序的性能