Article

缓存 Memcached

更新于:2026-07-15

第一章:Memcached 概述与基本原理

1.1 什么是 Memcached

概念名称说明注意事项
Memcached一个开源的高性能、分布式内存对象缓存系统,用于加速动态Web应用,减轻数据库负载。是一个纯内存存储系统,重启后数据丢失,不适合持久化场景。
工作模式基于C/S架构,客户端通过Key-Value方式存取数据,服务端不提供持久化功能。所有数据存储在内存中,依赖客户端实现分布式逻辑。
协议支持使用自定义的简单文本协议或二进制协议(可选)进行通信。默认使用文本协议,简单易调试;二进制协议更安全高效,但需客户端支持。
数据结构仅支持字符串类型的Value,复杂结构需由客户端序列化(如JSON、pickle)。Value最大长度通常为1MB,可通过启动参数调整。
开发语言用C语言编写,运行效率高。高性能得益于C语言实现和简洁的内存管理机制。

1.2 Memcached 的核心特性与应用场景

特性/场景名称说明注意事项
高性能读写所有操作在内存中完成,响应时间通常在微秒级。性能受网络延迟和序列化开销影响。
分布式缓存多个Memcached实例独立运行,由客户端通过一致性哈希等算法实现分布。服务端不通信,不共享状态,故障隔离性好,但需客户端处理节点变更。
简单Key-Value存储仅支持字符串Key和Value,操作接口极简。不支持复杂查询、范围操作或数据类型(如List、Hash)。
LRU自动淘汰内存不足时自动按最近最少使用(LRU)策略淘汰旧数据。淘汰的是未访问的数据,频繁访问的数据即使过期也可能暂不释放。
应用场景:页面缓存缓存数据库查询结果、HTML片段、API响应等。适用于读多写少、数据变化不频繁的场景。
应用场景:会话存储存储用户Session信息,支持多服务器共享。需配合超时设置防止内存溢出,注意安全性(如加密敏感信息)。
应用场景:计数器利用incr/decr实现高性能计数。注意避免超限和并发竞争(Memcached本身保证原子性)。

1.3 内存存储机制与 LRU 淘汰策略

概念名称说明注意事项
slab allocation内存分配机制,将内存划分为不同大小的slab class,每个class管理固定大小的chunk。减少内存碎片,但可能导致内部碎片(小数据占用大chunk)。
chunkslab class中的最小内存单元,每个item存储在一个chunk中。若Value超过当前chunk大小,会分配下一个更大的class。
item存储的基本单元,包含Key、Value、Flags、Expiration时间等元信息。Key最大长度为250字节,Value默认最大1MB。
LRU(Least Recently Used)当某个slab class内存不足时,优先淘汰最久未访问的item。LRU链表按slab class维护,不同大小的item不混合淘汰。
Lazy Expiration过期数据不会立即删除,仅在get时检查并标记为无效,后续被新数据覆盖或LRU淘汰。节省CPU资源,但过期数据仍占用内存直到被访问或淘汰。
max memory启动时指定的最大内存使用量(如 -m 64 表示64MB)。超出后触发LRU淘汰,不会继续增长。

1.4 Memcached 与数据库、Redis 的对比

对比项Memcached数据库(如MySQL)Redis注意事项
存储介质内存磁盘(可缓存)内存(支持持久化)Memcached纯内存,速度最快;数据库持久化,Redis折中。
数据结构仅字符串Key-Value表结构,支持复杂查询支持String、List、Hash、Set、Sorted Set等Redis功能更丰富,适合复杂场景。
持久化不支持支持支持RDB和AOF持久化Memcached数据易失,适合缓存;Redis可作存储。
分布式支持客户端分片,服务端无集群主从、分库分表需手动或中间件原生支持Cluster集群Memcached部署简单,但扩容需重新分片;Redis集群更智能。
并发性能高,并发连接数多受磁盘I/O限制,写入较慢高,单线程模型避免锁竞争Memcached适合高并发读场景。
原子操作支持incr/decr、CAS等支持事务支持丰富原子操作及事务三者均支持基本原子性,Redis最强大。
内存管理slab + LRU由数据库引擎管理动态分配,支持多种淘汰策略Memcached内存利用率可能较低(内部碎片)。
适用场景纯缓存,如页面、会话、API结果缓存核心数据存储,要求强一致性缓存、消息队列、实时排行榜、分布式锁等根据数据重要性、结构复杂度和性能要求选择。

