嘘~ 正在从服务器偷取页面 . . .

Memcache 快速上手


Memcache 快速入门

一、概述

基本概念

Memcache是一个自由和开放源代码、高性能、分配的内存对象缓存系统。用于加速动态web应用程序,减轻数据库负载。也有称呼为旁路式缓存系统。

与旁路式缓存系统相对的还有一种叫穿透式缓存系统,一般将正向代理或者反向代理成为穿透式缓存系统,因为系统本身就具有获取缓存数据能力,而且不依靠第三方客户端。

Memcache 也可以理解成是一种特殊的NoSQL 。

Memcache 可以应对任意多个连接,使用telnet 协议传输作为非阻塞的网络IO。它的工作机制是在内存中开辟一块空间,然后建立一个HashTable,Memcache这个软件项目一般叫Memcache

Memcache 是一种C/S 架构。

优缺点

优点:

(1)纯内存存储,速度快。
(2)内置分布式算法,开发者不需要自己实现。
(3)能把单项数据缓存过期时间设置为30天,可以使单项数据常驻内存中。

缺点:

(1)使用telnet 协议传输,没有数据加密功能,安全性很差。
(2)最大内的默认存储空间(吞吐量)只有64M,如果64M 的内存爆满,会指定重启。(可以通过参数指定大小,自带内存不够用的处理机制)
(3)数据放在内存中,服务器重启数据丢失。(不允许数据一起丢失,和redis缓存集体失效效果相似,造成缓存击穿,可能引发缓存雪崩,可以像redis一样使用集群模式使用)
(4)在内存中存储地址非连续,数据零散,无法遍历,管理数据完整性一般。

Nosql 存储 多以K-V键值对的方式存储。

hash表存储的好处是将检索遍历的时间复杂度变成O(1),理论上使用hash保存数据,不会碎数据量的增加查询变慢,响应基本不变。

hash表存储弊端是数据在内存区域中随机分布。

hash表存储弊端还会引发 hash碰撞。多个key对应了同一个值的现象,理论上是存在的,但是发生概率低。比如HashMap 存值时,hashcode相等的时候,只能去比较key来存储,然后在相同hashcode的位置改用链表来存储。

官网:http://www.memcached.org/about

github 下载:https://github.com/memcached/memcached/wiki/ReleaseNotes

二、安装使用

windows 版 (开发环境)

直接下载包即可。

官网最新版: memcached 1.6.7.zip

官网最新版: memcached 1.6.7.zip

windows 版的下载之后直接解压即可使用。

目录:D:\memcache\memcached-win64-1.4.4-14\memcached

版本注意

memcached 1.4.5 之前的版本在window上刻有安装成服务。

memcached.exe -d install

务必使用管理员方式启动CMD窗口。

注册表位置:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\memcached 刻有进行手动修改配置项,

也可以使用命令的方式卸载安装的服务:

memcached.exe -d uninstall

启动或停止服务:

memcached.exe -d start

memcached.exe -d stop

如果不按照服务,那么使用时不能关闭cmd窗口,一次性安装,关闭窗口就会停止。

memcached 1.4.5 及之后的版本不能作为服务运行,可以任务计划中来开启一个普通的进程,在 window 启动时设置 memcached自动执行。

需要使用管理员身份执行以下命令将 memcached 添加来任务计划表中:

schtasks /create /sc onstart /tn memcached /tr "'c:\memcached\memcached.exe' -m 100"

删除任务计划

schtasks /delete /tn memcached

常用管理命令

进入memcache目录:

cd D:\memcache\memcached-win64-1.4.4-14\memcached

帮助命令查看这种参数:

D:\memcache\memcached-win64-1.4.4-14\memcached> memcached.exe -h 
memcached 1.4.4-14-g9c660c0
-p <num>      TCP port number to listen on (default: 11211)
-U <num>      UDP port number to listen on (default: 11211, 0 is off)
-s <file>     UNIX socket path to listen on (disables network support)
-a <mask>     access mask for UNIX socket, in octal (default: 0700)
-l <ip_addr>  interface to listen on (default: INADDR_ANY, all addresses)
-s <file>     unix socket path to listen on (disables network support)
-a <mask>     access mask for unix socket, in octal (default 0700)
-l <ip_addr>  interface to listen on, default is INADDR_ANY
-d start          tell memcached to start
-d restart        tell running memcached to do a graceful restart
-d stop|shutdown  tell running memcached to shutdown
-d install        install memcached service
-d uninstall      uninstall memcached service
-r            maximize core file limit
-u <username> assume identity of <username> (only when run as root)
-m <num>      max memory to use for items in megabytes (default: 64 MB)
-M            return error on memory exhausted (rather than removing items)
-c <num>      max simultaneous connections (default: 1024)
-k            lock down all paged memory.  Note that there is a
              limit on how much memory you may lock.  Trying to
              allocate more than that would fail, so be sure you
              set the limit correctly for the user you started
              the daemon with (not for -u <username> user;
              under sh this is done with 'ulimit -S -l NUM_KB').
