MemCached 是以LiveJournal 旗下Danga Interactive 公司的Brad Fitzpatric 为首开发的一款软件。

现在已成为 mixi、 hatena、 Facebook、 Vox、LiveJournal等众多服务中提高Web应用扩展性的重要因素。

 

memcached 官网https://memcached.org

memcached 源码https://github.com/memcached/memcached

 

目前,Web应用都将数据保存到RDBMS中,应用服务器从中读取数据并在浏览器中显示。

但随着数据量的增大、访问的集中,就会出现RDBMS的负担加重、数据库响应恶化、 网站显示延迟等重大影响。

memcached是高性能的分布式内存缓存服务器,其使用目的是通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、 提高可扩展性。

1、MemCached 特点

  • 协议简单
  • 基于libevent的事件处理
  • 内置内存存储方式
  • memcached不互相通信的分布式

1) 协议简单

memcached的服务器客户端通信并不使用复杂的XML等格式, 而使用简单的基于文本行的协议。

因此,通过telnet 也能在memcached上保存数据、取得数据。

 

2)基于libevent的事件处理

libevent 是个程序库,它将Linux的epoll、BSD类操作系统的kqueue等事件处理功能封装成统一的接口。

即使对服务器的连接数增加,也能发挥O(1)的性能。

memcached使用这个libevent库,因此能在Linux、BSD、Solaris等操作系统上发挥其高性能。

The libevent API provides a mechanism to execute a callback function when a specific event occurs on a file descriptor or after a timeout has been reached. Furthermore, libevent also support callbacks due to signals or regular timeouts.

libevent is meant to replace the event loop found in event driven network servers. An application just needs to call event_dispatch() and then add or remove events dynamically without having to change the event loop.

Currently, libevent supports /dev/pollkqueue(2)event portsPOSIX select(2)Windows select()poll(2), and epoll(4).

 

3) 内置内存存储方式

为了提高性能,memcached中保存的数据都存储在memcached内置的内存存储空间中。

由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失

另外,内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。

memcached本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题。

 

4) memcached不互相通信的分布式

memcached尽管是“分布式”缓存服务器,但服务器端并没有分布式功能。

各个memcached不会互相通信以共享信息。

那么,怎样进行分布式呢? 这完全取决于客户端的实现

 

Memcached 和 Redis 比较

比较类别 Redis memcached
支持的数据结构 字符串、哈希、列表、集合、有序集合 纯kev-value
持久化支持 有(在磁盘上),RDB和AOF两种方式
高可用支持 redis支持集群功能,可以实现主动复制,读写分离官方也提供了sentinel集群管理工具,能够实现主从服务监控,故障自动转移,这一切,对于客户端都是透明的,无需程序改动,也无需人工介入 需二次开发,在客户端实现
存储value容量 最大512M 最大1M
内存分配 临时申请空间,可能导致碎片 预分配内存池的方式管理内存,能够省去内存分配时间
虚拟内存使用 有自己的VM机制,理论上能够存储比物理内存更多的数据,当数据超量时,会引发swap,把冷数据刷到磁盘上 所有的数据存储在物理内存里
网络类型 非阻塞IO复用模型,提供一些非KV存储之外的排序聚合功能,在执行这些功能时,复杂的CPU计算,会阻塞整个IO调度 非阻塞IO复用模型
水平扩展支持 redis cluster 可以横向扩展 暂无
多线程 Redis6.0之前是只支持单线程 Memcached支持多线程,CPU利用方面Memcache优于redis
单机QPS(每秒查询率) 约10W 约60W
源代码可读性 代码清爽简洁 可能是考虑了太多的扩展性,多系统的兼容性,代码不清爽
适用场景 复杂数据结构、有持久化、高可用需求、value存储内容较大 纯KV,数据量非常大,并发量非常大的业务

 

2、MemCached 安装

1) 下载官网

libevent 下载https://libevent.org

libevent-2.1.12-stable.tar.gz (2020-07-05)

libevent-2.0.21-stable.tar.gz (2012-11-18)

 

memcached 下载https://memcached.org/downloads

memcached-1.6.29.tar.gz  (2024-6-28)

最新稳定版 v1.4.15.tar.gz  (2012-9-3)

 

2) 安装 libevent

wget https://github.com/libevent/libevent/releases/download/release-2.1.12-stable/libevent-2.1.12-stable.tar.gz

tar zxvf libevent-2.1.12-stable.tar.gz

cd libevent-2.1.12-stable/