第二章:环境搭建与基本操作

2.1 安装 Memcached 服务(Linux/Windows)

系统平台安装方式说明注意事项
Linux (Ubuntu/Debian)使用命令:sudo apt-get install memcached需管理员权限;安装后服务自动注册,但默认不启动。
Linux (CentOS/RHEL)使用命令:sudo yum install memcachedsudo dnf install memcached某些系统需启用EPEL源。
Windows官方不提供原生支持,可使用:
1) memcached for Windows(第三方移植版)
2) WSL中安装Linux版
Windows版本非官方维护,生产环境建议使用Linux;WSL方式更稳定。
源码编译安装下载源码,执行:./configure && make && make install可自定义安装路径和参数,适合高级用户;需安装gcc等编译工具。

2.2 启动与配置 Memcached 服务

操作类型说明注意事项
启动服务(默认配置)执行命令:memcached -d -m 64 -p 11211 -u nobody-d:后台运行;-m:内存大小(MB);-p:端口;-u:运行用户(Linux)
停止服务查找进程PID:ps aux | grep memcached
终止进程:kill <PID>
使用 kill 命令需谨慎,确认PID正确。
设置开机自启Linux:systemctl enable memcached需确保服务已正确安装为系统服务。
验证服务状态使用 telnet 或 netstat 检查端口是否监听:netstat -tuln | grep 11211若未监听,检查服务是否启动及端口是否被占用。

2.3 使用 telnet 连接 Memcached 进行测试

步骤操作说明注意事项
连接服务telnet 127.0.0.1 11211确保telnet客户端已安装,服务IP和端口正确。
存储数据(set)输入:set mykey 0 60 5
hello
(回车后返回 STORED
格式:set key flags exptime bytes [noreply]\r\nvalue\r\n
读取数据(get)输入:get mykey若key不存在,返回 END
删除数据(delete)输入:delete mykey可选参数:delete key [time],延迟删除。
退出 telnet输入:quit或使用 Ctrl + ],然后输入 quit
测试连接连接成功后输入 stats 查看状态信息若无法连接,检查服务是否运行、防火墙是否放行11211端口。

2.4 常用命令行参数说明

参数语法格式用途说明注意事项
-p-p <port>指定监听端口,默认11211生产环境可修改为非默认端口增加安全性。
-m-m <size>设置最大使用内存(MB),如 -m 128建议不超过物理内存的50%-70%。
-c-c <connections>设置最大并发连接数,默认1024高并发场景可调大,但受系统文件描述符限制。
-u-u <username>指定运行用户(仅Linux/Unix)安全起见,不要使用root运行。
-l-l <ip_address>绑定监听IP地址,如 -l 127.0.0.1-l 0.0.0.0(监听所有)生产环境建议绑定内网IP,避免公网暴露。
-d-d以守护进程(后台)方式运行通常与 -u-m 等配合使用。
-t-t <threads>设置线程数,默认4根据CPU核心数调整,通常设置为CPU核心数。
-f-f <factor>slab分配器的增长因子,默认1.25控制chunk大小增长速度,高级调优参数。
-I-I <size>设置每个item的最大大小,如 -I 10m(默认1M)增大可能影响性能和内存碎片。
-v / -vv / -vvv无参数增加输出日志详细程度(-v:一般,-vv:详细,-vvv:非常详细)调试时使用,生产环境避免过高日志级别影响性能。

第三章:Memcached 核心命令详解

3.1 数据存储命令(set, add, replace, append, prepend)

方法名称语法格式用途说明代码示例注意事项
setset key flags exptime bytes [noreply]\r\nvalue\r\n存储一个键值对,无论key是否存在都会覆盖。set name 0 3600 5\r\nalice\r\n若key已存在,原值被替换;bytes为value字节数,必须准确;noreply可选,表示不返回响应。
addadd key flags exptime bytes [noreply]\r\nvalue\r\n仅当key不存在时添加,存在则失败。add age 0 1800 2\r\n25\r\n若key已存在,返回 NOT_STORED;适合防止重复写入。
replacereplace key flags exptime bytes [noreply]\r\nvalue\r\n仅当key存在时替换其值,不存在则失败。replace age 0 1800 2\r\n26\r\n若key不存在,返回 NOT_STORED;用于更新已有数据。
appendappend key bytes [noreply]\r\nvalue\r\n将value追加到指定key的原value末尾,key必须存在。append name 0 3600 3\r\nson\r\n → 得到 “aliceson”原value必须已存在;flags和exptime不变,仅追加数据。
prependprepend key bytes [noreply]\r\nvalue\r\n将value插入到指定key的原value开头,key必须存在。prepend name 0 3600 3\r\nMr.\r\n → 得到 “Mr.alice”与append类似,但插入位置在开头;原value必须存在。

