Java-191 Netflix EVCache Client 接入 Memcached 实战:安装、配备与踩坑记录

news/2026/1/21 15:31:27/文章来源:https://www.cnblogs.com/gccbuaa/p/19512110

TL;DR

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

Java-191 Netflix EVCache Client 接入 Memcached 实战:安装、配置与踩坑记录

版本矩阵

组件/环境版本/说明已验证说明
Memcached1.6.39按文中步骤在 Linux 环境下载源码、./configure 编译并安装。
libevent系统仓库默认(yum 安装)通过 yum install libevent libevent-devel gcc-c++ 获取。
EVCache Client4.139.0作为核心客户端依赖,负责与 Memcached 通信与封装。
spymemcached2.12.3EVCache 底层 Memcached 客户端实现,需与服务端协议兼容。
Eureka Client1.5.6(runtime)文中作为依赖引入,当前示例中主要满足 EVCache 依赖链。
Spectator0.80.1用于指标采集与监控,示例中作为运行时组件引入。
Archaius / Archaius20.6.0 / 2.3.13动态配置组件,满足 EVCache 配置体系依赖。

安装使用

由于Netflix没有开源 EVCache的服务器部分,这里采用 Memcached 作为服务器。

Memcached 介绍

Memcached 是一个开源的、高性能的分布式内存对象缓存系统,主要用于减轻数据库负载,提升动态 Web 应用的访问速度。它通过在内存中缓存数据和对象来减少对数据库的直接访问次数,从而提高动态网站的性能。

核心特性

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

工作原理

当应用程序需要数据时:

  1. 首先检查 Memcached 中是否存在该数据
  2. 如果存在(缓存命中),直接从内存返回结果
  3. 如果不存在(缓存未命中),则从数据库获取数据,并将结果存入 Memcached 供后续使用

典型应用场景

  • 数据库查询缓存:缓存频繁访问的数据库查询结果
  • 会话存储:存储用户会话信息
  • API 缓存:缓存第三方 API 的响应结果
  • 页面片段缓存:缓存动态页面的部分内容

优势与局限

优势

局限

基本命令示例

# 连接 Memcached
telnet localhost 11211
# 存储数据
set key 0 900 10
helloworld
# 获取数据
get key

Memcached 通常与 MySQL、PostgreSQL 等关系型数据库配合使用,是构建高性能 Web 应用的重要组件之一。

安装 Memcached

# 安装libevent库
yum install libevent libevent-devel gcc-c++
cd /opt/software
# 下载最新的memcached
wget http://memcached.org/latest
tar -zxvf latest

Memcached 安装测试

cd memcached-1.6.39
./configure --prefix=/usr/memcached
make
make install

Memcached 编译

./memcached -d -m 1000 -u root -l 0.0.0.0 -p 11211 -c 256 -P /tmp/memcached.pid

以下是扩展后的内容,增加了参数说明和使用示例:

  • -d 选项:以守护进程(daemon)模式启动Memcache服务,使服务在后台运行而不占用终端。例如:memcached -d 会立即返回shell提示符。

  • -m 参数:设置分配给Memcache服务使用的内存总量,单位为MB。例如:-m 64表示分配64MB内存。建议根据服务器可用内存合理配置,通常设置为总内存的10-30%。

  • -u 参数:指定运行Memcache服务的系统用户。出于安全考虑,建议使用非root用户。例如:-u nobody会以nobody用户身份运行服务。

  • -l 参数:设置Memcache监听的服务器IP地址。默认监听所有可用网络接口(0.0.0.0)。例如:-l 192.168.1.100只监听指定IP。

  • -p 参数:配置Memcache服务监听的TCP端口号,默认是11211。例如:-p 11211。如果修改默认端口,客户端连接时需指定相同端口。

  • -c 参数:设置最大并发连接数,默认1024。在高并发场景下可能需要调高此值。例如:-c 2048允许最多2048个并发连接。

  • -P 参数:指定存储Memcache进程ID(pid)的文件路径。例如:-P /var/run/memcached.pid。通过pid文件可以方便地管理服务进程。

典型启动示例:

