(一)memcached介绍css
(1) memcached是一个分布式缓存工具。与咱们常常打交道的缓存技术,就是浏览器自带的缓存,咱们知道像图片、css、js等这些静态文件就能被浏览器缓存起来。咱们再访问相同网页的时候,这些缓存的文件就直接找浏览器去取而再也不是请求服务器。减轻了服务器的压力。数据库
(2) 所谓静态文件,顾名思义就是一些不常常更新的文件;可是咱们网站的内容都是动态的,所谓动态,也就是这些数据都是存储在数据库当中,每次请求都要向数据库索取。请求数据库也是磁盘操做,也是费时费力的。虽然说是动态,但还有一些东西在短期内也是不会更改的,而这些数据彻底能够缓存起来。像购物网站分类导航。memcached正充当着这样一个角色。浏览器
(3) memcached是分布式的,也就是memcached服务端这个软件能够安装到集群服务器当中,抑或一台服务器安装好几个memcached。这些memcached服务器是协同来处理用于请求的。所谓协同,就是每一个memcached都会分配一个权重,若是权重值较大被访问到的概率也就大;若是权重值较小被访问到的概率也就较小。缓存
(二)memcached服务端安装服务器
(1) memcached服务端是用C语言来写的。在官网上只给出了Linux的版本,好不容易在网上搜查到了Win32版本,连接发布以下:socket
(2)将这个压缩包解压,就出来一个“鹿头”的memcached.exe文件,没错!就是它了。运行它,会出现一个窗口,这个窗口一直打开着就说明memcached的服务端就一直运行着,那么它就能接收客户端的请求。客户端就能够自由发挥了,能够用各类语言来实现,本文用Java做介绍。memcached
在网上查了一下,如今比较流行的Java客户端一个是阿里的同窗写的;另外一个就是老外写的,顺便在Git上将其下载下来看了一下源码。源码后面将介绍,如今只说应用。工具
这里只介绍这个老外写的Memcached Java客户端,咱们须要下载memcached客户端Jar包和其所依赖的Jar包.测试
(三)建立工程
(1)如今咱们就能够开始咱们的项目了。建一个Memecached类,在其中提供向缓存当中存入数据和取数据的方法。(memcached服务端软件默认运行端口为:11211)
1 public class MemCached{ 2 private static MemCachedClient mcc=new MemCachedClient(); 3 private static MemCached memCached=new MemCached(); 4 5 //服务区群 6 private static final String[] services={"192.168.56.1:11211"}; 7 //服务器群各自对应的权重 8 private static final Integer[] weights={1}; 9 //初始化链接数 10 private static final Integer init_connection=5; 11 //最大链接数 12 private static final Integer max_connection=50; 13 //最大空闲时间 60*60*6 14 private static final Long max_idle=21600L; 15 16 17 static { 18 //获取socket链接池的实例对象 19 SockIOPool pool=SockIOPool.getInstance(); 20 pool.setServers(services); 21 pool.setWeights(weights); 22 pool.setInitConn(init_connection); 23 pool.setMinConn(init_connection); 24 pool.setMaxConn(max_connection); 25 pool.setMaxIdle(max_idle); 26 27 //设置TCP的参数,链接超时等 28 pool.setNagle(false); 29 pool.setSocketTO(3000); 30 pool.setSocketConnectTO(0); 31 32 //初始化链接池 33 pool.initialize(); 34 35 //超过指定大小就压缩 36 mcc.setCompressEnable(true); 37 mcc.setCompressThreshold(65536L); 38 } 39 40 private MemCached(){} 41 42 public static MemCached getInstance() { 43 return memCached; 44 } 45 46 public boolean add(String key,Object value) { 47 return mcc.add(key, value); 48 } 49 50 public boolean add(String key,Object value,Date expiry) { 51 return mcc.add(key,value, expiry); 52 } 53 54 public boolean replace(String key,Object value) { 55 return mcc.replace(key, value); 56 } 57 public boolean replace(String key,Object value,Date expiry) { 58 return mcc.replace(key,key,expiry); 59 } 60 61 public Object get(String key) { 62 return mcc.get(key); 63 } 64
(2)测试方法
1 public class Test { 2 public static void main(String[] args) { 3 MemCached cache=MemCached.getInstance(); 4 cache.add("username", "feiji"); 5 System.out.println("从缓存中取出的值为:"+cache.get("username")); 6 } 7 8 }
这样咱们就能将键为“username”,值为“feiji”的键值对存入到缓存当中又能从其中取出来。
而后咱们将第4行代码删掉,只要memcached服务端没有关闭,仍是能查询出来。
固然咱们还能够为这个存入的键值对加入过时时间。
这就比如一个应用场景,手机短信验证码。程序将验证码发给指定手机,这个验证码假设是在50S内有效。那么这个验证码在这50S内显然要能找到,确定不能用数据库来存吧!!这时memcached就派上用场了。
测试代码以下:
1 public class Test { 2 public static void main(String[] args) { 3 MemCached cache=MemCached.getInstance(); 4 long now=System.currentTimeMillis(); 5 long expiry=now+1000*50; 6 Date date=new Date(expiry); 7 cache.add("username", "feiji", date); 8 System.out.println("从缓存中取出的值为:"+cache.get("username")); 9 } 10 }