3.2 数据读取命令(get, gets)

方法名称语法格式用途说明代码示例注意事项
getget key1 [key2 ...]\r\n获取一个或多个key对应的value。get name\r\n若key不存在,对应结果返回 END;支持批量获取,提高效率。
getsgets key1 [key2 ...]\r\n获取value的同时返回唯一标识符(cas unique),用于CAS操作。gets name\r\n返回结果包含value和casid,格式为:VALUE key flags bytes casid\r\nvalue\r\n

3.3 数据删除命令(delete)

方法名称语法格式用途说明代码示例注意事项
deletedelete key [time] [noreply]\r\n删除指定key的数据。delete name\r\n若key不存在,返回 NOT_FOUND;存在则返回 DELETED
deletedelete key 5\r\n延迟删除:删除key,并在5秒内拒绝add操作(防立即重建)。delete name 5\r\ntime参数表示”删除后沉默期”,避免缓存穿透攻击。

3.4 数据递增与递减命令(incr, decr)

方法名称语法格式用途说明代码示例注意事项
incrincr key increment\r\n将key对应的value(必须为十进制无符号整数)增加指定数值。incr counter 1\r\nvalue必须是整数字符串;若key不存在或非整数,返回 NOT_FOUNDERROR
decrdecr key decrement\r\n将key对应的value减少指定数值,结果小于0时返回0。decr counter 1\r\n同样要求value为整数;decrement为0时无效,最小结果为0。

3.5 其他管理命令(flush_all, stats, version, quit)

方法名称语法格式用途说明代码示例注意事项
flush_allflush_all [time] [noreply]\r\n立即或延迟清空所有数据(并非真正删除,而是标记过期)。flush_all 10\r\ntime表示延迟清空时间(秒);清空后新写入不受影响;常用于缓存刷新。
statsstats\r\nstats [type]\r\n返回服务器运行状态统计信息。stats\r\n可查看内存使用、连接数、命中率等;stats items 查看各slab使用情况。
versionversion\r\n返回Memcached服务器版本号。version\r\n用于确认服务版本,便于排查兼容性问题。
quitquit\r\n关闭当前telnet连接。quit\r\n退出telnet会话,不影响服务运行。

第四章:客户端操作与编程接口(以 Python 为例)

4.1 安装 Python Memcached 客户端(python-memcached / pymemcache)

客户端库安装命令用途说明注意事项
python-memcachedpip install python-memcached老牌客户端,基于libmemcached,功能完整,支持多服务器。不再积极维护,但稳定;不支持Python 3.10+的新特性。
pymemcachepip install pymemcache现代化纯Python实现,支持二进制协议、连接池、超时设置,推荐使用。性能良好,文档清晰,适合新项目。

4.2 连接 Memcached 服务器

方法名称语法(以 pymemcache 为例)用途说明代码示例注意事项
ClientClient((host, port))创建单个Memcached服务器连接。client = Client(('127.0.0.1', 11211))最基础连接方式,适用于单节点。
PooledClientPooledClient((host, port), max_pool_size=10)创建带连接池的客户端,复用连接,提升高并发性能。client = PooledClient(('127.0.0.1', 11211), timeout=1)推荐生产环境使用;max_pool_size控制最大连接数。
HashClientHashClient([('127.0.0.1', 11211), ('127.0.0.1', 11212)])创建分布式客户端,支持多节点,自动分片。client = HashClient(servers=[('127.0.0.1', 11211)])用于多Memcached实例部署,实现负载均衡。

4.3 set / add / replace 方法

