Memcached

简介

memcached是一种高性能 ,分布式的内存对象缓存系统,是由livejounal 旗下的 danga 公司开发的老牌 NoSQL 应用,memcached将数据缓存在内存中,提升访问速度,减少数据库压力。

何为NoSQL

NoSQL=not only sql 不仅仅是(关系型)数据库,相对于传统的关系型数据库的行列规范,NoSQL的鲜明特点为k-v存储(memcached,redis),或者基于文档存储(mongodb)。

Memcached+mysql

1.在没有memcached的情况下,客户端访问服务器有关数据操作全部经过mysql,重复性的增删查改增加了mysql的压力甚至出现崩溃
2.Memcached+mysql
当客户端第一次访问服务器时,服务器将数据从数据库中查询出来并将这些数据缓存到Memcached服务器中
当客户端第二次访问服务器时先判断缓存中是否有相关数据,有则使用缓存的数据,这样减轻了数据库服务器的压力。

Linux搭建Memcached

https://editor.csdn.net/md?articleId=104962866

Memcachedn内存管理机制

memcached通过 slab allocator来缓解内存的碎片化—内存碎片
slab allocator的工作原理:
预先把内存划分为数个slab class库(每个slab class 大小为1M),各个(slab class)库被切分成不同尺寸的小块(chunk),需要存内容的时候,判断内容的大小,为其选取合理的(slab class)库。
Memcached
当我们需要存储数据时,会判断数据的大小选择合适的chunk组(slab class),将数据存储到chunk中,假设你有一个100k的数据则该数据会存储到 122chunk组中,如果122chunk组的空间满了,该数据并不会存储在144或者其他chunk中,memcached会根据LRU删除机制(最近很少使用)删除最近很少使用的数据从而将新的数据存储到chunk中,这里有个问题就是,通过LRU删除机制会删除原来存储在chunk中的数据,解决办法就是永久型数据于非永久性数据分开放。

固定大小的chunk带来的内存浪费
如上图,由于slab allocator机制中,分配chunk大小是’固定’的,因此,对于特定的item,可能造成内存空间的浪费.
比如,将100字节的数据缓存到122字节的chunk中,剩余22字节就浪费了
如何缓解这种问题?
我们可以对存储的数据进行统计计算,制定合理的chunk的大小,但这里我们不能直接指定chunk的大小 我们可以通过memcached的参数调整chunk的增长速度 -f 增长因子,默认为1.25

如下
m参数分配给memcached存储缓存的内存大小默认64m
p参数设置memcached的端口默认11211
f参数设置chunk的增长如96,192,384…默认1.25
vv显示内存分配情况
u指定用户启动
Memcached
可以看到每个chunk成倍的增长 perslab代表slabclass的chun有几个chunk的大小*chunk个数=1m

memcached分布式集群算法

由于memcached节点之间,是不互相通信的.因此,memcached的分布式,是靠用户设计算法,把数据分布在多个memcached节点中分布式其实就是多台服务器分配工作量的方法。

1.取模算法:根据键求得得到其整数散列值,在根据这个值除以服务器的数量,根据相应的余数选择相应的服务器,特点:(简单,高效,扩展性差由于数据存储的服务器直接跟服务器数量有关,只要服务器数量发生变更,直接导致所有缓存数据失效)。

2.一致性哈希算法:
通俗的理解一致性哈希算法,我们可以把各服务器节点映射放在钟表的各个时刻上, 把 key 也映射到钟表的某个时刻上.
该 key 沿钟表顺时针走,碰到的第 1 个节点,即为该 key 的存储节点
Memcached
上述一致性哈希算法也有缺点,当某个节点失效后,那么根据顺时针规则,原本该节点承受的压力会立即转换到和他相邻的节点,这样相邻的节点也会慢慢随之失效一直循环会导致整个圆环上的节点都失效。
我们想如果某个节点失效了,能不能将其承受的压力平均的分配给每个节点,这样就不会出现连环失效的情况

虚拟节点
有N个真实节点,把每个真实节点映射成M个虚拟节点,再把M*N个虚拟节点,散列在圆环上,各个真实节点对应的虚拟节点相互交错分布这样,某真实节点down后,则把其影响均匀分摊到其他的所有节点之上.
Memcached
memcached常用参数与命令
参数:
m:设置memcached最大缓存大小
f:设置增长因子
u:运行memcached的用户
p:memcached的端口默认11211
c:最大并发连接数 默认1024
f:增长因子默认1.25
vv:显示详细信息
vvv:显示超详细信息
h:帮助信息
命令
add key flag expire length
flag:数据类型标记(int)
expire:数据有效期秒为单位也可接收时间戳(默认0永久有效)
length:数据字节长度
delete key
删除指定的key
get key
获取指定的key
replace key flag expire length
替换对应的键
set key flag expire length
有key则修改没有则创建

incr key num
递增num
decr key num
递减num
统计命令
使用stats命令可以将memcached当前的运行信息统计出来
stats
STAT pid 进程号
STAT uptime 持续运行的时间
STAT time 服务器当前的unix时间、
STAT version 服务器版本号
STAT libvent libvent的版本号
STAT pointer_size 服务器操作系统位数
STAT curr_connection 当前连接数
STAT total_connections:总连接数
STAT cmd_get:获取请求数量
STAT get_his:获取成功次数
STAT get_misses 失败次数
根据上面三个可得出命中率
命中率:(查询到的数据的次数/查询综述)*100%;
STAT cmd_set 存储请求数量
STAT cmd_flush flush请求的数量
STAT cmd_touch touch请求的数量
STAT delete_hits 删除的命中
STAT delete_misses 删除失败的次数

STAT bytes:已用缓存空间
STAT bytes_read :总共获取数量
STAT bytes_written 总写入数据数
STAT curr_items:当前缓存item数量
STAT total_items:总缓存数量