memcached -d -m 256 -u memcache -l 192.168.1.100 -p 11211 -c 2048 -P /var/run/memcached.pid

这个命令会启动一个Memcache守护进程,分配256MB内存,以memcache用户身份运行,监听192.168.1.100的11211端口,允许2048个并发连接,并将进程ID保存在指定文件。

Memcached 启动服务

使用 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><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>
</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);
}
}

测试运行代码如下:
Memcached 运行测试

错误速查

症状根因定位思路修复方式
Java 代码中 EVCache set 正常,get(“wzk”) 返回 null 或空key 过期时间过短,或拼写不一致,或 Memcached 未正确启动通过 telnet host 11211 手动 get key,确认服务端是否有值且未过期延长过期时间参数,统一 key 命名;确保 Memcached 已正常启动且无重启/杀进程
客户端启动时报 Connection refused 或超时-l 监听地址与客户端连接地址不一致,或端口被防火墙拦截在服务端执行 `netstat -ntlpgrep 11211` 确认监听地址与端口;检查防火墙
使用文中命令启动 Memcached 报 permission denied-P 指定的 pid 文件路径目录无写权限,或非 root 用户无权限检查 /tmp/memcached.pid 或自定义路径的目录权限与所属用户将 -P 指向有写权限的目录,或调整目录权限;生产中使用专门的非 root 用户与目录
Memcached 启动后占用内存远高于预期-m 设置过大,或多实例叠加,或系统其他进程内存紧张通过 `ps auxgrep memcachedtop` 观察内存占用与参数
编译阶段 ./configure 或 make 报找不到 libevent 等错误未安装 libevent-devel 或编译工具链不完整检查 `yum list installedgrep libevent`,确认是否安装 -devel 包
EVCache Client 运行时报依赖冲突或 NoSuchMethodError项目中已有不同版本的 rxjava/spectator 等依赖导致冲突通过 mvn dependency:tree 排查同名依赖的版本,定位冲突来源使用 Maven 依赖排除()或在父 POM 锁定统一版本,减少多版本并存
通过 telnet set/get 正常,但 Java 中读写报错或乱码字符编码、序列化方式不一致,或客户端对 value 做了自定义处理对比 telnet 与 Java 中的实际字节内容,检查序列化/编码设置确保客户端与服务器统一使用 UTF-8 等约定编码;若有自定义序列化,要在文中提示读者注意
本地能连,跨机器连不上 Memcached-l 绑定为 127.0.0.1,外部机器无法访问在服务端确认 -l 参数值和监听 IP;用外部机器 telnet IP 11211 测试将 -l 修改为内网 IP 或 0.0.0.0 并重启服务,必要时调整安全组与防火墙策略

其他系列

AI篇持续更新中(长期更新)

AI炼丹日志-29 - 字节跳动 DeerFlow 深度研究框斜体样式架 私有部署 测试上手 架构研究,持续打造实用AI工具指南!
AI研究-132 Java 生态前沿 2025:Spring、Quarkus、GraalVM、CRaC 与云原生落地
AI模块直达链接

Java篇持续更新中(长期更新)

Java-180 Java 接入 FastDFS:自编译客户端与 Maven/Spring Boot 实战
MyBatis 已完结,Spring 已完结,Nginx已完结,Tomcat已完结,分布式服务已完结,Dubbo已完结,MySQL已完结,MongoDB已完结,Neo4j已完结,FastDFS 已完结,OSS正在更新… 深入浅出助你打牢基础!
Java模块直达链接

大数据板块已完成多项干货更新(300篇):

包括 Hadoop、Hive、Kafka、Flink、ClickHouse、Elasticsearch 等二十余项核心组件,覆盖离线+实时数仓全栈!
大数据-278 Spark MLib - 基础介绍 机器学习算法 梯度提升树 GBDT案例 详解
大数据模块直达链接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1195190.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jmeter测试脚本编写技巧

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 JMeter 是一款开源软件&#xff0c;用于进行负责测试、性能测试及功能测试。测试人员可以使用 JMeter 编写测试脚本&#xff0c;模拟多种不同的负载情况&#xff0…

