转自:
http://zc0604.iteye.com/blog/1825360
http://www.cnblogs.com/jeffwongishandsome/archive/2011/11/06/2238265.html
memcached 是一个高效的分布式的内存对象缓存系统 ,他可以支持把各种数据(数组,对象,基本数据类型,资源除外)放入到它管理的内存中。它采用c/s结构,使用简单文本通讯并 基于libevent处理并发,将数据存入内存的缓存工具,它是基于 基于客户端的分布式,服务器端本身并不是分布式的。
Memcache(Memcached)是集群环境下的缓存解决方案。 它是danga.com的一个项目,最早是为 LiveJournal 服务的,目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力。它可以应对任意多个连接,使用非阻塞的网络IO。它的工作机制是在内存中开辟一块空间,然后建立一个HashTable,Memcached自管理这些HashTable。
win32系统下的安装步骤:
①下载memcached软件
②解压 其中有一个memcached.exe文件
③安装memcached –d install [卸载使用 memcached -d uninstall]
④启动 memcached 服务
(1)直接通过界面启动该服务
(2)在控制台下启动 memcached –d start [命令一览表]
⑤查看memcached 服务是否启动成功! 默认端口11211 通过netstat -anb命令可以查看
memcached的基本命令(安装、卸载、启动、配置相关):
-p 监听的端口
-l 连接的IP地址, 默认是本机
-d start 启动memcached服务
-d restart 重起memcached服务
-d stop|shutdown 关闭正在运行的memcached服务
-d install 安装memcached服务
-d uninstall 卸载memcached服务
-u 以的身份运行 (仅在以root运行的时候有效)
-m 最大内存使用,单位MB。默认64MB
-M 内存耗尽时返回错误,而不是删除项
-c 最大同时连接数,默认是1024
-f 块大小增长因子,默认是1.25
-n 最小分配空间,key+value+flags默认是48
-h 显示帮助
注意:win7下的通过控制台安装必须 启用管理员权限启动命令行窗口才可以运行命令。
使用方法一:
telnet的使用(win7下 默认情况telnet没有开启,需要在控制面板-->程序和功能,中通过打开或关闭功能,开题telnet即可开启telnet)
telnet://ip 11211即可对memcache进行远程操作。
使用方法二:
通过java客户端api的方式。
采用了spymemcached 下载地址:http://spymemcached.googlecode.com/ 它依赖 spy.jar,spy.jar的下载地址:http://bleu.west.spy.net/~dustin/repo/spy/jars/spy-2.4.jar
- public class MemcacheTest {
- public static void main(String[] args) {
- MemcachedClient client=null;
- try {
- client = new MemcachedClient(new InetSocketAddress("localhost",11211));
- } catch (IOException e) {
- System.out.println(e.getMessage());
- }
- client.add("name", 60, "小明");
- GetFuture<Object> name=client.asyncGet("name");
- //这里是异步操作,如果出现了 服务器端超时,则可以抛出异常,否则会阻塞
- try {
- System.out.println(name.get(5, TimeUnit.SECONDS));
- } catch (InterruptedException e) {
- System.out.println(e.getMessage());
- } catch (TimeoutException e) {
- System.out.println(e.getMessage());
- } catch (ExecutionException e) {
- System.out.println(e.getMessage());
- }
- client.shutdown();
- }
- }
memcached的基本命令(当memcached 启动后用于对memcached管理的数据和本身运行状态相关的命令):
Command | Description | Example |
get | Reads a value | get mykey |
set | Set a key unconditionally | set mykey 0 60 5 |
add | Add a new key | add newkey 0 60 5 |
replace | Overwrite existing key | replace key 0 60 5 |
append | Append data to existing key | append key 0 60 15 |
prepend | Prepend data to existing key | prepend key 0 60 15 |
incr | Increments numerical key value by given number | incr mykey 2 |
decr | Decrements numerical key value by given number | decr mykey 5 |
delete | Deletes an existing key | delete mykey |
flush_all | Invalidate specific items immediately | flush_all |
flush_all 900 | Invalidate all items in n seconds | |
stats | Prints general statistics | stats |
stats slabs | Prints memory statistics | |
stats malloc | Prints memory statistics | |
stats items | Print higher level allocation statistics | |
stats detail |
| |
stats sizes |
| |
stats reset | Resets statistics | |
version | Prints server version. | version |
verbosity | Increases log level | verbosity |
quit | Terminate telnet session | quit |
- memcached.rar (34.1 KB)
- 下载次数: 26
- memcached-2.3.1.jar (470.1 KB)
- 下载次数: 33
- spymemcached-2.8.4-javadocs.jar (951.5 KB)
- 下载次数: 21
- spymemcached-2.8.4.jar (391.6 KB)
- 下载次数: 24
PS:
Memcached常用命令及使用说明
一、存储命令
存储命令的格式:
1
2
|
<command name> <key> <flags> <exptime> <bytes>
<data block>
|
参数说明如下:
<command name> | set/add/replace |
<key> | 查找关键字 |
<flags> | 客户机使用它存储关于键值对的额外信息 |
<exptime> | 该数据的存活时间,0表示永远 |
<bytes> | 存储字节数 |
<data block> | 存储的数据块(可直接理解为key-value结构中的value) |
1、添加
(1)、无论如何都存储的set
这个set的命令在memcached中的使用频率极高。set命令不但可以简单添加,如果set的key已经存在,该命令可以更新该key所对应的原来的数据,也就是实现更新的作用。
可以通过“get 键名”的方式查看添加进去的记录:
如你所知,我们也可以通过delete命令删除掉,然后重新添加。
(2)、只有数据不存在时进行添加的add
(3)、只有数据存在时进行替换的replace
2、删除
可以看到,删除已存在的键值和不存在的记录可以返回不同的结果。
二、读取命令
1、get
get命令的key可以表示一个或者多个键,键之间以空格隔开
2、gets
可以看到,gets命令比普通的get命令多返回了一个数字(上图中为13)。这个数字可以检查数据是否发生改变。当key对应的数据改变时,这个多返回的数字也会改变。
3、cas
cas即checked and set的意思,只有当最后一个参数和gets所获取的参数匹配时才能存储,否则返回“EXISTS”。
三、状态命令
1、stats
2、stats items
执行stats items,可以看到STAT items行,如果memcached存储内容很多,那么这里也会列出很多的STAT items行。
3、stats cachedump slab_id limit_num
我们执行stats cachedump 1 0 命令效果如下:
这里slab_id为1,是由2中的stats items返回的结果(STAT items后面的数字)决定的;limit_num看起来好像是返回多少条记录,猜的一点不错, 不过0表示显示出所有记录,而n(n>0)就表示显示n条记录,如果n超过该slab下的所有记录,则结果和0返回的结果一致。
通过stats items、stats cachedump slab_id limit_num配合get命令可以遍历memcached的记录。
4、其他stats命令
如stats slabs,stats sizes,stats reset等等使用也比较常见。
四、其他常见命令
1、append
在现有的缓存数据后添加缓存数据,如现有缓存的key不存在服务器响应为NOT_STORED。
2、prepend
和append非常类似,但它的作用是在现有的缓存数据前添加缓存数据。
3、flush_all
该命令有一个可选的数字参数。它总是执行成功,服务器会发送 “OK\r\n” 回应。它的效果是使已经存在的项目立即失效(缺省),或在指定的时间后。此后执行取回命令,将不会有任何内容返回(除非重新存储同样的键名)。 flush_all 实际上没有立即释放项目所占用的内存,而是在随后陆续有新的项目被储存时执行(这是由memcached的懒惰检测和删除机制决定的)。
flush_all 效果是它导致所有更新时间早于 flush_all 所设定时间的项目,在被执行取回命令时命令被忽略。
4、其他命令
memcached还有很多命令,比如对于存储为数字型的可以通过incr/decr命令进行增减操作等等,这里只列出开发和运维中经常使用的命令,其他的不再一一举例说明。
补充一则:简单认识.net framework中的几种缓存
web站点中缓存的重要性毋庸置疑。我想很多asp.net开发人员在开发web应用系统的时候优先考虑使用的缓存并不是第三方缓存解决方案(比如分布式缓存memcached、redis等等),而应该是.net framework已经提供的多种缓存解决方案。下面结合自己的开发经验谈谈对.net framework中缓存的认识。
1、System.Web.Caching.Cache
估计大部分做过asp.net开发的人都用过这个命名空间下的缓存,我们可以直接使用HttpContext.Current.Cache实例而不用实例化。当然这个命名空间下的Cache类是允许您实例化的,需要定制自己的缓存系统的当然可以完全自己控制如何初始化这个类。我在园子里看到过有很多文章介绍Cache的CRUD辅助类库大多数都是针对System.Web.Caching.Cache。
需要说明的是,我们还可以通过该命名空间下的HttpRuntime.Cache实现web、控制台、winform等不同表现形式下的缓存,而且完全无需自己实例化。HttpRuntime.Cache是之前个人开发中使用比较多的一个类,现在比较偏爱.net framework4.0中的增强型的缓存类MemoryCache。
2、Output Cache
众所周知,输出缓存主要分页面输出缓存和页面部分缓存。说白了,就是缓存整个页面的html或者部分html,本来没什么值得讨论的,但是最近看到dudu的这篇博客才恍然发现,想不到使用它还真是大有讲究,我以前怎么就没有发现这个问题呢?看来发现问题和解决问题的能力同样重要,有时候前者甚至更重要啊。
3、System.Runtime.Caching
现在个人开发中使用最多的类MemoryCache出自这个命名空间,使用前需要引用using System.Runtime.Caching。MemoryCache继承自ObjectCache, IEnumerable, IDisposable,其中ObjectCache是个抽象类。用过MemoryCache的人都知道,这个MemoryCache有一个属性叫Default,通常可以像下面这样使用:
private static ObjectCache memCache = MemoryCache.Default;
当然我们也完全可以通过public MemoryCache(string name, NameValueCollection config = null)构造函数初始化缓存对象。
接着我们可以在web.config文件中配置每个MemoryCache实例运行的内存使用配额方案和配额检查周期,下面示例参考MSDN:
<system.runtime.caching> <memoryCache> <namedCaches> <add name="Default" cacheMemoryLimitMegabytes="10" pollingInterval="00:02:00"/> </namedCaches> </memoryCache> </system.runtime.caching>
这些配置意义在于可以明确指定每个MemoryCache实例运行的内存使用配额方案和配额检查周期。比如我们可以通过配置来按需更改MemoryCache.Default实例的内存配额(不知道缓存可用最大内存是多少,可能还是传说中的800M左右)。缓存过期策略与其它的缓存框架大同小异,与System.Web.Caching.Cache的不同只是名称不叫CacheDependency,而叫ChangeMonitor,并且提供了基于文件和目录的缓存依赖策略。关于缓存过期策略也比较有探讨的必要,不过个人开发中比较偏重于数据缓存和替换,目前还没有接触和使用过比较完美的过期策略解决方案。
参考:
http://code.google.com/p/memcached/wiki/NewCommands
http://msdn.microsoft.com/zh-cn/library/system.runtime.caching.memorycache.aspx
http://www.cnblogs.com/dudu/archive/2011/11/03/outputcache_Bug_vary.html
http://msdn.microsoft.com/zh-cn/library/system.web.caching.cache(v=VS.100).aspx