-v            verbose (print errors/warnings while in event loop)
-vv           very verbose (also print client commands/reponses)
-vvv          extremely verbose (also print internal state transitions)
-h            print this help and exit
-i            print memcached and libevent license
-P <file>     save PID in <file>, only used with -d option
-f <factor>   chunk size growth factor (default: 1.25)
-n <bytes>    minimum space allocated for key+value+flags (default: 48)
-L            Try to use large memory pages (if available). Increasing
              the memory page size could reduce the number of TLB misses
              and improve the performance. In order to get large pages
              from the OS, memcached will allocate the total item-cache
              in one large chunk.
-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 <num>      number of threads to use (default: 4)
-R            Maximum number of requests per event, limits the number of
              requests process for a given connection to prevent
              starvation (default: 20)
-C            Disable use of CAS
-b            Set the backlog queue limit (default: 1024)
-B            Binding protocol - one of ascii, binary, or auto (default)
-I            Override the size of each slab page. Adjusts max item size
              (default: 1mb, min: 1k, max: 128m)

修改默认端口 11211:

memcached.exe -p 112222

修改默认内存大小:

memcached.exe -m 1024

后台运行,需要linux 环境生效:

memcached.exe -d 

启用交互模式,打印日志信息:

memcached.exe -VVV

Telnet 常用命令

服务安装、启动之后可以使用客户端管理操作。

可以使用 Telnet 作为客户端进行操作。如果不能使用请打开启用 window 的 Telnet 服务模块。

telnet localhost 11211

本机登录可省。

回车之后使用 ctrl+] 进入Telnet 命令模式。

注意 Telnet命令敲错了直接回车即可,Telnet 不支持回退,重写命令即可。

退出Telnet 命令模式 使quit命令即可。

登录memcache之后常用命令:

展示服务器信息。

stats 

get_hits / cmd_get 即命中数量 / 总的获取次数 可以计算出缓存命中率。实际命中率参考标准最少要有90%。

memadmin 图形界面可以查看。

add 命令

命令格式:

add key  flag  expires bytes
value
  • key :代表需要存储的key
  • flag : 代表是否对存储的数据进行压缩,0-代表不压缩;1-代表压缩;一般不压缩,节省系统资源消耗。
  • expires : 代表 value 值的失效时间,单位是秒(s)。如果设置为0,代表不过期,但是mamcache 里面存着一个最大的保留时间为 30 天。当memcache 的存储不够用的时候,会优先剔除这些长期有效的数据,以释放空间供其他数据缓存使用。使用的最近最少使用算法(LRU)进行缓存剔除。
  • bytes: 代表存储value 值的字节数。
  • value:存储的值(始终位于第二行)(可直接理解为key-value结构中的value)

命令回车之后设value值即可。

示例:

add name 0 60 2

get命令

get name

set命令
这个命令类似hashMap的add方法,如果key存在就直接替换value,如果没有key就创建key设置缓存。

set name 0 60 4
test
set name  xiaocai

delete命令- 删除key

delete name

delete命令
删除某个缓存,如果key存在则删除,如果key不存在提示NOT_FOUND。

delete name

flush_all命令
清空memcache里的所有数据,生产环境慎用。

flush_all

危险级别较高,一般只在测试环境使用。

incr 自增命令
和redis 的 incr基本一样。

incr key increment_value

increment_value : 步长值,步进值

示例:

set viewers 0 1000 2
10
STORED
incr viewers 2
12
END

decr 自减命令

decr key decrement_value

和 incr 类似。

使用场景:经常变换的数据可以放缓存里,再配合定时任务更新到数据库进行持久化,减少数据库的频繁更新。

Linux 版(部署环境)

gitHub下载地址:memcached 1.5.20.tar.gz

官网下载:memcached-1.6.7.tar.gz

下自tar 包 memcached-1.6.7.tar.gz ,下载优先选择稳定版。如果没有你喜欢的版本,可以到gitHub 找历史版本。

memcache 的底层依赖一个 libevent 库,需要先安装这个依赖库,官网地址是:http://libevent.org

gitHub下载地址:libevent-2.1.12-stable.tar.gz

上传两个tar包到 /usr/local/src 或者 /opt 目录皆可,也可以找个你喜欢的目录,没有你喜欢的目录也可以不上传。

当然如果环境可以联网也可以使用 yum 安装 或者 wget 下载。

