Memcached简介
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。
Memcached 的守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。但是它并不提供冗余(例如,复制其hashmap条目);当某个服务器S停止运行或崩溃了,所有存放在S上的键/值对都将丢失。
存储方式
Memcached 安装
我是在windows下安装使用的。
32位请下载这里: 链接: https://pan.baidu.com/s/1qPxMDPEtsCFBWaG3bsVT6Q 密码: hrih
下载之后解压就行。
64位先下载32位,进行解压,接着下载这里:链接: https://pan.baidu.com/s/1X3MeLgB5QObksm35LKZ-eg 密码: xbn4
解压之后,把里面的三个文件复制到32位的里面,覆盖即可。
我解压之后放在E盘:
使用管理员权限运行以下命令
E:memcachememcached.exe -d install
启动关闭卸载memcache
启动: E:memcachememcached.exe -d start
关闭: E:memcachememcached.exe -d stop
卸载: E:memcachememcached.exe -d uninstall
在spring boot中使用memcache作为缓存
1.pom.xml依赖
<!--memcache--> <dependency> <groupId>commons-pool</groupId> <artifactId>commons-pool</artifactId> <version>1.5.6</version> </dependency> <dependency> <groupId>com.whalin</groupId> <artifactId>Memcached-Java-Client</artifactId> <version>3.0.2</version> </dependency>
2.application.properties
memcache.servers=127.0.0.1:11211 memcache.failover=true memcache.initConn=10 memcache.minConn=20 memcache.maxConn=1000 memcache.maintSleep=50 memcache.nagle=false memcache.socketTO=3000 memcache.aliveCheck=true
3.MemcacheConfiguration
@Configuration public class MemcacheConfiguration { @Value("${memcache.servers}") private String[] servers; @Value("${memcache.failover}") private boolean failover; @Value("${memcache.initConn}") private int initConn; @Value("${memcache.minConn}") private int minConn; @Value("${memcache.maxConn}") private int maxConn; @Value("${memcache.maintSleep}") private int maintSleep; @Value("${memcache.nagle}") private boolean nagel; @Value("${memcache.socketTO}") private int socketTO; @Value("${memcache.aliveCheck}") private boolean aliveCheck; @Bean public SockIOPool 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(); return pool; } @Bean public MemCachedClient memCachedClient(){ return new MemCachedClient(); } }
4.MemcacheController
@Controller public class MemcacheController { @Autowired private MemCachedClient memCachedClient; /** * memcache缓存 */ @RequestMapping("/memcache") @ResponseBody public String memcache() throws InterruptedException{ // 放入缓存 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。