最近项目开发需要用到memcached分布式缓存这个东西,把自己学到的一些东西分享给大家。文章分为三部分,第一部分简单介绍一下什么是memcached,第二部分介绍memcached的安装和简单的使用命令,第三部分介绍在java中如何使用memcached。
一、什么是memcached
1.基本概念:
Memcached是一套分布式内存对象缓存系统,用于在动态系统中减少数据库负载,提升性能。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。
2.适用场合:
(1) 分布式应用。由于memcached本身基于分布式的系统,所以尤其适合大型的分布式系统。
(2) 数据库前段缓存。数据库常常是网站系统的瓶颈。数据库的大并发量访问,常常造成网站内存溢出。当然我们也可以使用Hibernate的缓存机制。但memcached是基于分布式的,并可独立于网站应用本身,所以更适合大型网站进行应用的拆分。
(3) 服务器间数据共享。举例来讲,我们将网站的登录系统、查询系统拆分为两个应用,放在不同的服务器上,并进行集群,那这个时候用户登录后,登录信息如何从登录系统服务器同步到查询系统服务器呢?这时候,我们便可以使用memcached,登录系统将登录信息缓存起来,查询系统便可以获得登录信息,就像获取本地信息一样。
3. 不适用场合
那些不需要“分布”的,不需要共享的,或者干脆规模小到只有一台服务器的应用,memcached不会带来任何好处,相反还会拖慢系统效率,因为网络连接同样需要资源
二、安装
1.这里介绍windows环境的安装步骤。
(1) 下载memcache的windows稳定版,解压放某个盘下面,比如在c:\memcached
(2)在cmd下输入 'c:\memcached\memcached.exe -d install' 安装
(3)再输入: 'c:\memcached\memcached.exe -d start' 启动。
以后memcached将作为windows的一个服务每次开机时自动启动。这样服务器端已经安装完毕了。
memcached下载地址如下:
http://download.csdn.net/download/qq_25611965/10149599
2. Memcached常用命令
(1)连接服务器:telnet ip 端口
(2)添加数据:addtest(键名) 0 30(过期时间单位为秒)3 (要添加value的长度)123(value);
(3)get 命令用于检索与之前添加的键相对的值。上图是使用 get 命令获得test的值:
(4)replace 命令会替换存储中的键。如果缓存中不存在键,那么您将从 memcached 服务器接受到一条 NOT_STORED 响应
(5)delete 命令用于删除 memcached 中的任何现有值.如果该键存在,则删除该值。如果不存在,则返回一条NOT_FOUND 消息。
清除所有缓存:flush_all
3. 在java中使用Memcached
(1)需要导入的jar包
A. commons-pool.jar
B. java_memcached-release_2.6.3.jar
C. slf4j-api-1.6.1.jar
D. slf4j-simple-1.6.1.jar
(2)实例代码
- package com.hl.memcached.cache;
- import java.util.Date;
- import com.danga.MemCached.MemCachedClient;
- import com.danga.MemCached.SockIOPool;
- public class MyCache {
- public static void main(String[] args) {
- MemCachedClient client=new MemCachedClient();
- String [] addr ={"127.0.0.1:11211"};
- Integer [] weights = {3};
- SockIOPool pool = SockIOPool.getInstance();
- pool.setServers(addr);
- pool.setWeights(weights);
- pool.setInitConn(5);
- pool.setMinConn(5);
- pool.setMaxConn(200);
- pool.setMaxIdle(1000*30*30);
- pool.setMaintSleep(30);
- pool.setNagle(false);
- pool.setSocketTO(30);
- pool.setSocketConnectTO(0);
- pool.initialize();
- // String [] s =pool.getServers();
- client.setCompressEnable(true);
- client.setCompressThreshold(1000*1024);
- // 将数据放入缓存
- client.set("test2","test2");
- // 将数据放入缓存,并设置失效时间
- Date date=new Date(2000000);
- client.set("test1","test1", date);
- // 删除缓存数据
- // client.delete("test1");
- // 获取缓存数据
- String str =(String)client.get("test1");
- System.out.println(str);
- }
- }