memcache学习笔记
memcache简介
memcache是一个自由、源码开放、高性能、分布式的分布式内存对象缓存系统,用于动态WEB应用以减轻数据库的负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高了网站的访问速度。
memcache是一个存储键值对的HashMap,在内存中对任意的数据(比如字符串、对象等)所使用的键值存储,数据可以来自数据库调用、API调用,或者页面渲染的结果。memcache设计理念就是小而强大,它简单的设计促进了快速部署、易于开发并解决面对大规模的数据缓存的许多难题,而所开放的API使得memchace能用于Java、C/C++/C#、Perl、Python、PHP、Ruby等大部分流行的程序语言。
memcache虽然被称为"分布式缓存",但其本身完全不具备分布式的功能,即memcache集群之间不会相互通信,所谓分布式完全依赖于客户端。而且不支持持久存储,仅支持存储流式化数据。
memcache安装
yum install memcache
memcached默认没有认证机制,可借用于SASL进行认证;(SASL:Simple Authentication Secure Layer)
分布式系统请求路由方法:取模法,一致性哈希算法;
算法复杂度:O(1)
清理过期缓存项:
缓存耗尽:LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。
缓存项过期:惰性清理机制(即缓存项过期后不会立即清理,而是会把过期项标记为不可用)
默认监听的端口:11211/tcp, 11211/udp
相关文件:
主程序:/usr/bin/memcached
配置文件:/etc/sysconfig/memcached
Unit File:memcached.service
协议格式:memcached协议
文本格式
二进制格式
memcache设置
启动方式:
-d 以守护程序( daemon )方式运行
-u root 指定用户,如果当前为 root ,需要使用此参数指定用户
-P / tmp/ / a.pid 保存 PID 到指定文件
内存设置:
-m 1024 数据内存数量,不包含 memcached 本身占用,单位为 MB
-M 内存不够时禁止 LRU ,报错
-n 48 初始 chunk=key+suffix+value+32 结构体,默认 48 字节
-f 1.25 增长因子,默认 1.25
-L 启用大内存页,可以降低内存浪费,改进性能
连接设置:
-l 127.0.0.1 监听的 IP 地址,本机可以不设置此参数
-p 11211 TCP 端口,默认为 11211 ,可以不设置
-U 11211 UDP 端口,默认为 11211 ,0 0 为关闭
并发设置:
-c 1024 最大并发连接数,默认 1024 ,最好是 200
-t 4 线程数,默认4 4 。由于 memcached 采用 NIO ,所以更多线程没有太多作用
-R 20 每个 event 连接最大并发数,默认 20
-C 禁用 CAS
memcache管理
管理命令格式:
<command name> <key> <flags> <exptime> <bytes> <data block>
参数说明:
command name:管理命令(set、add、replace)
key:查找关键词
flags:客户端使用它存储关于键值对的额外信息
exptime:该数据的存活时间,0表示永久有效
bytes:存储字节数
data block:存储的数据块(即键值对中的值)
存储命令 set/add/replace/append/prepend/cas
读取命令 get =bget? /gets
删除命令 delete
计数命令 incr/decr
统计命令 stats/settings/items/sizes/slabs
工具 memcached- - tool
存储命令:
<command> <key> <datablock>
set无论如何都进行存储
add只有数据不存在时进行添加
repalce只有数据存在时进行替换
append往后追加:append <key> datablock <status>?
prepend往前追加:prepend <key> datablock <status>
cas按版本号更改
读取命令:
get 普通查询
gets 用于查询带版本的值
cas即check and set 只有在版本号相匹配时才能存储,否则返回exits,设计意图:解决多客户端并发修改同一条记录的问题,防止使用经过改变了的value/key对
v计数命令:
incr/decr<key><int>
计数要求:key 必须存在,value必须是数字
删除命令:
delete<key>[<time>]
time:秒数或者unixtime,在time时间内不能add或者replace也不能get,但是能set。
stats命令
stats [<args>]\r\n
pid Memcached进程ID
uptime Memcached运行时间,单位:秒
time Memcached当前的UNIX时间
version Memcached的版本号
分析CPU占用是否高
rusage_user 该进程累计的用户时间,单位:秒
rusage_system 该进程累计的系统时间,单位:秒
分析连接数是否太多
curr_connections 当前连接数量
total_connections Memcached运行以来接受的连接总数
connection_structures Memcached分配的连接结构的数量
分析命中率是否太低
cmd_get 查询请求总数
get_hits 查询成功获取数据的总次数
get_misses 查询成功未获取到数据的总次数
cmd_set 存储(添加/更新)请求总数
分析字节数流量
bytes Memcached当前存储内容所占用字节数
bytes_read Memcached从网络读取到的总字节数
bytes_written Memcached向网络发送的总字节数
limit_maxbytes Memcached在存储时被允许使用的字节总数
分析对象数LRU频率
curr_items Memcached当前存储的内容数量
total_items Memcached启动以来存储过的内容总数
evictions LRU释放对象数,用来释放内存
stats setting查看设置
maxbytes 最大字节数限制,0无限制
maxconns 允许最大连接数
tcpport TCP端口
udpport UDP端口
inter
verbosity 日志0=none,1=som,2=lots
oldest 最老对象过期时间
evictions on/off,是否禁用LRU
domain_socket socket的domain
umask 创建Socket时的umask
growth_factor 增长因子
chunk_size key+value+flags大小
num_threads 线程数,可以通过-t设置,默认4
stat_key_prefix stats分隔符
detail_enabled yes/no,显示stats细节信息
reqs_per_event 最大IO吞吐量(每event)
cas_enabled yes/no,是否启用CAS,-C禁用
tcp_backlog TCP监控日志
auth_enabled_sasl yes/no,是否启用SASL验证
number 该slab中对象数,不包含过期对象
age LRU队列中最老对象的过期时间
evicted LRU释放对象数
evicted_nonzero 设置了非0时间的LRU释放对象数
evicted_time 最后一次LRU秒数,监控频率
outofmemory 不能存储对象次数,使用-M会报错
tailrepairs 修复slabs次数
reclaimed 使用过期对象空间存储对象次数
stats size对象数量统计格式:
STAT <size> <count>
注意:会锁定服务,暂停处理请求
stats slab区块统计
区块数量:
chunk_size chunk大小,byte
chunks_per_page 每个page的chunk数量
total_pages page数量
total_chunks chunk数量*page数量
命中率
get_hits get命中数
cmd_set set数
delete_hits delete命中数
incr_hits incr命中数
decr_hits decr命中数
cas_hits cas命中数
cas_badval cas数据类型错误数
分析占用情况
used_chunks 已被分配的chunk数
free_chunks 剩余chunk数
free_chunks_end 分完page浪费chunk数
mem_requested 请求存储的字节数
active_slabs slab数量
total_malloced 总内存数量
被浪费内存数=(total_chunks * chunk_size) - mem_requested
如果太大,需要调整factor
其他命令
version 查看版本号
flush_all 清理所有
quit 退出