如何使用Pytest进行测试?

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快开始使用 Python 进行测试可能十分困难。Python 的标准库确实提供了一些用于编写测试的实用程序和帮助程序&#xff0c;但也有一些缺点可能会导致编写比较困难。Pyt…

PyTorch环境配置太复杂?一键部署镜像提效实战

PyTorch环境配置太复杂&#xff1f;一键部署镜像提效实战 你是不是也经历过这样的场景&#xff1a;为了跑一个深度学习项目&#xff0c;光是配环境就花了一整天&#xff1f;装PyTorch版本不对、CUDA不兼容、依赖包冲突、jupyter起不来……最后还没开始写代码&#xff0c;心态先…

说说2026年口碑不错的企业AI培训公司,广州量剑数智值得关注

在AI技术重塑商业竞争格局的当下,一套适配企业业务场景的AI营销体系,是中小企业突破流量困局、实现精准获客的核心抓手。面对市场上鱼龙混杂的企业AI培训服务,如何找到既懂技术又懂行业的靠谱伙伴?以下结合不同服务…

MCP协议赋能AI实时决策(打破数据延迟壁垒)

第一章&#xff1a;MCP 协议如何解决大模型无法访问实时数据的问题 大型语言模型在处理任务时通常依赖于训练阶段所获取的静态知识&#xff0c;难以直接获取和响应外部系统的实时数据。MCP&#xff08;Model Communication Protocol&#xff09;协议通过定义标准化的数据交互接…

PyTorch镜像支持A800吗?CUDA 12.1适配性实战验证

PyTorch镜像支持A800吗&#xff1f;CUDA 12.1适配性实战验证 1. 引言&#xff1a;为什么这个问题值得深挖&#xff1f; 你是不是也遇到过这种情况&#xff1a;刚拿到一块A800显卡&#xff0c;满心欢喜地想跑PyTorch训练任务&#xff0c;结果一运行就报错“CUDA not available…

620-0041C处理器电源模块

620-0041C 处理器电源模块简介620-0041C 是 Honeywell 控制系统中的工业级处理器电源模块&#xff0c;主要用于为主 CPU 和相关 I/O 模块提供稳定的直流电源&#xff0c;是系统正常运行的基础保障。模块功能与特点&#xff1a;为控制器主 CPU 及 I/O 模块提供稳定直流电源将交流…

揭秘Claude Desktop无法识别MCP Server路径:3步快速定位配置陷阱

第一章&#xff1a;Claude Desktop 无法识别自定义 mcp server 路径 当用户尝试在 Claude Desktop 中集成本地开发的 MCP&#xff08;Model Control Protocol&#xff09;server 时&#xff0c;常见现象是应用启动后未建立连接&#xff0c;且日志中提示 failed to resolve mcp …

dify接入企业微信群聊机器人详细步骤(从零到上线全记录)

第一章&#xff1a;dify接入企业微信群聊机器人详细步骤&#xff08;从零到上线全记录&#xff09; 准备工作&#xff1a;获取企业微信机器人Webhook URL 在企业微信管理后台创建群聊机器人&#xff0c;获取唯一的 Webhook 地址。该地址用于外部系统向指定群组发送消息。登录企…

Live Avatar企业培训:内部团队部署培训教程

Live Avatar企业培训&#xff1a;内部团队部署培训教程 1. 引言与学习目标 你是否正在为团队寻找一个高效、逼真的数字人解决方案&#xff1f;Live Avatar是由阿里联合高校开源的一款前沿数字人模型&#xff0c;支持通过文本、图像和音频驱动生成高质量的虚拟人物视频。它在教…

Qwen语音版来了?CAM++中文声纹识别专项评测

Qwen语音版来了&#xff1f;CAM中文声纹识别专项评测 1. 引言&#xff1a;当声纹识别遇上中文场景 你有没有想过&#xff0c;仅凭一段语音就能判断说话人身份&#xff1f;这听起来像是科幻电影里的桥段&#xff0c;但在AI技术飞速发展的今天&#xff0c;它已经变成了现实。而…