方法名称语法(pymemcache)用途说明代码示例注意事项
setset(key, value, expire=0, noreply=None)存储键值对,覆盖已存在key。client.set('name', 'alice', expire=3600)value需为bytes或str;expire为过期时间(秒);noreply=True不等待响应。
addadd(key, value, expire=0, noreply=None)仅当key不存在时添加。result = client.add('age', '25')若key存在,返回False;成功返回True。
replacereplace(key, value, expire=0, noreply=None)仅当key存在时替换值。result = client.replace('age', '26')若key不存在,返回False;成功返回True。

4.4 get / gets 方法与 CAS 操作

方法名称语法(pymemcache)用途说明代码示例注意事项
getget(key)获取单个key的值。value = client.get('name')若key不存在,返回None。
get_manyget_many(keys)批量获取多个key的值。values = client.get_many(['name', 'age'])返回字典:{key: value},不存在的key不包含在结果中。
getsgets(key)获取value及cas标识符,用于CAS检查。value, cas = client.gets('name')cas是唯一标识,用于cas()方法。
cascas(key, value, cas, expire=0, noreply=None)检查cas标识未变后才更新value,实现乐观锁。client.cas('name', 'bob', cas, expire=3600)若cas不匹配(数据被其他客户端修改),更新失败。

4.5 delete / incr / decr 方法

方法名称语法(pymemcache)用途说明代码示例注意事项
deletedelete(key, noreply=None)删除指定key。result = client.delete('name')成功返回True,key不存在或删除失败返回False。
incrincr(key, value, noreply=False)将key的value增加指定数值。new_val = client.incr('counter', 1)key必须存在且value为整数;返回新值。
decrdecr(key, value, noreply=False)将key的value减少指定数值。new_val = client.decr('counter', 1)同incr,结果最小为0。

4.6 append / prepend 方法

方法名称语法(pymemcache)用途说明代码示例注意事项
appendappend(key, value, noreply=None)将value追加到key原value末尾。client.append('name', 'son')key必须存在;原value和新value都作为字节流拼接。
prependprepend(key, value, noreply=None)将value插入到key原value开头。client.prepend('name', 'Mr.')同append,但插入位置在开头。

4.7 flush_all 与 stats 方法

方法名称语法(pymemcache)用途说明代码示例注意事项
flush_allflush_all(delay=0, noreply=None)清空所有数据(标记过期)。client.flush_all(delay=5)delay表示延迟清空时间(秒);清空后新数据可写入。
statsstats(stat='items')获取服务器状态统计。stats = client.stats()默认返回全部统计;可指定’items’、‘slabs’、‘settings’等类型。

4.8 连接池与超时设置

配置项语法(pymemcache)用途说明代码示例注意事项
timeoutPooledClient(..., timeout=2)设置socket操作超时时间(秒)。client = PooledClient(('127.0.0.1', 11211), timeout=1)防止网络异常导致程序阻塞;建议设置为1-3秒。
connect_timeoutPooledClient(..., connect_timeout=2)设置连接建立超时时间(秒)。client = PooledClient(..., connect_timeout=1, timeout=1)与timeout分开设置,更精细控制。
max_pool_sizePooledClient(..., max_pool_size=10)设置连接池最大连接数。client = PooledClient(..., max_pool_size=20)根据并发量调整,避免过多连接耗尽系统资源。
use_pool默认True是否启用连接池(PooledClient自动启用)。单Client实例不使用池;PooledClient强制使用。

第五章:高级特性与优化策略

5.1 CAS(Check and Set)机制与乐观锁

概念名称说明注意事项
CAS (Check and Set)一种乐观锁机制,用于避免并发写入导致的数据覆盖问题。不同于悲观锁(加锁),CAS在提交时检查数据是否被修改,适合读多写少场景。
工作流程1. 使用 gets 获取value及唯一的cas token
2. 修改value
3. 使用 cas 命令提交,携带原cas token
4. 服务端检查token是否匹配,匹配则更新,否则失败
若两个客户端同时读取,后提交者会因token不匹配而失败,需业务层重试。
应用场景计数器更新、用户信息修改、库存扣减等需要保证原子性的操作。需配合重试机制使用,避免因CAS失败导致业务中断。
客户端实现Python pymemcache中通过 gets()cas() 方法实现。返回值为 (value, cas_token)cas() 成功返回True,失败返回False。

5.2 多节点部署与分布式策略(一致性哈希)

