memcached

一、概述
Memcached(http://memcached.org/)是⼀一款开源免费的,⾼高性能的分布式内存对象缓存系统。
Memcached是⼀一种基于内存的key-value存储,⽤用来存储⼩小块的任意数据(字符串串、对象)。
Memcached简洁⽽而强⼤大。它的简洁设计便便于快速开发,减轻开发难度,解决了了⼤大数据量量缓存的很多
问题。它的API兼容⼤大部分流⾏行行的开发语⾔言。
二、环境搭建
安装
yum install libevent-devel
tar -zxvf memcached-1.4.31.tar.gz
cd memcached-1.4.31
# 指定memcached安装⽬目录
./configure --prefix=/usr/local/memcached
make && make install
参数说明
启动
./memcached -m 128mb -vv -u root
命令
Memcached可以通过 telnet 命令并指定主机ip和端⼝口来连接 Memcached 服务
如: telnet HOST PORT
三、Java客户端(XMemcached)
XMemcached是基于Java NIO的Memcached客户端,Java NIO相⽐比于传统阻塞io模型来说,有效率
⾼高(特别在⾼高并发下)和资源耗费相对较少的优点。
cd /usr/local/memcached/bin
# 帮助命令
./memcached -h
# ---------------------参数说明----------------------
-p <num> TCP端⼝口,默认为11211,可以不不设置
-l <addr> 监听的 IP 地址,本机可以不不设置此参数
-d 以守护程序(daemon)⽅方式运⾏行行
-u 指定⽤用户,如果当前为 root ,需要使⽤用此参数指定⽤用户
-m <num> 最⼤大内存使⽤用,单位MB。默认64MB
-M 禁⽌止LRU策略略,内存耗尽时返回错误,⽽而不不是删除项
-c <num> 最⼤大同时连接数,默认是1024
-t <num> 线程数,默认4。由于memcached采⽤用NIO,所以更更多线程没有太多作⽤用
-v ⽇日志(错误和警告)
-vv ⽇日志(错误、警告、客户端命令和响应)
-vvv ⾮非常详细的⽇日志
# 存值语法
set key flags exptime bytes
value
key:键值 key-value 结构中的 key,⽤用于查找缓存值。
flags:可以包括键值对的整型参数,客户机使⽤用它存储关于键值对的额外信息 。
exptime:在缓存中保存键值对的时间⻓长度(以秒为单位,0 表示永远)
bytes:在缓存中存储的字节数
# 取值语法
get key
# stats 命令⽤用于返回统计信息例例如 PID(进程号)、版本号、连接数等
stats
特性
高性能
支持完整的协议
支持客户端分布
动态增删节点
允许设置节点权重
Maven坐标
简单示例例
<!--
https://mvnrepository.com/artifact/com.googlecode.xmemcached/xmemcached -->
<dependency>
<groupId>com.googlecode.xmemcached</groupId>
<artifactId>xmemcached</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.2</version>
</dependency>
MemcachedClientBuilder builder = new XMemcachedClientBuilder(
// 多个Memcached Server:host1:port1
host2:port2
AddrUtil.getAddresses("localhost:11211"));
MemcachedClient memcachedClient = builder.build();
try {
// 存储数据 参数⼀一:key名 参数⼆二:expire时间(单位秒)表示永久存储(默认是⼀一个⽉月)
参数三:value值
memcachedClient.set("hello", 0, "Hello,xmemcached");
// 获取数据
String value = memcachedClient.get("hello");
System.out.println("hello=" + value);
// 删除数据
memcachedClient.delete("hello");
value = memcachedClient.get("hello");
System.out.println("hello=" + value);
} catch (MemcachedException e) {
System.err.println("MemcachedClient operation fail");
e.printStackTrace();
} catch (TimeoutException e) {
System.err.println("MemcachedClient operation timeout");
e.printStackTrace();
客户端分布
Memcached的分布是通过客户端实现的,客户端根据key的哈希值得到将要存储的memcached节
点,并将对应的value存储到相应的节点。
1. 余数算法(默认)
按照key的哈希值模以连接数得到的余数,对应的连接就是将要存储的节点
key.hashCode() % nodeCount = nodeIndex
} catch (InterruptedException e) {
// ignore
}
try {
//close memcached client
memcachedClient.shutdown();
} catch (IOException e) {
System.err.println("Shutdown MemcachedClient fail");
e.printStackTrace();
}
缺点:如果服务器器数量量发⽣生变化,所有的服务器器的缓存在同⼀一时间失效,会导致所有压⼒力力都在⼀一个时
间集中到数据库服务器器上
2. ⼀一致性哈希
原理理可参考:https://www.cnblogs.com/lpfuture/p/5796398.html
⾸首先求出memcached服务器器(节点)的哈希值,并将其配置到0~232的圆(continuum)上。
然后采⽤用同样的⽅方法求出存储数据的键的哈希值,并映射到相同的圆上。
然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第⼀一个服务器器上。如果超过232
仍然找不不到服务器器,就会保存到第⼀一台memcached服务器器上
添加⼀一台memcached服务器器。余数分布式算法由于保存键的服务器器会发⽣生巨⼤大变化⽽而影响缓存
的命中率,但Consistent Hashing中,只有在圆(continuum)上增加服务器器的地点逆时针⽅方向
的第⼀一台服务器器上的键会受到影响,如下图所示:
CAS操作
Memcached是通过CAS协议实现原⼦子更更新,所谓原⼦子更更新就是compare and set,原理理类似乐观锁,
每次请求存储某个数据同时要附带⼀一个CAS值,memcached⽐比对这个CAS值与当前存储数据的CAS值
是否相等,如果相等就让新的数据覆盖⽼老老的数据,如果不不相等就认为更更新失败,这在并发环境下特别
有⽤用。
CAS协议其实是分为两个步骤:获取CAS值和尝试更更新
命名空间
从1.4.2开始,xmemcached提供了了memcached命名空间的封装使⽤用,你可以将⼀一组缓存项放到同⼀一
个命名空间下,可以让整个命名空间下所有的缓存项同时失效
GetsResponse<Integer> result = client.gets("a");
long cas = result.getCas();
//尝试将a的值更更新为2
if (!client.cas("a", 0, 2, cas)) {
System.err.println("cas error");
}
String ns = "namespace" ;
this.memcachedClient.withNamespace(ns,
new MemcachedClientCallable<Void>() {
注:更更全⾯面的例例⼦子、迭代所有的key、Incr/Decr、查看统计信息、Spring框架集成等可参阅
Xmemcached⽤用户指南。
四、应⽤用
分布式集群
Memcached的分布是通过客户端实现的(具体可参阅:章节三之客户端分布)
数据库缓存
如:使⽤用Memcached管理理Mybatis⼆二级缓存,构建分布式缓存
参考资料料:http://www.mybatis.org/memcached-cache/
1. Maven坐标
public Void call(MemcachedClient
client)
throws
MemcachedException, InterruptedException,
TimeoutException {
//a,b,c都在namespace下
client.set("a",1);
client.set("b",1);
client.set("c",1);
return null;
}
});
//获取命名空间内的a对应的值
Integer aValue = this.memcachedClient.withNamespace(ns,
new MemcachedClientCallable<Integer>() {
public Integer call(MemcachedClient
client)
throws
MemcachedException, InterruptedException,
TimeoutException {
return client.get("a");
}
});
//使得命名空间失效
this.memcachedClient.invalidateNamespace(ns);
2. 配置Mapper⽂文件
Property Default Description
org.mybatis.caches.memcached.keyprefix mybatis_ any string identifier
org.mybatis.caches.memcached.servers localhost:11211 space separated list of ${host}:${port}
org.mybatis.caches.memcached.connectionfactory net.spy.memcached.DefaultConnectionFactory
Any class that implements
net.spy.memcached.ConnectionFactory
org.mybatis.caches.memcached.expiration the number of seconds in 30 days the expiration time (in seconds)
org.mybatis.caches.memcached.asyncget
false
flag to enable/disable the async get
org.mybatis.caches.memcached.timeout 5 the timeout when using async get
org.mybatis.caches.memcached.timeoutunit java.util.concurrent.TimeUnit.SECONDS the timeout unit when using async get
org.mybatis.caches.memcached.compression
false
if true, objects will be GZIP compressed
before putting them to Memcached
3. 准备配置⽂文件(memcached.properties)并放置在src/main/resources/下,如果未提供,将使
⽤用默认配置
4. 需要⽇日志缓存操作
5. 测试缓存
服务器器间的数据共享
如:服务器器session集中式管理理
参考资料料:https://github.com/magro/memcached-session-manager/wiki/SetupAndConfiguratio
n
1. 导⼊入jar包到服务器器 tomcat\lib⽬目录
memcached-session-manager-${version}.jar
<dependency>
<groupId>org.mybatis.caches</groupId>
<artifactId>mybatis-memcached</artifactId>
<version>1.0.0</version>
</dependency>
<mapper namespace="org.acme.FooMapper">
<cache type="org.mybatis.caches.memcached.MemcachedCache" />
...
</mapper>
<mapper namespace="org.acme.FooMapper">
<cache type="org.mybatis.caches.memcached.LoggingMemcachedCache" />
...
</mapper>
memcached-session-manager-tc7-1.9.7.jar
spymemcached-2.11.1.jar
选择序列列化⽅方案所有相关jar包(在这⾥里里使⽤用kryo)
2. 修改配置⽂文件
3. 分别启动tomcat1和tomcat2测试
学习资料料:
1. memcached的内存存储机制:https://www.cnblogs.com/zhoujinyi/p/5554083.html
2. memcached相关⾯面试问题:https://blog.youkuaiyun.com/wwd0501/article/details/46851119
3. ⼤大型Web系统数据缓存设计:https://www.cnblogs.com/siqi/p/5096317.html
4. 缓存穿透、缓存击穿与失效时的雪崩效应:https://blog.youkuaiyun.com/zeb_perfect/article/details/5
4135506
5. Redis与Memcached的区别:https://blog.youkuaiyun.com/tonysz126/article/details/8280696/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值