如何高效查找国外的文献:实用方法与技巧指南

刚开始做科研的时候&#xff0c;我一直以为&#xff1a; 文献检索就是在知网、Google Scholar 里反复换关键词。 直到后来才意识到&#xff0c;真正消耗精力的不是“搜不到”&#xff0c;而是—— 你根本不知道最近这个领域发生了什么。 生成式 AI 出现之后&#xff0c;学术检…

cv_unet_image-matting WebUI界面颜色能改吗?二次开发入门必看

cv_unet_image-matting WebUI界面颜色能改吗&#xff1f;二次开发入门必看 1. 紫蓝渐变界面背后的技术逻辑 你有没有用过那种一打开就是紫蓝渐变色调的WebUI工具&#xff1f;cv_unet_image-matting就是这样一个项目。它的界面美观、操作直观&#xff0c;但很多开发者第一次看…

AI驱动安全分析平台的迁移激励计划

Elastic 为 Splunk 用户推出快速迁移计划 借助 AI 驱动的安全分析实现升级&#xff0c;现提供激励措施以简化并加速您的 SIEM 迁移 作者&#xff1a;Santosh Krishnan 发布日期&#xff1a;2024年8月7日 SIEM 正在再次演进。在现代安全运营中心&#xff08;SOC&#xff09;中&a…

中小企业AI转型必看:YOLOv11低成本部署实战案例

中小企业AI转型必看&#xff1a;YOLOv11低成本部署实战案例 在人工智能加速落地的今天&#xff0c;中小企业如何以低成本、高效率实现技术升级&#xff0c;成为决定竞争力的关键。计算机视觉作为AI应用最广泛的领域之一&#xff0c;目标检测技术尤为关键。而YOLO&#xff08;Y…

「PPG/EDA信号处理——(8)基于 PPG 和 EDA 的情绪刺激响应分析研究」2026年1月21日

目录 1. 引言 2. 方法 2.1 数据采集与实验设计 2.2 信号预处理原理与算法 2.2.1 PPG信号预处理 2.2.2 EDA信号预处理 2.3 特征提取算法 2.3.1 PPG特征提取 2.3.2 EDA特征提取 2.4 统计分析 3. 结果 3.1 PPG信号预处理 3.2 EDA信号预处理 3.3 心率检测结果 3.4 试…

Z-Image-Turbo一文详解:从安装到生成图片完整流程

Z-Image-Turbo一文详解&#xff1a;从安装到生成图片完整流程 你是否还在为复杂的图像生成流程头疼&#xff1f;有没有一款工具&#xff0c;既能快速上手&#xff0c;又能稳定输出高质量图片&#xff1f;Z-Image-Turbo 正是为此而生。它集成了高效的模型推理能力与简洁直观的 …

Qwen3-Embedding-0.6B与BAAI对比:中文文本分类任务评测

Qwen3-Embedding-0.6B与BAAI对比&#xff1a;中文文本分类任务评测 1. Qwen3-Embedding-0.6B 介绍 Qwen3 Embedding 模型系列是 Qwen 家族的最新专有模型&#xff0c;专门设计用于文本嵌入和排序任务。基于 Qwen3 系列的密集基础模型&#xff0c;它提供了从 0.6B 到 8B 不同规…

Quill富文本编辑器HTML导出功能存在XSS漏洞分析

Quill 因HTML导出功能易受XSS攻击 CVE-2025-15056 GitHub Advisory Database 漏洞详情 包管理器&#xff1a; npm 包名称&#xff1a; quill 受影响版本&#xff1a; 2.0.3 已修补版本&#xff1a; 无 描述&#xff1a; Quill 的 HTML 导出功能中存在数据验证缺失漏洞&am…

620-0036电源模块

620-0036 电源模块简介620-0036 是 Honeywell 控制系统中的工业电源模块&#xff0c;主要作用是为控制器及其附属模块提供稳定的直流电源&#xff0c;确保整个系统在各种工业环境下可靠运行。功能特点&#xff1a;提供控制器主机及 I/O 模块所需的稳定直流电源能将交流电源转换…