在线安装:

yum install memcached

下载:

wget http://memcached.org/latest

开始安装:

(1)安装 libevent 依赖库

tar -zxvf libevent-2.1.12-stable.tar.gz

cd  libevent-2.1.12-stable

./configure --prefix=/usr/local/libevent  && make  && make install

--prefix=/usr/local/libevent 指定安装目录。

等待安装成功,不报error即可。

(2)安装 memcache

tar -zxvf memcached-1.6.7.tar.gz

cd  memcached-1.6.7

./configure --prefix=/usr/local/memcache --with-libevent=/usr/local/libevent && make && make install

等待安装成功即可。

(3)验证与使用

进入安装目录查看是否有安装的文件,测试memcache 命令。

检查文件,正常安装了应该不会有问题。

cd /usr/local/memcache/bin
ls

测试命令

./memcached -h

其他命令:

./memcached -h 32 -p 11211 -u nobody - d

-u : 以说明身份启动
-d : 以守护进程启动。

检查进程:

ps aux | grep memcached

然后使用Telnet 命令测试连接,执行查看状态的命令:stats:

telnet [你的memcache主机IP]  11211
stats

工作原理

内存预先分配机制

内存或磁盘管理存在内存碎片化。内存条线性寻址时,存在无法被使用的内存单元。

memcache 内部使用了内存预先分配机制。

使用之后可以使用 -VVV 查看。

内存预先分配机制

memcache 接收到 -m 32 的参数之后,将内存分成32个slab class,每个1M大小的slab class里面有多个chunk,每个chunk(最小chunk为96个字节)比前一个大一点点(默认是1.25倍),相邻的chunk直接比值固定,被称为增长因子,增长因子可以根据实际的业务数据大小做调整,最大不会超过1个slab class(即1M),所以,memcache 里最大的value是1M。

如果想修改最小的chunk是需要源码编译才可以修改。

增长因子修改:

memcached.exe -p 11211 -m 32 -f 3 -VVV

调整之后slab class 会减少,chunk 的空间会变大。

memcache的内存预先分配机制,有效优化了内存碎片化和内存管理。

LRU 算法

LRU算法,称为最近最少使用原则的算法,当memcache的一个slab 里面的chunk不够使用的情况下(存储满了,数据在有效期),当有新的满足chunk的数据过来的时候,memcache会优先吧slab里面最近一段时间内、最不活跃的数据优先剔除掉,腾出空间给新的数据使用。

惰性删除机制

memcache本身不监控数据是否过期,即使某个key过期了,memcache也不会立刻直接清除,直到下一次进行获取数据的时候,才会去判断数据是否失效,如果失效也不会清除动作,只是进行过期标记,下次存储数据的时候直接在该过期数据位置存在新数据。

三、MemAdmin

MemAdmin 是一款可视化 memcache 管理与监控工具。基于 PHP5 & JQuery 开发的,体积小,操作简单。

官网:http://www.junopen.com/memadmin

需要配合php运行环境。

解压之后复制到php站点部署目录,如phpstudy。

四、集群。

memcache集群也可以称为memcache分布式缓存系统。

多台memcache组成的架构服务。

memcache 内部使用的内置的取模算法。

后续实操之后再补充。

五、面试题

1、问题1

问题: memcache 最大缓存时间30天,如果要设置31天怎么办?

缓存有效期

缓存时间设置方式:

  • 使用s秒数,但是不能超过86400*30s,即不能超过30天。
  • 设置时间戳,该方式只在linux下可以使用,Windows下不能生效。

所以设置超过30天的缓存实际的数据需要使用时间戳,time() + 86400 * 31
不设置有效期是默认30天有效期,手工设置有效期超过30天只能使用时间戳的方式设置,并且只能在linux环境下使用才生效。

2、问题2

问题: memcache 是否支持高可用?

如果要进行持久化可以配和 memcacheDb

3、问题3

问题: 谈谈 memcache 和 memcached 之间的区别

memcache 和 memcached 都是可以作为php扩展出现。memcache在windows下使用,memcached在linux下使用。

memcache 指的是 memcache 软件或项目名称。
memcached 值项目在linux服务下一个守护进程。memcached = memcache + daemon(守护进程)

4、问题4

问题: memcache 可以用在哪些使用场景?

(1)统计在线人数
(2)缓存网站的常用数据
(3)访问频率限制功能(发现验证码次数、银行相关密码错误限制登录)
(4)浏览量数据统计
(5)实时排行榜
(6)可以做session 共享

redis 同理可以做这些事。



版权声明: 本博客所有文章除特別声明外,均采用 CC BY-SA 4.0 许可协议。转载请注明来源 Small-Rose / 张小菜 !
评论
  目录