一存储命令存储命令的格式 ? <command name> <key> <flags> <exptime> <bytes> <data block> 参数说明如下 <command name> set/add/replace <key> 查找关键字 <flags> 客户机使用它存储关于键值对的额外信息 <exptime> 该数据的存活时间表示永远 <bytes> 存储字节数 <data block> 存储的数据块(可直接理解为keyvalue结构中的value) 添加()无论如何都存储的set 这个set的命令在memcached中的使用频率极高set命令不但可以简单添加如果set的key已经存在该命令可以更新该key所对应的原来的数据也就是实现更新的作用 可以通过“get 键名”的方式查看添加进去的记录 如你所知我们也可以通过delete命令删除掉然后重新添加 ()只有数据不存在时进行添加的add ()只有数据存在时进行替换的replace 删除可以看到删除已存在的键值和不存在的记录可以返回不同的结果 二读取命令getget命令的key可以表示一个或者多个键键之间以空格隔开 gets可以看到gets命令比普通的get命令多返回了一个数字(上图中为)这个数字可以检查数据是否发生改变当key对应的数据改变时这个多返回的数字也会改变 cascas即checked and set的意思只有当最后一个参数和gets所获取的参数匹配时才能存储否则返回“EXISTS” 三状态命令statsstats items 执行stats items可以看到STAT items行如果memcached存储内容很多那么这里也会列出很多的STAT items行
stats cachedump slab_id limit_num我们执行stats cachedump 命令效果如下 这里slab_id为是由中的stats items返回的结果(STAT items后面的数字)决定的limit_num看起来好像是返回多少条记录猜的一点不错 不过表示显示出所有记录而n(n>)就表示显示n条记录如果n超过该slab下的所有记录则结果和返回的结果一致 通过stats itemsstats cachedump slab_id limit_num配合get命令可以遍历memcached的记录
其他stats命令如stats slabsstats sizesstats reset等等使用也比较常见 四其他常见命令append在现有的缓存数据后添加缓存数据如现有缓存的key不存在服务器响应为NOT_STORED prepend和append非常类似但它的作用是在现有的缓存数据前添加缓存数据 flush_all该命令有一个可选的数字参数它总是执行成功服务器会发送 “OKrn” 回应它的效果是使已经存在的项目立即失效(缺省)或在指定的时间后此后执行取回命令将不会有任何内容返回(除非重新存储同样的键名) flush_all 实际上没有立即释放项目所占用的内存而是在随后陆续有新的项目被储存时执行(这是由memcached的懒惰检测和删除机制决定的) flush_all 效果是它导致所有更新时间早于 flush_all 所设定时间的项目在被执行取回命令时命令被忽略 其他命令memcached还有很多命令比如对于存储为数字型的可以通过incr/decr命令进行增减操作等等这里只列出开发和运维中经常使用的命令其他的不再一一举例说明 补充一则简单认识net framework中的几种缓存web站点中缓存的重要性毋庸置疑我想很多aspnet开发人员在开发web应用系统的时候优先考虑使用的缓存并不是第三方缓存解决方案(比如 分布式缓存memcachedredis等等)而应该是net framework已经提供的多种缓存解决方案下面结合自己的开发经验谈谈对net framework中缓存的认识 SystemWebCachingCache 估计大部分做过aspnet开发的人都用过这个命名空间下的缓存我们可以直接使用HttpContextCurrentCache实例而不 用实例化当然这个命名空间下的Cache类是允许您实例化的需要定制自己的缓存系统的当然可以完全自己控制如何初始化这个类我在园子里看到过有很多 文章介绍Cache的CRUD辅助类库大多数都是针对SystemWebCachingCache 需要说明的是我们还可以通过该命名空间下的HttpRuntimeCache实现web控制台winform等不同表现形式下的缓存而且 完全无需自己实例化HttpRuntimeCache是之前个人开发中使用比较多的一个类现在比较偏爱net framework中的增强型的缓存类MemoryCache Output Cache 众所周知输出缓存主要分页面输出缓存和页面部分缓存说白了就是缓存整个页面的html或者部分html本来没什么值得讨论的但是最近看到dudu的这篇博客才恍然发现想不到使用它还真是大有讲究我以前怎么就没有发现这个问题呢?看来发现问题和解决问题的能力同样重要有时候前者甚至更重要啊 SystemRuntimeCaching 现在个人开发中使用最多的类MemoryCache出自这个命名空间使用前需要引用using SystemRuntimeCachingMemoryCache继承自ObjectCache IEnumerable IDisposable其中ObjectCache是个抽象类用过MemoryCache的人都知道这个MemoryCache有一个属性叫 Default通常可以像下面这样使用 private static ObjectCache memCache = MemoryCacheDefault; 当然我们也完全可以通过public MemoryCache(string name NameValueCollection config = null)构造函数初始化缓存对象 接着我们可以在webconfig文件中配置每个MemoryCache实例运行的内存使用配额方案和配额检查周期下面示例参考MSDN <systemruntimecaching> <memoryCache> <namedCaches> <add name="Default" cacheMemoryLimitMegabytes="" pollingInterval="::"/> </namedCaches> </memoryCache> </systemruntimecaching> 这些配置意义在于可以明确指定每个MemoryCache实例运行的内存使用配额方案和配额检查周期比如我们可以通过配置来按需更改 MemoryCacheDefault实例的内存配额(不知道缓存可用最大内存是多少可能还是传说中的M左右)缓存过期策略与其它的缓存框架 大同小异与SystemWebCachingCache的不同只是名称不叫CacheDependency而叫ChangeMonitor并且提供了基于文件和目录的缓存依赖策略关于缓存过期策略也比较有探讨的必要不过个人开发中比较偏重于数据缓存和替换目前还没有接触和使用过比较完美的过期策略解决方案 |