memcache的原理性知识

memcache的工作原理

memcache处理的原子是每一个key、val,key会通过一个hash表转换成hash的key,便于查找对比以及竟可能的做到散列。同时mem用的是一个二级散列,通过一个hash表来维护。
memcache有两个核心组件:服务端和客户端
在一个memcache组件查询中,client先通过key的hash值来确定kv在service端的位置,当server端确定后,客户端就会发一个请求个server端。让它来查找出确切数据,因为这之间没有交互以及多播协议,因此mem带给网络的影响最小。

例如:

client:c1 c2 c3
server: s1 s2 s3

memcache是这样设置kv的:
c1 key=’com’ val=’c1c1c1c1’
在存储的时候 c1先对key做hash转化,根据hash转化的值,确定kv对应的服务器。
假设s2被选中了
c1连接上s2,s2收到请求后就会把 key=’com’ val=’c1c1c1c1’存起来

memcache是这样取值的:
假设c3想得到 key=’com’ 的val
1.c3需要用相同的算法算出key=’com’的hash,并确定他所对应的服务器的位置【计算出来后得到了s2服务器】
c3链接到s2服务器就能得到 key=’com’ val=’c1c1c1c1’
这样下来只要所有的服务器想要取得key=’com’都会去s2的服务器上取

memcache的内存管理机制

memcache会预先分配内存,一般来说一个memcache进程会将自己划分成若干个slab。每个slab下有若干个page,每个page下有若干个chunk。
如果把这几个看成是一个对象的话,他们的关系是一对多的,slab的数量是有限的,这个跟进程配置的内存有关,而每个slab下的page默认是1m,也就是说一个slab占用100M内存的话,那么默认情况下slab所拥有的page数就是100,而 chunk就是我们数据最终要存储的地方。chunk是用于缓存记录的内存空间。

slab class:slab class是具有特定大小的chunk组,每个slab对应一个或多个空间大小相同的chunk组。在memcache中,元素的管理单位就是slab。

chunk:这个是存放元素的最小单元,缓存中的数据最终都会保存在这里,在保存的时候memcache会根据存储数据的大小,将其放在最合适的slab class中。每个slab class中的chunk空间大小都是一样的,所以元素存放进来以后,chunk空间有的会占不满。

page:page的固定大小默认是1M,当slab class空间不足的时候,就会申请page,按照chunk的大小进行切割

memcache的内存是如何分配给元素的

memcache的内存分配以page为单位,默认page是1M【可以在memcache启动时 添加 -I 参数设置 改变slab的大小】memcache在存储数据的时候并不是将所有的数据【所有的数据指的是大小不等的数据】都放在一起,而是预先将存储数据的空间划分成若干个slabs,每个slab只是负责一定范围内的数据存储【大小可以通过-f 设置增长因子 默认是1.25倍】【-n 设置slab的chunk大小从多少开始】

memcache的内存回收是什么时候进行的

与redis不同的是memcache不会主动回收内存。
如果要查询一个已经失效的元素,memcache将会先释放内存,然后将新的数据存进来时,将会重用此内存【前提是新旧元素必须都在同一个slab class中】
由于LRU元素将被踢出,让给新的元素,或者发现有过期的元素它的内存将会被重用。

memcache中的数据什么时候会被踢出去

如果元素还没有失效或则失效日期为0或则将来才失效,slab class已经用完了所有的chunk,并且没有空间的page可以分配给slab class,这个时候就会执行LRU算法

LRU是怎么决定要踢出那个元素的

当存放新的数据的时候,内存可能会被回收,如果在相应的slab class里,既没有空前的chunk,也没有空间的page。memcache将会使用LRU查找出对应的应该被回收的元素。
LRU算法将会从缓存列表中根据最近最少使用原则,查找一些数据,主要是看看这个数据是否已经失效,如果失效了就将这个数据占用的空间重用,如果找不到失效的元素就踢出尾部还没有失效的元素。

memcache的最大优点是啥

Memcached最大的好处就是它带来了极佳的水平可扩展性,特别是在一个巨大的系统中。由于客户端自己做了一次哈希,那么我们很容易增加大量memcached到集群中。
没有多播协议,不会网络通信量爆炸(implode)。
memcached的集群很好用。内存不够了?增加几台 memcached吧;
CPU不够用了?再增加几台吧;
有多余的内存?在增加几台吧,不要浪费了。
内存存储,速度快,对于内存的要求高,所缓存的内容非持久化。对于 CPU 要求很低,所以常常采用将 Memcached 服务端和一些 CPU 高消耗 Memory 低消耗应用部属在一起 。

缺点是啥

1.不能持久化存储
2.存储数据有限制:1M 【大于1M,认为就行分割】(内存碎片)
3.mm存储数据只能key-value
4.集群数据没有复制和同步机制 【崩溃不会影响程序,会从数据库中取数据】
5.内存回收不能及时 LRU(算法):未使用内存》过期内存》最近最少使用内存 这是惰性删除

memcached如何实现冗余机制

不实现!我们对这个问题感到很惊讶。Memcached应该是应用的缓存层。它的设计本身就不带有任何冗余机制。如果一个memcached节点失去了所有数据,您应该可以从数据源(比如数据库)再次获取到数据。您应该特别注意,您的应用应该可以容忍节点的失效。不要写一些糟糕的查询代码,寄希望于 memcached来保证一切!如果您担心节点失效会大大加重数据库的负担,那么您可以采取一些办法。比如您可以增加更多的节点(来减少丢失一个节点的影响),热备节点(在其他节点down了的时候接管IP),等等。

memcached能接受的key的最大长度是多少

key的最大长度是250个字符。需要注意的是,250是memcached服务器端内部的限制,如果您使用的客户端支持”key的前缀”或类似特性,那么key(前缀+原始key)的最大长度是可以超过250个字符的。我们推荐使用使用较短的key,因为可以节省内存和带宽。

memcached对item的过期时间有什么限制

过期时间最大可以达到30天。memcached把传入的过期时间(时间段)解释成时间点后,一旦到了这个时间点,memcached就把item置为失效状态。这是一个简单但obscure的机制。

memcached最大能存储多大的单个item

1MB。如果你的数据大于1MB,可以考虑在客户端压缩或拆分到多个key中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值