Memcached 知识点

Memcached知识点

概念

Memcached是一个免费开源的,高性能的,具有分布式对象的缓存系统,它可以用来保存一些经常存取的对象或数据,保存的数据像一张巨大的HASH表,该表以Key-value对的方式存在内存中。

流程

  • 检查客户端请求是否在memcached中

  • 若有则直接返回

  • 若无则从数据库查询后返回,并存储到memcached中

  • 数据库更新需要同时更新memcached,保证一致性

  • memcached内存用完后会使用LRU策略加上到期失效策略,首先替换到期失效数据,之后替换最近未使用过的数据

    缓存置换算法(页面置换算法)FIFO/ LFU/ LRU

    1. FIFO 先进先出,最先进入缓存的最先替换掉
    2. LFU 最近最少使用,替换掉最近一段时间使用次数最少的数据
    3. LRU 最近最久未使用使用,替换掉最近一段时间没使用过的,以最近一次使用时间为基准,替换最远的数据空间

特征

  • 协议简单:基于文本行的协议,直接通过telnet在memcached服务器上可进行存取数据操作

    Telnet 远程连接服务,作用于tcp/ip协议的应用层

  • 基于libevent事件处理:libevent是一套利用C开发的程序库,由事件驱动,跨平台,支持并发编程

  • 内置的内存管理方式:所有数据存于内存,LRU算法替换,数据易失
  • 分布式:分布式取决于memcache客户端,memcached服务器之间互不通信,数据独立存储

启动

服务启动方法/usr/local/memcached/bin/memcached –p 11211 –d –u root –P /tmp/memcached.pid

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
telnet 127.0.0.1 11211 # 远程连接memcached
stats items # 获取所有items的序号,例如items:29:hits_to_warm
stats cachedump 29 0 # 获取编号29的item的key,返回如:1:/api/courses/tags/?;0表示返回所有slab中的item;若指定返回1个则使用stats cachedump 29 1

get :1:/api/courses/tags/? # 获取key对应的值,多个键空格分割

set cai 0 900 9 # 设置/更新key为cai的值为caicaicai,过期时间为900ms,以下输入的数据占9字节
caicaicai # 存储成功返回STORED,失败返回ERROR

add cai 0 900 9 # 设置key为cai的值为caicaicai,过期时间为900ms,以下输入的数据占9字节
caicaicai # 存储成功返回STORED,失败或key存在返回NOT_STORED

# replace 用于直接替换
# append 用于直接在key对应的数据后面追加数据
# prepend 用于直接在key对应的数据前面追加数据
cas cai 0 900 3 14 # 14为gets获取到的token,CAS 通过先检查token后再设置/更新值,避免数据不一致
aaa # 成功返回STORED;保存错误/语法错误返回ERROR;EXISTS说明token过期/不合法;NOT_FOUND该key不存在

gets cai # 返回带有token的value

incr key increment_value # 自增key对应的value,必须是32位无符号整数
decr key increment_value # 自减key对应的value,必须是32位无符号整数

stats # 输出统计信息

算法

  • 内存分配:Slab allocation机制分配和管理,先按照预定的大小,将分配的内存分割成特定长度的内存块chunck,然后再把相同的内存块分成组slab,根据值的大小去匹配slab大小,找就近的slab存放
  • 缓存策略:失效策略 + LRU;不会监控存入的key/value是否过期,而是获取key时去查看记录的时间戳,检查key/value是否过期
  • 分布式算法:memcached本身不存在分布式,而是客户端进行分布式选择memcached服务器进行分布式存储,因此只考虑服务器选择算法
    • 余数算法:求得key的整数散列值,然后根据服务器台数求的余数进行服务器选择;但是服务器的增减都会导致缓存失效
    • 散列算法:首先将服务器散列值映射到0~2^32^编号的圆上,然后找到从key的散列值开始的第一个圆点作为目标服务器;当从中间插入服务器时,只有第一个服务器逆时针算的第一个服务器会受影响;减少服务器时,只有所减少服务器的逆时针方向第一个服务器之间的数据会受影响

可视化工具

Memadmin

0%