memcached 学习笔记 1
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了memcached 学习笔记 1,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含9856字,纯文字阅读大概需要15分钟。
内容图文
一 简介
1 What is Memcached?
Free & open source, high-performance, distributed memory object caching system, generic in nature,
but intended for use in speeding up dynamic web applications by alleviating 【减轻 缓解】 database load.
Memcached is an in-memory key-value store for small chunks 【块】
of arbitrary 【任意的】data (strings, objects) from results of database calls, API calls, or page rendering.
Memcached is simple yet powerful. Its simple design promotes uick deployment, ease of development,
and solves many problems facing large data caches. Its API is available for most popular languages.
memcached 是以 LiveJournal 旗下 Danga Interactive 公司 的 Brad Fitzpatric 为首开发的一款软件。
现在已成为 mixi、 hatena、 Facebook、 Vox、 LiveJournal 等众多服务中提高 Web 应用扩展性的重要因素。
许多 Web 应用都将数据保存到 RDBMS 中,应用服务器从中读取数据并在浏览器中显示。
但随着数据量的增大、 访问的集中, 就会出现 RDBMS 的负担加重、数据库响应恶化、网站显示延迟等重大影响。
这时就该 memcached 大显身手了。 memcached 是高性能的分布式内存缓存服务器。
一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态 Web 应用的速度、 提高可扩展性,如图。
Memcached是分布式的,也就是说它不是本地的。
它基于网络连接(当然它也可以使用localhost)方式完成服务,本身它是一个独立于应用的程序或守护进程(Daemon方式)。
2为什么会有Memcache和memcached两种名称
其实Memcache是这个项目的名称,而memcached是它服务器端的主程序文件名。
一个是项目名称,一个是主程序文件名,在网上看到了很多人不明白,于是混用了。
3.memcached的特征
memcached作为高速运行的分布式缓存服务器,具有以下的特点:
1)协议简单:memcached的服务器客户端通信并不使用复杂的XML等格式,而使用简单的基于文本行的协议。
1)基于libevent的事件处理:libevent是个程序库,它将Linux的epoll、BSD类操作系统的kqueue等事件处理功能封装成统一的接口。
即使对服务器的连接数增加,也能发挥O(1)的性能。memcached使用这个libevent库,因此能在Linux、BSD、Solaris等操作系统上发挥其高性能。
2)内置内存存储方式:为了提高性能,memcached中保存的数据都存储在memcached内置的内存存储空间中。
由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失。
另外,内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。
memcached本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题。
3)memcached不互相通信的分布式:memcached尽管是“分布式”缓存服务器,但服务器端并没有分布式功能。
各个memcached不会互相通信以共享信息。那么,分布式是完全取决于客户端的实现。
二 简单使用(windows 下)
1 下载文件
到http://code.jellycan.com/memcached/ 下载memcached的windows版
再下载一个java_memcached-release.jar
java_memcached-release_1.6.zip
memcached-1.2.1-win32.zip
2 解压memcached-1.2.1-win32.zip
D:\jt\memcached\memcached-1.2.1
3 启动
D:\jt\memcached\memcached-1.2.1:>memcached.exe -d install
D:\jt\memcached\memcached-1.2.1:>memcached.exe -l 127.0.0.1 -m 32 -d start
第一行是安装memcached成为服务,这样才能正常运行,否则运行失败!
执行后参看服务列表:
第二行是启动memcached的,作为测试我们就简单的只分配32M((默认64M))内存了,然后监听本机端口和以守护进行运行。
执行完毕后,我们就可以在任务管理器中见到memcached.exe这个进程了。
-p 使用的 TCP 端口 。 默认为 11211
-m 最大内存大小。 默认为 64M
-d 作为 daemon 在后台启动
2 java的使用
在java_memcached-release_1.6.zip中有java_memcached-release_1.6.jar
复制到java项目的lib目录下,然后我们来编写代码
1 package com.jt.memcached.mem; 2 3 import java.util.Date; 4 import com.danga.MemCached.MemCachedClient; 5 import com.danga.MemCached.SockIOPool; 6 7 /** 8 * 使用memcached的缓存实用类. 9 */ 10 public class MemCached { 11 12 // 创建全局的唯一实例 13 protected static MemCachedClient mcc = new MemCachedClient(); 14 15protectedstatic MemCached memCached = new MemCached(); 16 17// 设置与缓存服务器的连接池 18static { 19// 服务器列表和其权重 20 String[] servers = { "127.0.0.1:11211" }; 21 Integer[] weights = { 3 }; 22 23// 获取socke连接池的实例对象 24 SockIOPool pool = SockIOPool.getInstance(); 25 26// 设置服务器信息 27 pool.setServers(servers); 28 pool.setWeights(weights); 29 30// 设置初始连接数、最小和最大连接数以及最大处理时间 31 pool.setInitConn(5); 32 pool.setMinConn(5); 33 pool.setMaxConn(250); 34 pool.setMaxIdle(1000 * 60 * 60 * 6); 35 36// 设置主线程的睡眠时间 37 pool.setMaintSleep(30); 38 39// 设置TCP的参数,连接超时等 40 pool.setNagle(false); 41 pool.setSocketTO(3000); 42 pool.setSocketConnectTO(0); 43 44// 初始化连接池 45 pool.initialize(); 46 47// 压缩设置,超过指定大小(单位为K)的数据都会被压缩 48 mcc.setCompressEnable(true); 49 mcc.setCompressThreshold(64 * 1024); 50 } 51 52/** 53 * 保护型构造方法,不允许实例化! 54*/ 55protected MemCached() { 56 57 } 58 59/** 60 * 获取唯一实例. 61*/ 62publicstatic MemCached getInstance() { 63return memCached; 64 } 65 66/** 67 * 添加一个指定的值到缓存中. 68*/ 69publicboolean add(String key, Object value) { 70return mcc.add(key, value); 71 } 72 73/** 74 * 添加一个指定的值到缓存中并指定过期时间 75*/ 76publicboolean add(String key, Object value, Date expiry) { 77return mcc.add(key, value, expiry); 78 } 79 80/** 81 * 替换指定的值 82*/ 83publicboolean replace(String key, Object value) { 84return mcc.replace(key, value); 85 } 86 87/** 88 * 替换指定的值并指定过期时间 89*/ 90publicboolean replace(String key, Object value, Date expiry) { 91return mcc.replace(key, value, expiry); 92 } 93 94/** 95 * 根据指定的关键字获取对象. 96*/ 97public Object get(String key) { 98return mcc.get(key); 99 } 100 }
测试:
1 package com.jt.memcached.demo; 2 3 import java.util.Date; 4 import org.junit.Test; 5 import com.jt.memcached.mem.MemCached; 6 import com.jt.memcached.mem.User; 7 8 public class MemcachedDemo { 9 10 MemCached cache = MemCached.getInstance(); 1112 @Test 13publicvoid cachedData() { 1415 cache.add("hello", 234); 16 System.out.println("cached success!"); 17 } 1819 @Test 20publicvoid getData() { 21 System.out.print("get value : " + cache.get("hello")); 22 } 2324 @Test 25publicvoid cachedUser() { 2627 User user = new User("jtKevin", 23, new Date()); 28 cache.add("user", user); 29 System.out.println("cached a user success!"); 30 } 3132 @Test 33publicvoid getUser() { 34 User cachedUser = (User) cache.get("user"); 35 System.out.println("cached user:" + cachedUser); 36 } 37//cached user:User [name=jtKevin, age=23, hiredDate=Mon Aug 17 12:36:29 CST 2015]38 }
User类:
1 package com.jt.memcached.mem; 2 3 import java.io.Serializable; 4 import java.util.Date; 5 6 public class User implements Serializable { 7 8privatestaticfinallong serialVersionUID = 1L; 910private String name; 11privateint age; 12private Date hiredDate; 1314public User() { 15super(); 16 } 1718public User(String name, int age, Date hiredDate) { 19super(); 20this.name = name; 21this.age = age; 22this.hiredDate = hiredDate; 23 } 2425public String getName() { 26return name; 27 } 2829publicvoid setName(String name) { 30this.name = name; 31 } 3233publicint getAge() { 34return age; 35 } 3637publicvoid setAge(int age) { 38this.age = age; 39 } 4041public Date getHiredDate() { 42return hiredDate; 43 } 4445publicvoid setHiredDate(Date hiredDate) { 46this.hiredDate = hiredDate; 47 } 4849publicstaticlong getSerialversionuid() { 50return serialVersionUID; 51 } 5253 @Override 54public String toString() { 55return "User [name=" + name + ", age=" + age + ", hiredDate=" + hiredDate + "]"; 56 } 57 }
注意:
1 memcached是在服务器端的内存中缓存对象的,不是缓存或硬盘;
2 memcached的pool可以关联多个server,
String[] servers = {"10.20.185.12:11001","10.20.185.25:11001"};
Integer[] weights = {3,7};
该配置表示30%的缓存在放在第一台服务器,70%的将放在第二台服务器,这样便可以充分利用不同服务器的内存了;
3我最困惑的是client是如何得到相应的pool的,后然看了点源码才知道是这样的。client是通过pool的name关联到某个pool的,
上面的例子中在SockIOPool pool = SockIOPool.getInstance(); 和MemCachedClient client=new MemCachedClient();虽然都没写poolName,
但就是新建了一个”default“的pool,然后client关联到了这个”default“的pool。当然我们在新建这两个对象时可以给定具体的poolName。
三 Memcached的命令参数说明
memcached 1.4.2
-p 监听的TCP端口(默认: 11211)
-U 监听的UDP端口(默认: 11211, 0表示不监听)
-s 用于监听的UNIX套接字路径(禁用网络支持)
-a UNIX套接字访问掩码,八进制数字(默认:0700)
-l 监听的IP地址。(默认:INADDR_ANY,所有地址)
-d 作为守护进程来运行。
-r 最大核心文件限制。
-u 设定进程所属用户。(只有root用户可以使用这个参数)
-m 单个数据项的最大可用内存,以MB为单位。(默认:64MB)
-M 内存用光时报错。(不会删除数据)
-c 最大并发连接数。(默认:1024)
-k 锁定所有内存页。注意你可以锁定的内存上限。
试图分配更多内存会失败的,所以留意启动守护进程时所用的用户可分配的内存上限。
(不是前面的 -u 参数;在sh下,使用命令"ulimit -S -l NUM_KB"来设置。)
-v 提示信息(在事件循环中打印错误/警告信息。)
-vv 详细信息(还打印客户端命令/响应)
-vvv 超详细信息(还打印内部状态的变化)
-h 打印这个帮助信息并退出。
-i 打印memcached和libevent的许可。
-P 保存进程ID到指定文件,只有在使用 -d 选项的时候才有意义。
-f 块大小增长因子。(默认:1.25)
-n 分配给key+value+flags的最小空间(默认:48)
-L 尝试使用大内存页(如果可用的话)。提高内存页尺寸可以减少"页表缓冲(TLB)"丢失次数,提高运行效率。
为了从操作系统获得大内存页,memcached会把全部数据项分配到一个大区块。
-D 使用 作为前缀和ID的分隔符。
这个用于按前缀获得状态报告。默认是":"(冒号)。
如果指定了这个参数,则状态收集会自动开启;如果没指定,则需要用命令"stats detail on"来开启。
-t 使用的线程数(默认:4)
-R 每个连接可处理的最大请求数。
-C 禁用CAS。
-b 设置后台日志队列的长度(默认:1024)
-B 绑定协议 - 可能值:ascii,binary,auto(默认)
-I 重写每个数据页尺寸。调整数据项最大尺寸。
四 Memcached常用命令及使用说明
存储命令
存储命令的格式:
<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对应的数据改变时,这个多返回的数字也会改变。
状态命令
查看 memcached 的内部状态
memcached 有个名为 stats 的命令,使用它可以获得各种各样的信息。 执行命令的方法很多,用
telnet 最为简单:
$ telnet 主机名 端口号
连接到 memcached 之后, 输入 stats 再按回车, 即可获得包括资源利用率在内的各种信息。 此外,
输入"stats slabs"或"stats items"还可以获得关于缓存记录的信息。结束程序请输入 quit。
1 telnet 127.0.0.1 11211 2 3stats 4 5 STAT pid 18006 6 7 STAT uptime 702 //memcached运行的秒数 8 9 STAT time 1292904537 //memcached服务器所在主机当前系统的时间,单位是秒。1011 STAT version 1.4.5 1213 STAT pointer_size 64 //服务器所在主机操作系统的指针大小,一般为32或641415 STAT rusage_user 0.003999 1617 STAT rusage_system 0.013997 1819 STAT curr_connections 10 //表示当前的连接数2021 STAT total_connections 11 //表示从memcached服务启动到当前时间,系统打开过的连接的总数。2223 STAT connection_structures 11 2425 STAT cmd_get 0 //查询缓存的次数,平均每秒缓存次数cmd_get/uptime2627 STAT cmd_set 0 //设置key=>value的次数2829 STAT cmd_flush 0 3031 STAT get_hits 0 //缓存命中的次数,缓存命中率=get_hits/cmd_get*100%3233 STAT get_misses 0 //cmd_get-get_hits3435 STAT delete_misses 0 3637 STAT delete_hits 0 3839 STAT incr_misses 0 4041 STAT incr_hits 0 4243 STAT decr_misses 0 4445 STAT decr_hits 0 4647 STAT cas_misses 0 4849 STAT cas_hits 0 5051 STAT cas_badval 0 5253 STAT auth_cmds 0 5455 STAT auth_errors 0 5657 STAT bytes_read 7 //memcached服务器从网络读取的总的字节数5859 STAT bytes_written 0 //memcached服务器发送到网络的总的字节数。6061 STAT limit_maxbytes 67108864 //memcached服务缓存允许使用的最大字节数6263 STAT accepting_conns 1 6465 STAT listen_disabled_num 0 6667 STAT threads 4 6869 STAT conn_yields 0 7071 STAT bytes 0 7273 STAT curr_items 0 7475 STAT total_items 0 7677 STAT evictions 0 7879 STAT reclaimed 0 8081END 8283 Quit
原文:http://www.cnblogs.com/wihainan/p/4792312.html
内容总结
以上是互联网集市为您收集整理的memcached 学习笔记 1全部内容,希望文章能够帮你解决memcached 学习笔记 1所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。