1、Cache定义
(1)狭义概念:用于CPU的相对高速处理与主存(Main Memory)的相对低速处理的之间起到协调功能的硬件设备。
(2)广义概念:用于速度相差较大的两种硬件之间,起到协调两者数据传输速度差异的结构。
狭义概念来自于Cache自1967出现以来较长时间内的应用场景。因为CPU的数据处理速度,要远远高于主存,所以在CPU和主存之间会有高速缓存设备,甚至是多级缓存设备。而广义概念,则是目前已经被广泛接受的一种定义,且广义概念中,Cache不再只局限于硬件,也可以是软件。比如用于网络相对低速传输与磁盘相对高速传输之间的速度差异协调。
2、Cache的本质原理
可以一句话概括,就是:Cache把要到慢速设备中取的数据预先放到快速设备中。
3、几种类型的Cache
(1)CPU Cache:置于CPU和主存之间,用于加速CPU对主存的相对慢速操作。
(2)Browser Cache:置于客户端与服务器之间,用于加速客户端对服务器的相对慢速操作。
(3)Server Cache:置于网络请求与本地文件之间,用于加速网络请求对本地文件的相对慢速操作。
(4)CDN:CDN即Content Delivery Network,在各地设置的节点Cache,加速用户对服务网络的相对慢速操作。
(5)Database Cache
(6)OS Cache:内存中存在的对于硬盘读写的缓冲区域。
4、What is Memcached?
Memcached是一个免费开源、高性能、分布式的内存对象缓存系统。Memcached是在内存中,为特定数据(字符串或对象)构建key-value的小块数据存储。
5、下载Memcached的服务器端软件
Window7 64位版本下载:http://download.youkuaiyun.com/detail/zhouzhiwengang/7780513
6、在服务器上部署Memcached Server
以下以Windows平台为例:
参考:http://www.codeforest.net/how-to-install-memcached-on-windows-machine
下载下来的Windows版本解压到E:/memcached/
在控制台输入命令安装:
memcached 服务端启动:
或者:
默认的缓存大小为64M,如果不够用,请打开注册表,找到:
将其内容修改为:
7、下载Memcached的客户端API包
Memcached本身是使用C开发的,客户端可以是php、C#、或者java。我是做java的,所以这里只介绍基于java的客户端。
我在网上看到基于java的客户端有两个
1.java_memcached-release_2.6.3
1)简介
这是比较通用的Memcached客户端框架。具体原创不详。资源下载路径:http://download.youkuaiyun.com/detail/zhouzhiwengang/7780583
2)依赖的jar
A.commons-pool-1.5.6.jar
B.java_memcached-release_2.6.3.jar
C.slf4j-api-1.6.1.jar
D.slf4j-simple-1.6.1.jar
2.alisoft-xplatform-asf-cache-2.5.1
1)简介
这个东东是阿里软件的架构师岑文初进行封装的。里面的注释都是中文的,比较好。
2)依赖的jar
A.alisoft-xplatform-asf-cache-2.5.1.jar
B.commons-logging-1.0.4.jar
C.hessian-3.0.1.jar
D.log4j-1.2.9.jar
E.stax-api-1.0.1.jar
F.wstx-asl-2.0.2.jar
8、范例
1.基于java_memcached-release_2.6.3
main 方法
- package com.vixuan.memcached.cache;
- import java.net.InetSocketAddress;
- import java.util.Date;
- import com.danga.MemCached.MemCachedClient;
- import com.danga.MemCached.SockIOPool;
- public class MemcachedExceted {
- /**
- * @param args
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- // 创建一个 memcached 客户端对象
- MemCachedClient client = new MemCachedClient();
- // 静态模块
- // 创建 memcached连接池
- // 指定memcached服务地址
- String[] addr = { "127.0.0.1:11211" };
- // 指定memcached服务器负载量
- Integer[] weights = { 3 };
- // 从连接池获取一个连接实例
- SockIOPool pool = SockIOPool.getInstance();
- // 设置服务器
- pool.setServers(addr);
- // 设置负载量
- pool.setWeights(weights);
- // 设置一些基本的参数
- // 设置初始连接数5 最小连接数 5 最大连接数 200
- // 设置一个连接最大空闲时间3小时
- pool.setInitConn(5);
- pool.setMinConn(5);
- pool.setMaxConn(200);
- pool.setMaxIdle(1000 * 30 * 30);
- // 设置主线程睡眠时间
- // 每隔30秒醒来 然后
- // 开始维护 连接数大小
- pool.setMaintSleep(30);
- // 设置tcp 相关的树形
- // 关闭nagle算法
- // 设置 读取 超时3秒钟 set the read timeout to 3 secs
- // 不设置连接超时
- pool.setNagle(false);
- pool.setSocketTO(3000);
- pool.setSocketConnectTO(0);
- // 开始初始化 连接池
- pool.initialize();
- // memcached 存储字符串
- Date date = new Date(2000000);
- client.set("tagert", "this is memcached", date);
- // 内容强制转换
- String result = (String) client.get("tagert");
- System.out.println("结果:" + result);
- // memcached 存储对象
- for (int i = 1; i < 10; i++) {
- client.set("T0001" + i, new User(i + ""), 3600);
- }
- User myObject = (User) client.get("T00014");
- System.out.println("结果 :" + myObject);
- }
- }
- package com.vixuan.memcached.cache;
- import java.net.InetSocketAddress;
- import java.util.Date;
- import com.danga.MemCached.MemCachedClient;
- import com.danga.MemCached.SockIOPool;
- public class MemcachedExceted {
- /**
- * @param args
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- // 创建一个 memcached 客户端对象
- MemCachedClient client = new MemCachedClient();
- // 静态模块
- // 创建 memcached连接池
- // 指定memcached服务地址
- String[] addr = { "127.0.0.1:11211" };
- // 指定memcached服务器负载量
- Integer[] weights = { 3 };
- // 从连接池获取一个连接实例
- SockIOPool pool = SockIOPool.getInstance();
- // 设置服务器
- pool.setServers(addr);
- // 设置负载量
- pool.setWeights(weights);
- // 设置一些基本的参数
- // 设置初始连接数5 最小连接数 5 最大连接数 200
- // 设置一个连接最大空闲时间3小时
- pool.setInitConn(5);
- pool.setMinConn(5);
- pool.setMaxConn(200);
- pool.setMaxIdle(1000 * 30 * 30);
- // 设置主线程睡眠时间
- // 每隔30秒醒来 然后
- // 开始维护 连接数大小
- pool.setMaintSleep(30);
- // 设置tcp 相关的树形
- // 关闭nagle算法
- // 设置 读取 超时3秒钟 set the read timeout to 3 secs
- // 不设置连接超时
- pool.setNagle(false);
- pool.setSocketTO(3000);
- pool.setSocketConnectTO(0);
- // 开始初始化 连接池
- pool.initialize();
- // memcached 存储字符串
- Date date = new Date(2000000);
- client.set("tagert", "this is memcached", date);
- // 内容强制转换
- String result = (String) client.get("tagert");
- System.out.println("结果:" + result);
- // memcached 存储对象
- for (int i = 1; i < 10; i++) {
- client.set("T0001" + i, new User(i + ""), 3600);
- }
- User myObject = (User) client.get("T00014");
- System.out.println("结果 :" + myObject);
- }
- }
- package com.vixuan.memcached.cache;
- import java.io.Serializable;
- public class User implements Serializable {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private String id;
- public User(String id) {
- super();
- this.id = id;
- }
- public String getId() {
- return id;
- }
- public void setId(String id) {
- this.id = id;
- }
- @Override
- public String toString() {
- // TODO Auto-generated method stub
- StringBuffer sb = new StringBuffer();
- sb.append("userId=" + this.id);
- return sb.toString();
- }
- }
- package com.vixuan.memcached.cache;
- import java.io.Serializable;
- public class User implements Serializable {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private String id;
- public User(String id) {
- super();
- this.id = id;
- }
- public String getId() {
- return id;
- }
- public void setId(String id) {
- this.id = id;
- }
- @Override
- public String toString() {
- // TODO Auto-generated method stub
- StringBuffer sb = new StringBuffer();
- sb.append("userId=" + this.id);
- return sb.toString();
- }
- }
结果展示:
项目结构: