Memcached简介
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。
Memcached 的守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。但是它并不提供冗余(例如,复制其hashmap条目);当某个服务器S停止运行或崩溃了,所有存放在S上的键/值对都将丢失。
存储方式
为了提高性能,memcached中保存的数据都存储在memcached内置的内存存储空间中。由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失。另外,内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。memcached本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题。
Memcached 安装
我是在windows下安装使用的。
下载之后解压就行。
解压之后,把里面的三个文件复制到32位的里面,覆盖即可。
我解压之后放在E盘:
使用管理员权限运行以下命令
E:\memcache\memcached.exe -d install
启动关闭卸载memcache
启动: E:\memcache\memcached.exe -d start
关闭: E:\memcache\memcached.exe -d stop
卸载: E:\memcache\memcached.exe -d uninstall
在spring boot中使用memcache作为缓存
1.pom.xml依赖
commons-pool
commons-pool
1.5.6
com.whalin
Memcached-Java-Client
3.0.2
2.application.properties
memcache.servers=127.0.0.1:11211memcache.failover=truememcache.initConn=10memcache.minConn=20memcache.maxConn=1000memcache.maintSleep=50memcache.nagle=falsememcache.socketTO=3000memcache.aliveCheck=true
3.MemcacheConfiguration
@Configurationpublic classMemcacheConfiguration {
@Value("${memcache.servers}")privateString[] servers;
@Value("${memcache.failover}")private booleanfailover;
@Value("${memcache.initConn}")private intinitConn;
@Value("${memcache.minConn}")private intminConn;
@Value("${memcache.maxConn}")private intmaxConn;
@Value("${memcache.maintSleep}")private intmaintSleep;
@Value("${memcache.nagle}")private booleannagel;
@Value("${memcache.socketTO}")private intsocketTO;
@Value("${memcache.aliveCheck}")private booleanaliveCheck;
@BeanpublicSockIOPool sockIOPool () {
SockIOPool pool=SockIOPool.getInstance();
pool.setServers(servers);
pool.setFailover(failover);
pool.setInitConn(initConn);
pool.setMinConn(minConn);
pool.setMaxConn(maxConn);
pool.setMaintSleep(maintSleep);
pool.setNagle(nagel);
pool.setSocketTO(socketTO);
pool.setAliveCheck(aliveCheck);
pool.initialize();returnpool;
}
@BeanpublicMemCachedClient memCachedClient(){return newMemCachedClient();
}
}
4.MemcacheController
@Controllerpublic classMemcacheController {
@AutowiredprivateMemCachedClient memCachedClient;/*** memcache缓存*/@RequestMapping("/memcache")
@ResponseBodypublic String memcache() throwsInterruptedException{//放入缓存
boolean flag = memCachedClient.set("mem", "name");//取出缓存
Object value = memCachedClient.get("mem");
System.out.println(value);//3s后过期
memCachedClient.set("num", "666", new Date(3000));/*memCachedClient.set("num", "666", new Date(System.currentTimeMillis()+3000));与上面的区别是当设置了这个时间点
之后,它会以服务端的时间为准,也就是说如果本地客户端的时间跟服务端的时间有差值,这个值就会出现问题。
例:如果本地时间是20:00:00,服务端时间为20:00:10,那么实际上会是40秒之后这个缓存key失效*/Object key= memCachedClient.get("num");
System.out.println(key);//多线程睡眠3s
Thread.sleep(3000);
key= memCachedClient.get("num");
System.out.println(value);
System.out.println(key );return "success";
}
}
5.控制台输出:
name
666
name
null
总结:memcache通过set方法把值存入都memcache缓存中;通过get方法把值取出来;通过设置过期时间,使其失效。
* Memcache:不支持持久化、只支持key-value键值、多线程 、集群分布式
* Redis:支持持久化、丰富的数据类型、单线程 、集群分布式
* Ehcache:直接在jvm虚拟机中缓存,速度快,效率高,单个应用或者对缓存访问要求很高的应用,用ehcache。核心程序仅仅依赖slf4j。