TL;DR

  • 场景: Java 应用想在本地或小团队环境体验 Netflix EVCache,但服务端未开源,只能基于 Memcached 自建
  • 结论: 通过源码编译 Memcached 1.6.39,并按 EVCache 的节点配置规范启动,就能完成基本读写与链路验证
  • 产出: 从编译安装 Memcached、启动参数说明,到 EVCache Client POM 依赖与示例代码的一条龙配置指引

版本矩阵

组件/环境版本/说明已验证
Memcached1.6.39
libevent系统仓库默认
EVCache Client4.139.0
spymemcached2.12.3
Eureka Client1.5.6

安装 Memcached

介绍

Memcached 是一个开源的、高性能的分布式内存对象缓存系统,主要用于减轻数据库负载,提升动态 Web 应用的访问速度。

核心特性:

  1. 内存存储: 所有数据都存储在内存中,读写速度极快
  2. 键值存储: 采用简单的键值对(key-value)存储结构
  3. 分布式架构: 支持多服务器集群部署
  4. LRU 算法: 当内存不足时,采用最近最少使用算法自动清除数据

安装步骤

  1. 安装依赖
yum install libevent libevent-devel gcc-c++
  1. 下载并编译
cd /opt/software
wget http://memcached.org/latest
tar -zxvf latest
cd memcached-1.6.39
./configure --prefix=/usr/memcached
make
make install
  1. 启动参数说明
参数说明
-d以守护进程模式启动
-m内存大小(MB)
-u运行用户
-l监听地址
-p端口号(默认11211)
-c最大并发连接数
-PPID文件路径

启动示例:

./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 返回 nullkey 过期时间过短或拼写不一致延长过期时间,确认 key 命名
Connection refused-l 监听地址与客户端不一致使用 0.0.0.0 或正确 IP
权限 deniedpid 文件目录无写权限调整目录权限