memcached知识点整理
所属分类 memcached
浏览量 1338
LRU(Least Recently Used,最近最少使用)
可设置过期时间
基于文本协议 可通过telnet读写数据
基于libevent事件处理 BSD系统的kqueue,Linux系统的epoll 封装
内置的内存管理方式
非持久化,重启数据会丢失
分布式集群,客户端处理
启动
/usr/local/memcached/bin/memcached –p 11211 –d –u root –P /tmp/memcached.pid
-p 端口 默认11211
-d 后台启动一个守护进程(daemon)
-u 指定用户启动
-P 进程的pid文件
-l 设置监听IP 默认监听所有IP
-m 内存大小,以MB为单位,默认为64M
-c 最大并发连接数,默认1024
-f 块大小增长因子 默认是1.25
-M 内存耗尽时返回错误, 不用LRU算法
常用命令
set 添加或更新
add 不存时添加数据,否则返回NOT_STORED
replace 存在时替换,否则返回NOT_STORED
cas 更新存在值 ,还带了检查功能
append 尾部追加 key需要存在 否则返回 NOT_STORED
prepend 头部追加 key不存在,返回NOT_STORED
delete DELETED NOT_FOUND
incr 与 decr 命令
stats 监控
key 不存在返回 NOT_FOUND,如果键的值不为数字,返回 CLIENT_ERROR,其他错误返回 ERROR
incr key increment_value
decr key decrement_value
set key1 0 0 5
hello
值的长度一定要正确,否则失败
get key1
telnet 127.0.0.1 11211
set key1 0 0 5
hello
STORED
get key1
VALUE key1 0 5
hello
END
gets 返回token 最后一个数字 4
gets key1
VALUE key1 0 6 4
hello1
END
cas key1 0 0 6 4
hello2
STORED
gets key1
VALUE key1 0 6 5
hello2
END
cas key flags exptime bytes unique_cas_token
cas命令使用步骤
如果没有设置唯一令牌,则 CAS 命令执行错误。
如果键 key 不存在,执行失败。
添加键值对。
通过 gets 命令获取唯一令牌。
使用 cas 命令更新数据
ERROR 缺少 token
NOT_FOUND key不存在
内存分配机制
使用slab allocation机制来分配和管理内存
按照预先规定的大小,将分配的内存分割成特定长度的内存块,再把尺寸相同的内存块分成组,
数据在存放时,根据键值 大小去匹配slab大小,找就近的slab存放,所以存在空间浪费现象。
传统的内存管理方式,malloc分配内存,free回收内存,这种方式容易产生内存碎片
缓存淘汰策略
LRU + 过期时间设置
内存满时 失效的数据先被替换 然后是最近未使用的数据
Lazy Expiration 自己不会监控存入的key是否过期 读取时检查是否过期
分布式算法
余数 散列
一致性hash Consistent Hashing Algorithm
hash 环 节点 和 数据 hash
顺时钟方向查找
良好的分布式cahce系统中的一致性hash算法应该满足以下几个方面:
平衡性(Balance) 单调性(Monotonicity) 分散性(Spread) 平滑性(Smoothness)
扩容 锁容 数据迁移
虚拟节点
监控
stats
watch
清空统计数据 stats reset
stats slabs
flush_all
使所有item失效。加入参数则表示在N秒后失效所有item。
这项操作会立即返回,不会暂停服务器。
这个操作并不会真的释放内存空间,而是标志所有的item为失效
上一篇
下一篇
jdk jcmd 使用
mysql知识点整理
架构师需要具备的能力和素质
A 股 的 真 相
10 Golden rules of doing business in China
java web项目中获取重要的请求信息