概念名称说明注意事项
分布式架构多个Memcached实例独立运行,由客户端决定数据存储位置。服务端无通信,不共享状态,扩容/缩容影响大。
简单哈希(模运算)key → hash(key) % N(N为节点数)节点增减时大量key映射关系改变,缓存失效严重。
一致性哈希将节点和key映射到一个环形哈希空间,key顺时针找到最近节点。节点变动仅影响局部key,降低缓存失效范围。
虚拟节点(VNode)每个物理节点对应多个虚拟节点,均匀分布于环上,提升负载均衡性。避免数据倾斜,提高分布均匀度。
客户端支持pymemcache 的 HashClient 默认使用一致性哈希算法。可自定义哈希函数(如md5、sha1)。
扩容策略增加新节点后,部分key自动迁移至新节点,旧节点数据逐渐淘汰。建议逐步扩容,并监控命中率变化。

5.3 超时机制与内存管理优化

配置项说明注意事项
Expiration Time数据过期时间,单位秒。0表示永不过期(但可能被LRU淘汰)。推荐设置合理过期时间(如300-3600秒),防止内存泄漏。
Lazy Expiration过期数据不会立即删除,仅在get时检查并标记无效。节省CPU资源,但过期数据仍占内存,直到被访问或LRU回收。
Slab Allocation内存按slab class划分,每个class管理固定大小的chunk。减少碎片,但存在内部碎片(小数据占大chunk)。
Growth Factor (-f)slab class间chunk大小的增长因子,默认1.25。调整为更小值(如1.1)可减少内部碎片,但增加class数量。
Max Item Size (-I)单个item最大大小,默认1MB。可通过启动参数调整(如 -I 10m)。过大value影响性能和内存利用率,建议拆分或改用其他存储。
LRU Crawler后台线程定期扫描slab,主动清理过期item,缓解lazy expiration延迟。需启用:-o lru_crawler;可配置扫描频率。
Memory Limit (-m)最大内存使用量,超出后触发LRU淘汰。建议设置为物理内存的50%-70%,避免OOM。

5.4 监控与性能调优(stats 命令详解)

stats 字段含义说明优化建议
curr_items当前存储的item数量结合total_items观察增长趋势,判断缓存使用率。
bytes当前使用的内存字节数接近limit_maxbytes时,考虑扩容或优化数据结构。
get_hits / get_misses缓存命中/未命中次数计算命中率:hits/(hits+misses),理想>90%。
cmd_get / cmd_setget/set命令总数分析读写比例,评估缓存有效性。
evictions因内存不足被LRU淘汰的item数量若持续增长,说明内存不足,需增加内存或优化过期策略。
bytes_read / bytes_written网络读写字节数评估带宽占用,识别大value瓶颈。
connection_structures / curr_connections分配的连接结构数 / 当前连接数若接近-c限制,需调高最大连接数。
accepting_conns是否接受新连接(1=是,0=否)为0时说明连接满或出错。
hash_power_level哈希表桶数量指数动态增长,若hash_bytes过大可手动调整。
lru_*_moves各slab class中item在LRU队列中的移动次数高频移动可能表示访问模式异常。

调优步骤:

  1. stats 查看整体状态
  2. stats items 查看各slab的item分布
  3. stats slabs 查看各slab的内存使用和淘汰情况
  4. 根据evictions和get_misses定位瓶颈
  5. 调整 -m-f-I 或业务过期策略

5.5 安全配置与访问控制(SASL 认证)

安全措施说明注意事项
SASL 认证Simple Authentication and Security Layer,提供用户名密码认证。Memcached从1.4.3版本开始支持,需编译时启用 --enable-sasl
启用SASL1. 安装sasl2-bin和libsasl2-dev
2. 编译Memcached时添加 --enable-sasl
3. 配置sasldb用户:saslpasswd2 -a memcached username
生产环境必须设置强密码。
启动参数memcached -S -u username -P /tmp/memcached.pid-S 启用SASL)-S 表示强制使用SASL认证。
客户端连接Python pymemcache 支持SASL:username 和 password 参数。client = PooledClient(('127.0.0.1', 11211), username='user', password='pass')
网络隔离绑定内网IP(-l 192.168.1.100),防火墙限制访问。避免Memcached暴露在公网,防止未授权访问和DDoS攻击。
禁用危险命令无法直接禁用,依赖网络层控制。如需禁用flush_all,可在前端代理层过滤。
TLS/SSL 加密Memcached本身不支持TLS,需通过stunnel或HAProxy等反向代理实现加密传输。适用于跨公网或高安全要求场景。