./configure --prefix=/usr/local/libevent

sudo make; sudo make install

 

3)安装 memcached

wget https://memcached.org/files/memcached-1.6.29.tar.gz

tar zxvf memcached-1.6.29.tar.gz

cd memcached-1.6.29/

./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent

make && make test && sudo make install

 

4)验证安装成功

# /usr/local/memcached/bin/memcached -V
memcached 1.6.29

 

5)启动 memcached

/usr/local/memcached/bin/memcached -u root -l 127.0.0.1 -p 11211 -m 64M -c 256 -P /var/log/memcached.pid -d

## 启动memcached服务
# /usr/local/memcached/bin/memcached -u root -l 127.0.0.1 -p 11211 -m 64M -c 256 -P /var/log/memcached.pid -d
# 
## 查看memcached服务
# ps -ef | grep memcached
root     11428     1  0 15:54 ?        00:00:00 /usr/local/memcached/bin/memcached -u root -l 127.0.0.1 -p 11211 -m 64M -c 256 -P /var/log/memcached.pid -d

启动参数说明:

-d 表示用 daemon 方式的后台启动

-u 表示运行用户为 nobody

-l 表示监听服务器ip地址,可以有多个ip地址,例如在本机 127.0.0.1

-p 表示指定端口号,默认端口运行在11211

-P 表示设置保存Memcache的pid文件,例如 /var/log/memcached.pid

-m 表示分配的内存,单位是MB,例如分配64MB

-c 表示最大同时运行的并发连接数,默认是1024

-t 使用的线程数,默认为4

-Y 指定用户授权文件,格式为每行用户名:密码,例如:user:pass\nuser2:pass2\n

-f 增长因子--slab-growth-factor=<num>,默认num = 1.25

-v 详细信息,-vv能看到详细信息(包含客户端命令和返回值),-vvv是更详细信息

更多参数可见帮助:

# memcached --help
memcached 1.6.29
-p, --port=<num>          TCP port to listen on (default: 11211)
-U, --udp-port=<num>      UDP port to listen on (default: 0, off)
-s, --unix-socket=<file>  UNIX socket to listen on (disables network support)
-a, --unix-mask=<mask>    access mask for UNIX socket, in octal (default: 700)
-A, --enable-shutdown     enable ascii "shutdown" command
-l, --listen=<addr>       interface to listen on (default: INADDR_ANY)
-d, --daemon              run as a daemon
-r, --enable-coredumps    maximize core file limit
-u, --user=<user>         assume identity of <username> (only when run as root)
-m, --memory-limit=<num>  item memory in megabytes (default: 64)
-M, --disable-evictions   return error on memory exhausted instead of evicting
-c, --conn-limit=<num>    max simultaneous connections (default: 1024)
-k, --lock-memory         lock down all paged memory
-v, --verbose             verbose (print errors/warnings while in event loop)
-vv                       very verbose (also print client commands/responses)
-vvv                      extremely verbose (internal state transitions)
-h, --help                print this help and exit
-i, --license             print memcached and libevent license
-V, --version             print version and exit
-P, --pidfile=<file>      save PID in <file>, only used with -d option
-f, --slab-growth-factor=<num> chunk size growth factor (default: 1.25)
-n, --slab-min-size=<bytes> min space used for key+value+flags (default: 48)
-L, --enable-largepages  try to use large memory pages (if available)
-D <char>     Use <char> as the delimiter between key prefixes and IDs.
              This is used for per-prefix stats reporting. The default is
              ":" (colon). If this option is specified, stats collection
              is turned on automatically; if not, then it may be turned on
              by sending the "stats detail on" command to the server.
-t, --threads=<num>       number of threads to use (default: 4)
-R, --max-reqs-per-event  maximum number of requests per event, limits the
                          requests processed per connection to prevent 
                          starvation (default: 20)
-C, --disable-cas         disable use of CAS
-b, --listen-backlog=<num> set the backlog queue limit (default: 1024)
-B, --protocol=<name>     protocol - one of ascii, binary, or auto (default: auto-negotiate)
-I, --max-item-size=<num> adjusts max item size
                          (default: 1m, min: 1k, max: 1024m)
-F, --disable-flush-all   disable flush_all command
-X, --disable-dumping     disable stats cachedump and lru_crawler metadump
-W  --disable-watch       disable watch commands (live logging)
-Y, --auth-file=<file>    (EXPERIMENTAL) enable ASCII protocol authentication. format:
                          user:pass\nuser2:pass2\n
