缓存 - 使用Memcached
最近在考虑OpenExpressApp中的缓存如何实现?目前的一个项目,是一个广域网应用,满足集团和一个子公司应用。由于产品是一个主要基于数据的应用,操作上仍旧需要类似C/S的操作,希望大数据量的操作,目前基于我在家测试的长城宽带(2M)可以满足应用,但是仍旧满足不了C/S观念的人,所以还是需要一些缓存的技术,否则很多操作仍旧需要访问服务器也的确不好。考虑到主要是基于两个公司使用,不是传统的Web广域网应用,所以会考虑在客户端也部署分布式缓存应用。
目前分布式缓存中,memcached相对来说比较成熟,所以花了半天看了一本memcached的书,进行了一些大概地了解,以便看看是否可以使用。由于只是初步了解,本篇我将对memcached进行简单的介绍,希望对不熟悉的人也有所帮助,同时也非常希望高人能够多多指教。
memcached是什么
memcached是一个高性能的分布式基于Name Value Pairs (NVPs) 的缓存系统,不处理数据持久和安全机制。它是一个开源的免费系统,容易部署安装,简单而又不缺强大。
它由两部分组成:server和client。memcached server做的就是通过一个Key(不能超过250个字符,采用object:key:type命名)值来存储和获取数据(1M)。缓存应用时可以部署多个服务器,每个服务器是自治的。client支持多种语言,目前已经存在很多语言的API。
安装 memcached Server
memcached适用于多平台和多语言,而我使用的环境是Window和.Net,所以我主要基于这个环境来描述。
- 下载:splinedancer上是window版本
- 安装为服务:memcached -d install,把memcached安装为服务
- 启动服务:memcached -d start|stop|shutdown|restart
- 配置端口:memcached -p,默认端口为11211
- 配置内存容量:memcached -m,默认端口为64M
memcached 1.2.0
-p <num> port number to listen on
-s <file> unix socket path to listen on (disables network support)
-l <ip_addr> interface to listen on, default is INDRR_ANY
-d run as a daemon
-r maximize core file limit
-u <username> assume identity of <username> (only when run as root)
-m <num> max memory to use for items in megabytes, default is 64 MB
-M return error on memory exhausted (rather than removing items)
-c <num> max simultaneous connections, default is 1024
-k lock down all paged memory
-v verbose (print errors/warnings while in event loop)
-vv very verbose (also print client commands/reponses)
-h print this help and exit
-i print memcached and libevent license
-b run a managed instanced (mnemonic: buckets)
-P <file> save PID in <file>, only used with -d option
-f <factor> chunk size growth factor, default 1.25
-n <bytes> minimum space allocated for key+value+flags, default 48
使用.Net client API
前面说个memcached支持多种语言的client API,每种语言也可能有多个不同版本,这里讲一下《Using Memached》书中介绍的一个在codeplex上发布的Enyim
- 下载:Enyim
- 建立项目,引用dll后,配置App.Config文件
<configuration>
<configsections>
<sectiongroup name="enyim.com">
<section name="memcached" type="Enyim.Caching.Configuration.MemcachedClientSection,Enyim.Caching"/>
</sectiongroup>
<enyim.com>
<memcached>
<servers>
<!-- put your own server(s) here-->
<add address="127.0.0.1" port="11211">
<add address="127.0.0.1" port="11212">
</servers>
<socketpool minpoolsize="10" maxpoolsize="100" connectiontimeout="00:10:00" deadtimeout="00:02:00"/>
</memcached>
</enyim.com>
</configsections>
</configuration> - 也可以通过工具MemCacheD Manager进行配置和管理
- 使用MemcachedClient
MemcachedClient mc = new MemcachedClient();
mc.FlushAll(); // Flush the cache for this example
mc.Store(StoreMode.Set, "key1" , object1);
设计的缓存逻辑
如果只是缓存单对象比较简单,直接在缓存中访问对象:
- 如果存在,则直接获取
- 如果不存在,则装载并缓存
考虑到数据的有效性,对于列表缓存稍微复杂些:
- 如果存在,获取集合,对集合中每个对象:
- 对象是否在缓存中存在?
- 存在,直接从缓存获取,更新集合对象
- 不存在,从缓存中删除集合,进入下一步
- 对象是否在缓存中存在?
- 不存在,装载集合对象,并缓存集合中的每个对象
对于基于面向对象的应用和基于查询数据的应用,在C/S的客户端以及应用服务器和数据库见的服务端,其缓存机制和设计肯定有自己的方法,我上面的只是一个简单的思路,不知道有谁有这方面的经验,分享一下
资源
memcached Storage Engine for MySQL
How to Dramatically Speed Up Your Web Application: An Introduction to memcached
Using memcached: How to scale your website easily
memcached的分布式算法-Consistent Hashing
另:codeplex上haredCache.com也是一个分布式缓存服务器,不过我简单试过,感觉速度慢,可能我哪些参数调得不对,现暂不考虑
欢迎转载,转载请注明:转载自周金根 [ http://zhoujg.cnblogs.com/ ]