第六章:常见问题与最佳实践

6.1 缓存穿透、缓存击穿、缓存雪崩及应对方案

问题类型定义说明应对方案注意事项
缓存穿透查询不存在的数据,缓存不命中,请求直达数据库,恶意攻击可导致DB崩溃。1. 布隆过滤器(Bloom Filter)拦截无效key
2. 缓存空值(null)并设置短过期时间(如1-5分钟)
空值缓存需及时清理,避免占用过多内存。
缓存击穿热点key过期瞬间,大量请求并发查询,导致DB瞬时压力激增。1. 设置热点数据永不过期(业务层控制)
2. 使用互斥锁(Redis可用,Memcached可结合CAS模拟)
Memcached无内置锁,需依赖外部协调服务或简化逻辑。
缓存雪崩大量key在同一时间过期,缓存层失效,请求全部打到数据库。1. 过期时间加随机抖动(如基础时间+0~300秒)
2. 构建多级缓存(本地缓存+Memcached)
3. 限流降级
随机过期时间是简单有效的方法。

6.2 数据一致性处理策略

策略名称说明适用场景注意事项
写后失效(Write-through + Invalidate)更新数据库后,立即删除(delete)对应缓存key。最常用策略,简单可靠。删除失败可能导致脏读,需结合重试或日志补偿。
写后更新(Write-through + Update)更新数据库后,同步更新缓存。数据变更频繁且读取极多的场景。需保证双写原子性,否则易不一致;推荐先更新DB再更新缓存。
延迟双删1. 先删除缓存
2. 更新数据库
3. 延迟几百毫秒再次删除缓存
解决”先删缓存,DB未更新”期间的脏读问题。延迟时间需大于主从同步延迟。
基于Binlog监听使用Canal/Zongji等工具监听MySQL binlog,异步更新或删除缓存。对一致性要求极高,且无法修改业务代码的场景。架构复杂,引入额外组件,有延迟。

6.3 高并发场景下的使用建议

建议项说明注意事项
使用连接池复用TCP连接,避免频繁创建销毁带来的性能开销。pymemcache的PooledClient是首选。
批量操作使用get_many批量获取,减少网络往返次数。显著提升读取性能,尤其适合页面渲染等场景。
合理设置超时设置合理的socket timeout和connect timeout,防止线程阻塞。建议1-3秒,避免因Memcached故障拖垮整个应用。
控制Value大小避免存储过大的value(>100KB),影响网络和内存效率。大对象可压缩或拆分存储,或改用Redis/文件系统。
监控与告警实时监控命中率、延迟、evictions等指标,设置阈值告警。及时发现性能瓶颈或配置问题。
本地缓存 + Memcached在应用层加一级本地缓存(如dict、LRUCache),减少对Memcached的直接访问。适合极热数据,但需处理本地缓存一致性问题。

6.4 日志分析与故障排查

故障现象可能原因排查方法解决方案
连接失败1. Memcached未运行
2. 防火墙阻止
3. IP/端口错误
4. 连接数满
telnet ip port 测试连通性;ps aux | grep memcached 查进程;netstat 查端口启动服务;开放防火墙;检查 -l-p 参数;增大 -c 参数。
命中率低1. 缓存策略不合理
2. 数据过期太快
3. 缓存容量不足
4. Key设计不佳
stats 查看get_misses和evictions;分析业务逻辑优化Key设计;调整过期时间;增加内存;引入多级缓存。
内存占用过高1. 数据未过期
2. Value过大
3. 内部碎片严重
stats slabs 查看各slab使用情况;stats items 分析item分布设置合理TTL;压缩数据;调整 -f 增长因子;拆分大对象。
性能下降(延迟高)1. 网络延迟
2. CPU/内存瓶颈
3. 连接数过多
4. 大value频繁读写
top/htop 查系统资源;stats 查命令延迟;抓包分析网络优化网络;升级硬件;使用连接池;拆分大value。
flush_all 被误执行脚本或人为误操作清空缓存检查操作日志;监控cmd_flush计数生产环境限制flush_all权限;通过代理层控制;避免直接暴露服务。
SASL认证失败用户名/密码错误;SASL未正确配置检查sasldb用户;确认Memcached编译选项;查看启动日志重新配置用户;确保 -S 参数启用;检查客户端凭据。