缓存 - 使用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,所以我主要基于这个环境来描述。

  1. 下载:splinedancer上是window版本
  2. 安装为服务:memcached -d install,把memcached安装为服务
  3. 启动服务:memcached -d  start|stop|shutdown|restart
  4. 配置端口:memcached -p,默认端口为11211
  5. 配置内存容量: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

  1. 下载:Enyim
  2. 建立项目,引用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>
  3. 也可以通过工具MemCacheD Manager进行配置和管理
  4. 使用MemcachedClient
    MemcachedClient mc = new MemcachedClient();
    mc.FlushAll();
    // Flush the cache for this example
    mc.Store(StoreMode.Set, "key1" , object1);

     


 设计的缓存逻辑

  如果只是缓存单对象比较简单,直接在缓存中访问对象:

  1. 如果存在,则直接获取
  2. 如果不存在,则装载并缓存

  考虑到数据的有效性,对于列表缓存稍微复杂些:

  • 如果存在,获取集合,对集合中每个对象:
    • 对象是否在缓存中存在?
      • 存在,直接从缓存获取,更新集合对象
      • 不存在,从缓存中删除集合,进入下一步
  • 不存在,装载集合对象,并缓存集合中的每个对象

对于基于面向对象的应用和基于查询数据的应用,在C/S的客户端以及应用服务器和数据库见的服务端,其缓存机制和设计肯定有自己的方法,我上面的只是一个简单的思路,不知道有谁有这方面的经验,分享一下

资源

官方网站

FAQ

memcached Storage Engine for MySQL

memcachedb

Windows version of memcached

libevent

memcache二进制协议

 如何监控memcached

memcached for small project

How to Dramatically Speed Up Your Web Application: An Introduction to memcached

Memcached深度分析

Memcache的使用和协议分析详解

Using memcached: How to scale your website easily

memcached完全剖析–1. memcached的基础

memcached的分布式算法-Consistent Hashing

应用 memcached 提升站点性能

 

另:codeplex上haredCache.com也是一个分布式缓存服务器,不过我简单试过,感觉速度慢,可能我哪些参数调得不对,现暂不考虑

 

欢迎转载,转载请注明:转载自周金根 [ http://zhoujg.cnblogs.com/ ]

posted on 2009-12-17 23:03  周 金根  阅读(8078)  评论(7编辑  收藏  举报

导航