MemCache详解
文章目录
- 一、关于Memcached
- 1.1 Memcached的介绍
- 1.2 Memcached的工作原理
- 1.3 Memcached的作用
- 二、Memcached服务端的安装(重点)
- 2.1 Windows安装memcached(服务器端)
- 2.2 Linux安装memcached(服务器端)
- 2.3 telnet请求命令格式(Windows下)
- 2.4 memcached在Linux中的操作
- 三、Java 连接 Memcached 服务
- 连接实例
- set 操作实例
- add 操作实例
- replace 操作实例
- append 操作实例
- prepend 操作实例
- CAS 操作实例
- get 操作实例
- gets 操作实例、CAS
- delete 操作实例
- Incr/Decr 操作实例
一、关于Memcached
1.1 Memcached的介绍
MemCache是一个自由、源码开放、高性能、分布式的内存对象缓存系统,用于动态Web应用以减轻数据库的负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高了网站访问的速度。
MemCache是一个存储键值对的HashMap,在内存中对任意的 数据(比如字符串、对象等)所使用的key-value存储,数据可以来自数据库调用、API调用,或者页面渲染的结果,
1.2 Memcached的工作原理
由于它的工作机制是在 内存中开辟一块空间,然后建立一个HashTable,Memcached管理这些HashTable,所以速度非常快。
1.3 Memcached的作用
使用MemCache的网站一般流量都是比较大的,为了缓解数据库的压力,让MemCache作为一个缓存区域,把部分信息保存在内存中,在前端能够迅速的进行存取。那么一般的焦点就是集中在如何分担数据库压力和进行分布式,毕竟单台MemCache的内存容量是有限的。
二、Memcached服务端的安装(重点)
Memcached的安装
分为两个过程:
memcache服务器端的安装和memcache客户端的安装。
所谓服务器端的安装就是在服务器(一般都是Linux系统)上安装MemCache实现数据的存储。
所谓客户端的安装就是指Java(或者其他程序,memcache还有其他不错的api接口提供)去使用服务器端的memcache提供的函数,需要Java添加扩展。
2.1 Windows安装memcached(服务器端)
官网:下载地址
# 如果之前有MemCache的安装,删除它,启动cmdsc delete "Memcached Server"# 获取安装包、以管理员方式启动cmd、并进入安装包目录下:
d:
cd Java\memcache# 安装MemCache
memcache.exe -d install# 启动MemCache
memcache.exe -d start#设置 memcached 最大的缓存配置为512M。
memcache.exe -d runservice -m 512# 关闭MemCache
memcache.exe -d stop# 卸载MemCache
memcache.exe -d uninstall
安装成功之后再Windows服务项目中查看是否有启动
测试安装是否成功
在MemCache服务成功启动后,可以使用telnet 127.0.0.1 11211测试连接是否成功;
如果连接成功后则使用stats命令可以查看MemCache的基本信息
(1)什么是Telnet
对于telnet的人事,不同的人持有不同的观点,可以吧telnet当成一种通信协议,但是对于入侵者而言,telnet只是一种远程登录的工具。一旦入侵者与远程主机建立了telnet连接,入侵者便可以使用目标主机上的软、硬件资源,而入侵者的本地机只相当于一个只有键盘和显示器的终端而已
(2)开启telnet功能
打开控制面板——>程序和功能——>启动或者关闭Windows功能——>开启telnet客户端
(3)telnet命令的使用
然后输入命令:
stats 查看memcache服务器的状态
2.2 Linux安装memcached(服务器端)
- 获取memcached的安装包:
官网:下载地址 - 上传文件到Linux根目录software目录下
- 解压安装包
# 基本依赖
mount /dev/cdrom /media/CentOS
yum --disablerepo=\* --enablerepo=c6-media install gcc gcc-c++# 安装libevent
tar zxvf libevent-2.0.21-stable.tar.gz
cd libevent-2.0.21-stable
./configure --prefix=/usr/local/libevent
make && make install# 安装memcached
tar zxvf memcached-1.4.27.tar.gz
cd memcached-1.4.27
./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent
make && make install# 创建一个用户:
useradd memcache
passed memcache# 从root用户切换到memcached用户:
su - memcache# 启动memcache服务:
cd /usr/local/memcache
./bin/memcache & #后台启动服务器端memcached# 查看memcached的服务器端是否启动 7413端口
ps -e |grep memcache
2.3 telnet请求命令格式(Windows下)
<command name> <key> <flags> <exptime> <bytes>\r\n <data block>\r\na)<command name>可以是"set","add","replace"。
"set" 表示按照相应的<key>存储该数据,没有的时候增加,有的覆盖。
"add" 表示按照相应的<key>添加该数据,但是如果该<key>已经存在则会操作失败。
"replace" 表示按照相应的<key>替换数据,但是如果该<key>不存在则操作失败。b)<key>客户端需要保存数据的key username
set username 0 30 5c)<flags>是一个16位的无符号的整数(以十进制的方式表示)。
该标志将和需要存储的数据一起存储,并在客户端get数据时返回。
客户可以将此标志用做特殊用途,此标志对服务器来说是不透明的。
一般的状态:0(字符串)和1(对象和数组)d)<exptime>过期的时间。
若为0表示存储的数据永远不过时(但可被服务器算法LRU等替换)。
如果非0(Unix时间或者距离此时的秒数),当过期后,
服务器可以保证用户得不到该数据(以服务器时间为标准)。e)<block>需要存储的字节数(不包含最后的"\r\n")。
当用户希望存储空数据时,<block>可以为0f)最后客户端需要加上"\r\n"作为“命令头”的结束标志。
<data block>\r\n:输入的数据
紧接着“命令头”结束之后就要发送数据块(即希望存储的数据内容),
最后加上"\r\n"作为此次通讯的结束。
具体事例1:
打开cmd:
telnet 127.0.0.1 11211# 设置一个键名:newname;0:字符串;30:过期时间;5:数据的长度
set newname 0 30 5# 输入数据
peter# 获取键名的值
get newname
# 返回的数据
peter# 30秒后、得不到数据
get newname
2.4 memcached在Linux中的操作
XShell支持telnet(远程登录协议),连接MemCached服务器端进行操作。
使用telnet协议的客户端,即可充当memcached的客户端:
XShell可以发出ssh请求,同样也可以telnet请求
三、Java 连接 Memcached 服务
使用 Java 程序连接 Memcached,需要在你的 classpath 中添加 Memcached jar 包。
Google Code jar
包下载地址:spymemcached-2.10.3.jar以下程序假定 Memcached 服务的主机为 127.0.0.1,端口为 11211。
连接实例
Java 连接 Memcached
MemcachedJava.java 文件:
import net.spy.memcached.MemcachedClient;
import java.net.*;public class MemcachedJava {public static void main(String[] args) {try{// 本地连接 Memcached 服务MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));System.out.println("Connection to server sucessful.");// 关闭连接mcc.shutdown();}catch(Exception ex){System.out.println( ex.getMessage() );}}
}
该程序中我们使用 InetSocketAddress 连接 IP 为 127.0.0.1 端口 为 11211 的 memcached 服务。
执行以上代码,如果连接成功会输出以下信息:
Connection to server successful.
set 操作实例
以下使用 java.util.concurrent.Future 来存储数据
MemcachedJava.java 文件:
import java.net.InetSocketAddress;
import java.util.concurrent.Future;import net.spy.memcached.MemcachedClient;public class MemcachedJava {public static void main(String[] args) {try{// 连接本地的 Memcached 服务MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));System.out.println("Connection to server sucessful.");// 存储数据Future fo = mcc.set("runoob", 900, "Free Education");// 查看存储状态System.out.println("set status:" + fo.get());// 输出值System.out.println("runoob value in cache - " + mcc.get("runoob"));// 关闭连接mcc.shutdown();}catch(Exception ex){System.out.println( ex.getMessage() );}}
}
执行程序,输出结果为:
Connection to server successful.
set status:true
runoob value in cache - Free Education
add 操作实例
MemcachedJava.java 文件:
import java.net.InetSocketAddress;
import java.util.concurrent.Future;import net.spy.memcached.MemcachedClient;public class MemcachedJava {public static void main(String[] args) {try{// 连接本地的 Memcached 服务MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));System.out.println("Connection to server sucessful.");// 添加数据Future fo = mcc.set("runoob", 900, "Free Education");// 打印状态System.out.println("set status:" + fo.get());// 输出System.out.println("runoob value in cache - " + mcc.get("runoob"));// 添加fo = mcc.add("runoob", 900, "memcached");// 打印状态System.out.println("add status:" + fo.get());// 添加新keyfo = mcc.add("codingground", 900, "All Free Compilers");// 打印状态System.out.println("add status:" + fo.get());// 输出System.out.println("codingground value in cache - " + mcc.get("codingground"));// 关闭连接mcc.shutdown();}catch(Exception ex){System.out.println(ex.getMessage());}}
}
replace 操作实例
MemcachedJava.java 文件:
import java.net.InetSocketAddress;
import java.util.concurrent.Future;import net.spy.memcached.MemcachedClient;public class MemcachedJava {public static void main(String[] args) {try {//连接本地的 Memcached 服务MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));System.out.println("Connection to server sucessful.");// 添加第一个 key=》value 对Future fo = mcc.set("runoob", 900, "Free Education");// 输出执行 add 方法后的状态System.out.println("add status:" + fo.get());// 获取键对应的值System.out.println("runoob value in cache - " + mcc.get("runoob"));// 添加新的 keyfo = mcc.replace("runoob", 900, "Largest Tutorials' Library");// 输出执行 set 方法后的状态System.out.println("replace status:" + fo.get());// 获取键对应的值System.out.println("runoob value in cache - " + mcc.get("runoob"));// 关闭连接mcc.shutdown();}catch(Exception ex){System.out.println( ex.getMessage() );}}
}
append 操作实例
MemcachedJava.java 文件:
import java.net.InetSocketAddress;
import java.util.concurrent.Future;import net.spy.memcached.MemcachedClient;public class MemcachedJava {public static void main(String[] args) {try{// 连接本地的 Memcached 服务MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));System.out.println("Connection to server sucessful.");// 添加数据Future fo = mcc.set("runoob", 900, "Free Education");// 输出执行 set 方法后的状态System.out.println("set status:" + fo.get());// 获取键对应的值System.out.println("runoob value in cache - " + mcc.get("runoob"));// 对存在的key进行数据添加操作fo = mcc.append("runoob", 900, " for All");// 输出执行 set 方法后的状态System.out.println("append status:" + fo.get());// 获取键对应的值System.out.println("runoob value in cache - " + mcc.get("codingground"));// 关闭连接mcc.shutdown();}catch(Exception ex) {System.out.println(ex.getMessage());]}
}
prepend 操作实例
MemcachedJava.java 文件:
import java.net.InetSocketAddress;
import java.util.concurrent.Future;import net.spy.memcached.MemcachedClient;public class MemcachedJava {public static void main(String[] args) {try{// 连接本地的 Memcached 服务MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));System.out.println("Connection to server sucessful.");// 添加数据Future fo = mcc.set("runoob", 900, "Education for All");// 输出执行 set 方法后的状态System.out.println("set status:" + fo.get());// 获取键对应的值System.out.println("runoob value in cache - " + mcc.get("runoob"));// 对存在的key进行数据添加操作fo = mcc.prepend("runoob", 900, "Free ");// 输出执行 set 方法后的状态System.out.println("prepend status:" + fo.get());// 获取键对应的值System.out.println("runoob value in cache - " + mcc.get("codingground"));// 关闭连接mcc.shutdown();}catch(Exception ex) {System.out.println(ex.getMessage());}}
}
CAS 操作实例
MemcachedJava.java 文件:
import java.net.InetSocketAddress;
import java.util.concurrent.Future;import net.spy.memcached.CASValue;
import net.spy.memcached.CASResponse;
import net.spy.memcached.MemcachedClient;public class MemcachedJava {public static void main(String[] args) {try{// 连接本地的 Memcached 服务MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));System.out.println("Connection to server sucessful.");// 添加数据Future fo = mcc.set("runoob", 900, "Free Education");// 输出执行 set 方法后的状态System.out.println("set status:" + fo.get());// 使用 get 方法获取数据System.out.println("runoob value in cache - " + mcc.get("runoob"));// 通过 gets 方法获取 CAS token(令牌)CASValue casValue = mcc.gets("runoob");// 输出 CAS token(令牌) 值System.out.println("CAS token - " + casValue);// 尝试使用cas方法来更新数据CASResponse casresp = mcc.cas("runoob", casValue.getCas(), 900, "Largest Tutorials-Library");// 输出 CAS 响应信息System.out.println("CAS Response - " + casresp);// 输出值System.out.println("runoob value in cache - " + mcc.get("runoob"));// 关闭连接mcc.shutdown();}catch(Exception ex) {System.out.println(ex.getMessage());}}
}
get 操作实例
MemcachedJava.java 文件:
import java.net.InetSocketAddress;
import java.util.concurrent.Future;import net.spy.memcached.MemcachedClient;public class MemcachedJava {public static void main(String[] args) {try{// 连接本地的 Memcached 服务MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));System.out.println("Connection to server sucessful.");// 添加数据Future fo = mcc.set("runoob", 900, "Free Education");// 输出执行 set 方法后的状态System.out.println("set status:" + fo.get());// 使用 get 方法获取数据System.out.println("runoob value in cache - " + mcc.get("runoob"));// 关闭连接mcc.shutdown();}catch(Exception ex) {System.out.println(ex.getMessage());}}
}
gets 操作实例、CAS
MemcachedJava.java 文件:
import java.net.InetSocketAddress;
import java.util.concurrent.Future;import net.spy.memcached.CASValue;
import net.spy.memcached.CASResponse;
import net.spy.memcached.MemcachedClient;public class MemcachedJava {public static void main(String[] args) {try{// 连接本地的 Memcached 服务MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));System.out.println("Connection to server sucessful.");// 添加数据Future fo = mcc.set("runoob", 900, "Free Education");// 输出执行 set 方法后的状态System.out.println("set status:" + fo.get());// 从缓存中获取键为 runoob 的值System.out.println("runoob value in cache - " + mcc.get("runoob"));// 通过 gets 方法获取 CAS token(令牌)CASValue casValue = mcc.gets("runoob");// 输出 CAS token(令牌) 值System.out.println("CAS value in cache - " + casValue);// 关闭连接mcc.shutdown();}catch(Exception ex) {System.out.println(ex.getMessage());}}
}
delete 操作实例
MemcachedJava.java 文件:
import java.net.InetSocketAddress;
import java.util.concurrent.Future;import net.spy.memcached.MemcachedClient;public class MemcachedJava {public static void main(String[] args) {try{// 连接本地的 Memcached 服务MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));System.out.println("Connection to server sucessful.");// 添加数据Future fo = mcc.set("runoob", 900, "World's largest online tutorials library");// 输出执行 set 方法后的状态System.out.println("set status:" + fo.get());// 获取键对应的值System.out.println("runoob value in cache - " + mcc.get("runoob"));// 对存在的key进行数据添加操作fo = mcc.delete("runoob");// 输出执行 delete 方法后的状态System.out.println("delete status:" + fo.get());// 获取键对应的值System.out.println("runoob value in cache - " + mcc.get("codingground"));// 关闭连接mcc.shutdown();}catch(Exception ex) {System.out.println(ex.getMessage());}}
}
Incr/Decr 操作实例
MemcachedJava.java 文件:
import java.net.InetSocketAddress;
import java.util.concurrent.Future;import net.spy.memcached.MemcachedClient;public class MemcachedJava {public static void main(String[] args) {try{// 连接本地的 Memcached 服务MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));System.out.println("Connection to server sucessful.");// 添加数字值Future fo = mcc.set("number", 900, "1000");// 输出执行 set 方法后的状态System.out.println("set status:" + fo.get());// 获取键对应的值System.out.println("value in cache - " + mcc.get("number"));// 自增并输出System.out.println("value in cache after increment - " + mcc.incr("number", 111));// 自减并输出System.out.println("value in cache after decrement - " + mcc.decr("number", 112));// 关闭连接mcc.shutdown();}catch(Exception ex) {System.out.println(ex.getMessage());}}
}
MemCache详解相关推荐
- python memcache详解
memcache是键值对key-value存储, 操作很简单方便, python支持对memcache操作,也很简单, 能够快速上手进行开发 安装 pip install python-memcach ...
- PHP Memcache详解
memcache函数所有的方法列表如下: Memcache::add – 添加一个值,如果已经存在,则返回false Memcache::addServer – 添加一个可供使用的服务器地址 Memc ...
- memcache 详解
memcache函数所有的方法列表如下: Memcache::add – 添加一个值,如果已经存在,则返回false Memcache::addServer – 添加一个可供使用的服务器地址 Memc ...
- Memcache的使用和协议分析详解
Memcache的使用和协议分析详解 作者:heiyeluren 博客:http://blog.csdn.net/heiyeshuwu 时间:2006-11-12 关键字:PHP Memcache L ...
- LVS原理详解(3种工作方式8种调度算法)--老男孩
一.LVS原理详解(4种工作方式8种调度算法) 集群简介 集群就是一组独立的计算机,协同工作,对外提供服务.对客户端来说像是一台服务器提供服务. LVS在企业架构中的位置: 以上的架构只是众多企业里面 ...
- 深入剖析Redis系列(三) - Redis集群模式搭建与原理详解
前言 在 Redis 3.0 之前,使用 哨兵(sentinel)机制来监控各个节点之间的状态.Redis Cluster 是 Redis 的 分布式解决方案,在 3.0 版本正式推出,有效地解决了 ...
- memcached使用详解
memcached使用详解 一.memcached介绍 1.基于libevent的事件处理 libevent是一套跨平台的事件处理接口的封装,能够兼容包括这些操作系统:Windows/Linux/BS ...
- 数据结构与算法之时间复杂度详解
数据结构与算法之时间复杂度详解 目录 排序算法的介绍和分类 算法的时间复杂度概念 常见的时间复杂度解析 平均时间复杂度和最坏时间复杂度 空间复杂度介绍 1. 排序算法的介绍和分类 排序算法的介绍 排序 ...
- Windows WMIC命令使用详解(附实例)
第一次执行WMIC命令时,Windows首先要安装WMIC,然后显示出WMIC的命令行提示符.在WMIC命令行提示符上,命令以交互的方式执行执行"wmic"命令启动WMIC命令行环 ...
最新文章
- 跟我一起考PMP---项目时间管理
- apache dubbo 自定义全局统一的异常处理器
- 微软Azure storage account的path值代表什么含义
- iOS XIB等比例适配
- 请推荐好的工作流产品
- 关于在Ubuntu系统中出现Could not get lock /var/lib/dpkg/lock解决方案
- 宅家办公不宅心,送3本技术好书
- Swift翻译之-关于Swift
- CentOS7恢复rm -rf 误删的xfs系统
- matlab 冒泡排序函数,MATLAB实现冒泡排序算法
- 柯美服务器处理文件慢,处理打印机在打印文件时打印速度过慢的原因 看完你就知道了...
- 制造业信息化的伴侣---Windows 2016超融合
- 使用GDK7调试Linux内核之KVM
- UVALive 7456 Least Crucial Node
- 虚拟机linux环境的地址怎么映射给局域网内其他电脑访问
- #199-【莫队】小Z的袜子
- 细数那些年经典有深度的电影
- 微信小程序毕业设计 基于微信校园跑腿小程序系统开题报告
- javaweb JAVA JSP汽车配件销售系统jsp配件销售网站 (jsp电子商务系统,购物商城)在线购物案例
- 怎么办理质量管理体系认证证书ISO9001?