memcached是一个自由开源,高性能,分布式内存对象存储系统
python
基于内存的key-valued存储,用来存储小块的任意数据(字符串,对象)
算法
他是一个简洁的key-value存储系统
数据库
# 分为服务器和客户端两部分 # 1. 服务端: memcached # 2. 客户端: memcache
使用目的: 经过缓存数据库查询结果,减小数据库访问次数,以提升动态Web应用的速度,提升可扩展性
json
# 1. C/S模式架构: 由C语言编写,总共2000多行代码。 # 协议简单: 使用的是基于文本行的协议,能经过telnet/nc直接操做Memcached服务存取数据. # 2. 支持epoll/queue异步I/O模型: 使用libevent做为事件处理通知机制. # 3. Key/Value键值对数据类型 # 4. 纯内存缓存,效率高 # 5. 支持分布式集群 # 6. 多进程
完整缓存
缓存
# 例如:京东的商品分类,就能够事先放在Memcached里,而后在对外提供数据访问,这个被称之为“数据预热”
热点缓存
服务器
# 热点缓存通常是用于由用户更新的商品,例如淘宝的卖家,当卖家新增商品后,淘宝网的程序就会把商品写入数据库,而后读取写入的数据,把这部分数据,放入 Memcached中,下一次访问这个商品的请求直接从Memcached中取走了。
做为集群节点的session会话共享机制
session
# 须要被缓存的数据以key/value键值对的形式保存在服务器端预分配的内存区中,每一个被缓存的数据都有惟一的标识key,操做Memcached中的数据就是经过这个惟一标识的key进行的。
# Memcached采用了以下机制: # 1. 采用slab内存分配机制 # 2. 采用LRU对象清除机制 # 3. 采用hash机制快速检索item
memcached是利用Slab Allocation机制来分配和管理内存的,提早将
大内存分配大小为1MB
的若干个slab
,而后针对每一个slab
再进行小对象填充
,这个小对象称为chunk
,避免大量重复的初始化和清理,减轻了内存管理器的负担。多线程
Slab Allocation
内存分配的原理是按照预先规定的大小,将分配给Memcached服务的内存预先分割成特定长度的内存块(chunk),再把尺寸相同的内存块(chunk)分红组(chunks slab class),这些内存块不会释放,能够重复利用架构
# 小结 # 1. Memcached早期内存管理机制为malloc(动态内存分配) # 2. lab内存分配机制能够解决内存碎片的问题 # 3. Memcached服务的内存预先分割成特定长度的内存块,称为chunk,用于缓存数据的内存空间或内存块,至关于磁盘的block,只不过磁盘的每个block都是相等的,而chunk只有在同一个Slab Class内才是相等的。 # 4. Slab Class指特定大小(1MB)的包含多个chunk的集合或组,一个Memcached包含多个Slab Class,每一个Slab Class包含多个相同大小的chunk。 # 5. Slab机制缺点: 例如,Chunk空间会有浪费(经过调优因子以及大小接近的数据放入一个MC实例)
# 不主动检测item对象是否过时,而是在get时才会检查item对象是否过时以及是否应该删除。 # 当删除item对象时,通常不释放内存空间,而是作删除标记,将指针放入slot回收插槽,下次分配的时候能够直接使用。 # 当内存空间满的时候,将会根据LRU算法把最近最少使用的item对象删除。 # 数据存入能够设定过时时间,可是数据过时后不会被当即删除,而是在get时检查item对象是否过时以及是否应该删除。 # 若是不但愿系统使用LRU算法清除数据,能够用使用-M参数。
# 用户名 memcached # 用户组 memcached # 端口 11211 # 源码包 /root/memcached-1.5.9.tar.gz # 解压后源码 /root/memcached-1.5.9 # 编译目录 /root/ # 安装目录 /usr/local/memcached # 工做目录 /var/sites/memcached
[root@memcached-1 ~]# cat /etc/redhat-release CentOS Linux release 7.3.1611 (Core) [root@memcached-1 ~]# uname -r 3.10.0-514.el7.x86_64
# 安装libevent依赖和gcc编译工具 yum -y install libevent libevent-devel gcc
groupadd memcached; useradd -s /sbin/nologin -d /dev/null -M -g memcached memcached;
wget -O ./memcached-1.5.9.tar.gz http://www.memcached.org/files/memcached-1.5.9.tar.gz tar xvf memcached-1.5.9.tar.gz cd memcached-1.5.9 ./configure --prefix=/usr/local/memcached --prefix=/usr/local/memcahced/ make && make install
mkdir -p /var/sites/memcached-1.5.9/etc/ cp /root/memcached-1.5.9/scripts/memcached.sysconfig /var/sites/memcached-1.5.9/memcached cat /var/sites/memcached-1.5.9/memcached |sed -e "s/#.*/ /g" |uniq |awk '{if (length !=0) print $0}' USER="memcached" MAXCONN="1024" CACHESIZE="64" OPTIONS="" PORT="11211"
/usr/local/memcahced/bin/memcached -m 16m -p 11211 -d -u memcached -c 8192 # 验证启动结果 [root@localhost memcahced]# ps -ef |grep memcached |grep -v grep memcach+ 10363 1 0 07:48 ? 00:00:00 ./bin/memcached -m 16m -p 11211 -d -u memcached -c 8192 # 启动多实例Memcached /usr/local/memcahced/bin/memcached -m 16m -p 11212 -d -u memcached -c 8192 # 启动多实例Memcached指定PID文件 memcached -m 16m -p 11211 -d -u root -c 8192 -P /var/run/11211.pid # 此时咱们能够经过kill 命令指定pid文件关闭Memcached kill `cat /var/run/11211.pid` # 加入开机自启动 # 把上述两个实例的启动命令放入/etc/rc.local,以便下次开机能够自启动。 tail -2 /etc/rc.local memcached -m 16m -p 11211 -d -u root -c 8192 memcached -m 16m -p 11212 -d -u root -c 8192 # 关闭能够用killall ,pkill
#进程与链接设置: -d 以守护进程(daemon)方式运行服务 -u 指定运行Memcached的用户,若是当前用户为root,须要使用此参数指定用户 -l 指定Memcached进程监听的服务器IP地址,能够不设置此参数 -p(小写)指定Memcached服务监听TCP端口号。默认为11211 -P(大写)设置保存Memcached的pid文件($$),保存PID到指定文件 #内存相关设置: -m 指定Memcached服务能够缓存数据的最大内存,默认为64MB -M Memcached服务内存不够时禁止LRU,若是内存满了会报错 -n 为key+value——flags分配的最小内存空间,默认为48字节 -f chunk size增加因子,默认为1.25 -L 启用大内存页,能够下降内存浪费,改进性能 #并发链接设置: -c 最大的并发链接数,默认是1024 -t 线程数,默认4.因为Memcached采用的是NIO,因此太多线程做用不大 -R 每一个event最大请求数,默认是20 -C 禁用CAS(能够禁止版本计数,减小开销) #测试参数: -v 打印较少的errors/warnings -vv 打印很是多调试信息和错误输出到控制台 -vvv 打印极多的调试信息和错误输出,也打印内部状态转变 #其余选项可经过在命令行输入“memcached -h”命令来显示
向Memcached中添加数据时,注意添加的数据通常为键值对的形式,例如: key1->values1, key2->values2
并发
yum -y install nc telnet
# 向memcached写入数据 printf "set key1 0 0 5\r\nzhou\r\n" nc 127.0.0.1 11211 # replace 更新数据 printf "replace key1 0 0 7\r\nxmh\r\n" | nc 127.0.0.1 11211 # 配合printf配置nc从Memcached中读取数据 printf "get key1\r\n" | nc 127.0.0.1 11211 # 经过printf配合nc从Memcached中删除数据 printf "delete key1\r\n" | nc 127.0.0.1 11211
telnet 127.0.0.1 11211 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. set user01 0 0 7 #写入数据,建立key,长度等 jason12 #数据长度要和value一致 STORED get user01 #浏览数据 VALUE user01 0 7 jason12 END delete user01 #删除数据,删除的是key DELETED get user01 #再次浏览数据,数据被删除 END quit #quit退出 Connection closed by foreign host.
# 1. set 设置数据 # 2. get 获取数据 # 3. delete 删除数据 # 4. replace 更新数据 # 操做Memcached 相关命令语法 set key1 0 0 6 \r\n benet \r\n <command name><key><flags><exptime><bytes><datablock><string><datablock> command # 命令参数(set、get、delete、replace) key # key 用于查找缓存值,要求小于250字符,不包含空格和控制字段 flags # 用户端用来表示数据格式数值,如json、xml、压缩等 exptime # 在缓存中保存键值对的时间长度(以秒为单位,0 表示永远) bytes # 在缓存中存储的字节数 datablock # 文本行,以\r\n结尾 string # 键值对应的缓存内容
memcached-tool
源码包内置了一个 perl 写的
scripts/memcached-tool
管理脚本,能够用来查看 Memcached 的运行状态。
注:这个脚本并不会自动安装到安装目录中,所以要使用的话要手动复制过去
cd /root/memcached-1.5.9 cp /root/memcached-1.5.9/scripts/memcached-tool /usr/local/memcahced/bin/