TL;DR
- 场景: Java 应用想在本地或小团队环境体验 Netflix EVCache,但服务端未开源,只能基于 Memcached 自建
- 结论: 通过源码编译 Memcached 1.6.39,并按 EVCache 的节点配置规范启动,就能完成基本读写与链路验证
- 产出: 从编译安装 Memcached、启动参数说明,到 EVCache Client POM 依赖与示例代码的一条龙配置指引
版本矩阵
| 组件/环境 | 版本/说明 | 已验证 |
|---|---|---|
| Memcached | 1.6.39 | 是 |
| libevent | 系统仓库默认 | 是 |
| EVCache Client | 4.139.0 | 是 |
| spymemcached | 2.12.3 | 是 |
| Eureka Client | 1.5.6 | 是 |
安装 Memcached
介绍
Memcached 是一个开源的、高性能的分布式内存对象缓存系统,主要用于减轻数据库负载,提升动态 Web 应用的访问速度。
核心特性:
- 内存存储: 所有数据都存储在内存中,读写速度极快
- 键值存储: 采用简单的键值对(key-value)存储结构
- 分布式架构: 支持多服务器集群部署
- LRU 算法: 当内存不足时,采用最近最少使用算法自动清除数据
安装步骤
- 安装依赖
yum install libevent libevent-devel gcc-c++
- 下载并编译
cd /opt/software
wget http://memcached.org/latest
tar -zxvf latest
cd memcached-1.6.39
./configure --prefix=/usr/memcached
make
make install
- 启动参数说明
| 参数 | 说明 |
|---|---|
| -d | 以守护进程模式启动 |
| -m | 内存大小(MB) |
| -u | 运行用户 |
| -l | 监听地址 |
| -p | 端口号(默认11211) |
| -c | 最大并发连接数 |
| -P | PID文件路径 |
启动示例:
./memcached -d -m 1000 -u root -l 0.0.0.0 -p 11211 -c 256 -P /tmp/memcached.pid
使用 EVCache Client
POM 依赖
<dependencies>
<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>
</dependencies>
示例代码
package icu.wzk;
import com.netflix.evcache.EVCache;
public class CacheDemo01 {
public static void main(String[] args) throws Exception {
String server = "SERVERGROUP1=172.16.1.130:11211";
System.setProperty("EVCACHE_1.use.simple.node.list.provider", "true");
System.setProperty("EVCACHE_1-NODES", server);
EVCache evCache = new EVCache.Builder()
.setAppName("EVCACHE_1")
.build();
evCache.set("wzk", "icu", 10);
String data = evCache.get("wzk");
System.out.println(data);
}
}
错误速查
| 症状 | 根因 | 修复方式 |
|---|---|---|
| EVCache get 返回 null | key 过期时间过短或拼写不一致 | 延长过期时间,确认 key 命名 |
| Connection refused | -l 监听地址与客户端不一致 | 使用 0.0.0.0 或正确 IP |
| 权限 denied | pid 文件目录无写权限 | 调整目录权限 |