-e, --memory-file=<file>  (EXPERIMENTAL) mmap a file for item memory.
                          use only in ram disks or persistent memory mounts!
                          enables restartable cache (stop with SIGUSR1)
-o, --extended            comma separated list of extended options
                          most options have a 'no_' prefix to disable
   - maxconns_fast:       immediately close new connections after limit (default: enabled)
   - hashpower:           an integer multiplier for how large the hash
                          table should be. normally grows at runtime. (default starts at: 0)
                          set based on "STAT hash_power_level"
   - tail_repair_time:    time in seconds for how long to wait before
                          forcefully killing LRU tail item.
                          disabled by default; very dangerous option.
   - hash_algorithm:      the hash table algorithm
                          default is murmur3 hash. options: jenkins, murmur3, xxh3
   - no_lru_crawler:      disable LRU Crawler background thread.
   - lru_crawler_sleep:   microseconds to sleep between items
                          default is 100.
   - lru_crawler_tocrawl: max items to crawl per slab per run
                          default is 0 (unlimited)
   - read_buf_mem_limit:  limit in megabytes for connection read/response buffers.
                          do not adjust unless you have high (20k+) conn. limits.
                          0 means unlimited (default: 0)
   - no_lru_maintainer:   disable new LRU system + background thread.
   - hot_lru_pct:         pct of slab memory to reserve for hot lru.
                          (requires lru_maintainer, default pct: 20)
   - warm_lru_pct:        pct of slab memory to reserve for warm lru.
                          (requires lru_maintainer, default pct: 40)
   - hot_max_factor:      items idle > cold lru age * drop from hot lru. (default: 0.20)
   - warm_max_factor:     items idle > cold lru age * this drop from warm. (default: 2.00)
   - temporary_ttl:       TTL's below get separate LRU, can't be evicted.
                          (requires lru_maintainer, default: 61)
   - idle_timeout:        timeout for idle connections. (default: 0, no timeout)
   - slab_chunk_max:      (EXPERIMENTAL) maximum slab size in kilobytes. use extreme care. (default: 512)
   - watcher_logbuf_size: size in kilobytes of per-watcher write buffer. (default: 256)
   - worker_logbuf_size:  size in kilobytes of per-worker-thread buffer
                          read by background thread, then written to watchers. (default: 64)
   - track_sizes:         enable dynamic reports for 'stats sizes' command.
                          note that counts for each size are approximate.
   - no_hashexpand:       disables hash table expansion (dangerous)
   - modern:              enables options which will be default in future.
                          currently: nothing
   - no_modern:           uses defaults of previous major version (1.4.x)
   - sock_cookie_id:      attributes an ID to a socket for ip filtering/firewalls 

   - External storage (ext_*) related options (see: https://memcached.org/extstore)
   - ext_path:            file to write to for external storage.
                          ie: ext_path=/mnt/d1/extstore:1G
   - ext_page_size:       size in megabytes of storage pages. (default: 64)
   - ext_wbuf_size:       size in megabytes of page write buffers. (default: 4)
   - ext_threads:         number of IO threads to run. (default: 1)
   - ext_item_size:       store items larger than this (bytes, default 512)
   - ext_item_age:        store items idle at least this long (seconds, default: no age limit)
   - ext_low_ttl:         consider TTLs lower than this specially (default: 0)
   - ext_drop_unread:     don't re-write unread values during compaction (default: disabled)
   - ext_recache_rate:    recache an item every N accesses (default: 2000)
   - ext_compact_under:   compact when fewer than this many free pages
                          (default: 1 percent of the assigned storage)
   - ext_drop_under:      drop COLD items when fewer than this many free pages
                          (default: 1/4th of the assigned storage)
   - ext_max_frag:        only defrag pages if they are less full than this pct-wise (default: 0.80)
   - ext_max_sleep:       max sleep time of background threads in us (default: 1000000)
   - slab_automove_freeratio: ratio of memory to hold free as buffer.
                          (see doc/storage.txt for more info, default: 0.010)
-N, --napi_ids            number of napi ids. see doc/napi_ids.txt for more details

 

常用的memcached客户端

客户端:

Memcached-Java-Client

亚马逊:

Amazon ElastiCache

memcached全面剖析(推荐)

MongoDB学习笔记(推荐)

 

 

参考推荐

CentOS 安装 memcached

Linux php7.0 安装redis和PHP扩展

Linux php7安装mongoDB和memcached扩展

Redis,MemCached,MongoDB概述

WordPress 启用Memcached内存缓存