EVCache介绍
它是一个开源、快速的分布式缓存,是基于Memcached的内存存储和Spymemcached客户端实现的,是由知名公司Netflix开发的,命名还是挺有意思的,各个英文都有具体含义
E:Ephemeral,数据存储是暂时的,有自身的存活时间
V:Volatile,数据可以在任何时候消息
Cache:内存型键值对存储
看一下架构图,这个图网上很多教程都会有所展现:
其中:
- Rend服务:它是一个代理服务,是用GO开发的,能够高性能的处理开发
- Memcached:基于内存的键值对缓存服务器
- Mnemonic:基于硬盘的嵌入式键值对存储服务器,封装了RocksDB
来看一下官网提供的一些数据解析:
- EVCache集群在峰值每秒可以处理200KB的请求Netflix自己的生产服务器部署的EVCache经常要处理每秒3000w的请求,存储数十亿个对象,跨数千台Memcached服务器,整个EVCache集群每天处理近2万亿的请求量
- EVCache集群相应平均延时大约是1-5ms。最多不会超过20ms
- EVCache集群的缓存命名率在99%左右
整体来看,该缓存在处理请求上的情况还是很可观的
EVCache的应用
应用场景
EVCache适合对数据强一致性要求过高要求的场景
扩展性
EVCache是线性扩展,最快可以在一分钟之内完成扩展,而且在未来几分钟内完成负载均衡和缓存预热
部署方式
EVCache支持两种部署方式:单机和高可用区部署
EVCache的安装和开发
因为Netflix没有开源的EVCache,所以这里面就采用Memcached作为服务器
安装Memcached
linux安装
1、下载插件
yum install libevent libevent-devel gcc-c++
2、下载安装包,并上传到服务器
下载连接:http://memcached.org/latest
3、解压并进入根目录
#解压 tar -zxvf memcached-1.6.12.tar.gz #进入目录 cd memcached-1.6.12 #配置 ./configure --prefix=/usr/memcached #编译 make #安装 make install
4、启动服务
#在当前目录不用动,直接运行,后面的参数根据自己环境配置一下即可 ./memcached -d -m 10 -u root -l 127.0.0.1 -p 11211 -c 256 -P /opt/memcached.pid #-d 选项是启动一个守护进程 #-m 是分配给Memcache使用的内存数量,单位是MB,我这里是10MB #-u 是运行Memcache的用户,我这里是root #-l 是监听的服务器IP地址,我这里指定了服务器的IP本地地址127.0.0.1 #-p 是设置Memcache监听的端口,默认是11211,我这里也就直接用了,最好是1024以上的端口 #-c 选项是最大运行的并发连接数,默认是1024,我这里设置了256,按照你服务器的负载量来设定 #-P 是设置保存Memcache的pid文件,我这里是保存在/opt/memcached.pid
5、查看进程是否存在
ps -ef|grep memcached
看到有一个和上面启动命令一样的进程回显,就说明启动成功了
Windows安装
windows安装就很简单了,首先要开启telnet客户端,然后再下载Memcached二进制文件,执行启动即可:
文件下载:http://s3.amazonaws.com/downloads.northscale.com/memcached-win32-1.4.4-14.zip
解压后启动命令:memcached.exe -d start
有些童鞋这个时候会报错:failed to start service
解决方案:运行命令:memcached.exe -d install,因为要先安装,然后再执行启动命令即可
验证方式:打开cmd,执行telnet 127.0.0.1 11211,看看是否进入到客户端(小黑屏),如果进入小黑屏说明启动完成
开发EVCache
我使用的环境是windows环境
1、添加pom
<dependency> <groupId>com.netflix.evcache</groupId> <artifactId>evcache-client</artifactId> <version>4.139.0</version> </dependency> <dependency> <groupId>net.spy</groupId> <artifactId>spymemcached</artifactId> <version>2.12.3</version> </dependency> <dependency> <groupId>com.netflix.eureka</groupId> <artifactId>eureka-client</artifactId> <version>1.5.6</version> <scope>runtime</scope> </dependency> <dependency> <groupId>com.netflix.spectator</groupId> <artifactId>spectator-nflx-plugin</artifactId> <version>0.80.1</version> <scope>runtime</scope> </dependency> <dependency> <groupId>com.netflix.spectator</groupId> <artifactId>spectator-api</artifactId> <version>0.80.1</version> </dependency> <dependency> <groupId>com.netflix.rxjava</groupId> <artifactId>rxjava-core</artifactId> <version>0.20.7</version> </dependency> <dependency> <groupId>com.netflix.servo</groupId> <artifactId>servo-core</artifactId> <version>0.12.25</version> </dependency> <dependency> <groupId>com.google.code.findbugs</groupId> <artifactId>annotations</artifactId> <version>3.0.1</version> </dependency> <dependency> <groupId>com.netflix.nebula</groupId> <artifactId>nebula-core</artifactId> <version>4.0.1</version> <scope>runtime</scope> </dependency> <dependency> <groupId>com.netflix.archaius</groupId> <artifactId>archaius2-core</artifactId> <version>2.3.13</version> <scope>runtime</scope> </dependency> <dependency> <groupId>com.netflix.archaius</groupId> <artifactId>archaius-aws</artifactId> <version>0.6.0</version> </dependency> <dependency> <groupId>javax.inject</groupId> <artifactId>javax.inject</artifactId> <version>1</version> </dependency> <dependency> <groupId>io.reactivex</groupId> <artifactId>rxjava</artifactId> <version>1.3.8</version> </dependency>
2、编写main方法
public class EVCacheDemo { public static void main(String[] args) throws EVCacheException { String evcacheServer = System.getenv("EVCACHE_SERVER"); if(evcacheServer == null){ evcacheServer="SERVERGROUP1=127.0.0.1:11211"; } System.setProperty("EVCACHE_1.use.simple.node.list.provider", "true"); System.setProperty("EVCACHE_1-NODES", evcacheServer); EVCache evCache = new EVCache.Builder().setAppName("EVCACHE_1").build(); // s:key t :value i:ttl evCache.set("name","caobing",10); String v = evCache.get("name"); System.out.println(v); } }
3、启动观察日志