zoukankan      html  css  js  c++  java
  • MEMCACHE的内存管理和删除策略

    一.内存碎片

    在不断的申请和释放内存的时候,实际上会有一些很小的碎片空间没有使用价值,那么这就是内存碎片(就好像GC在复制-清除的时候,会出现内存碎片的不足,是同一个道理)。

    二.MEMCACHE的内存管理

    1.内存管理的机制是:slab-allocator:就是说,会将内存划分成多个的slab-class的仓库,而每个仓库又含有多个不同大小的chunk。当进行申请内存时,会选择合适大小的chunk。

     

    2.如何选择合适的chunk

    通过命令,查看memcache中的chunk

    memcache -vvv


    现在有114byte内存需要存放,首先memcache会检查chunk组,找到内容大于114byte且两者差的绝对值最小的那个chunk。如果此时128chunk(即slab class 3 里面的chunk)已经用完,此时并不会去使用大小为160的chunk,而是将chunk为122里面的旧数据踢掉,以备使用。

    由此可见:固定大小的chunk会带来内存上浪费:我们存储的是114byte,但是使用的却是128byte。由于slab allocator机制中,分配的chunk大小事‘固定’的,应此可能会造成内存的浪费。对于chunk 空间的浪费问题,无法彻底解决,只能缓解该问题。

    3.chunk的增长因子调优

    memcache在启动时,会通过-f选择指定的Growth Factor因子。可以调节slab-class中的空间大小的差异。默认为1.25

    增长因子为1.25


    备注:当f=1.25 时,从输出结果来看,某些相邻的slab class 的大小比值并非为1.25,可能会觉得有些计算误差,这些误差是为了保持字节数的对齐而故意设置的。(对于其他的增长因子也适用,就好像jvm对对象的内存布局的设置中的对齐填充一样,使得对象的起始地址是8字节的整数倍,会将原来8G内存扩展到32G)。

    三.MEMCACHE的过期数据惰性删除

    1.当某个值过期后,并没有在内存删除,因此status统计时,curr-item有它的信息。

    2.当取值时,判断是否过期,如果过期,返回空,并且清空值,curr_item就减少了。

    3.如果之前没有get过,将不会自动删除,当某个新值去占用它的位置时,当成空的chunk来占用

    即为:这个过期数据,只不过让用户看不见,但是没有在内存的角度将其删除,这就是MEMCACHE的惰性失效。

    下图是在网络中找到的一张截图:

     

    四.MEMCACHE的删除机制

    删除机制其实有两种:

    1.LRU删除机制:least recently used(最近最少使用),当某个单元被请求时,维护一个计数器,通过计数器来判断最近谁最少被使用。(多用它)

    2.FIFO删除机制:first in,first out (最先插入,最先离开)

    永久数据被踢现象:即使某个key 是设置的永久有效期,也一样会被踢出来!

    当将对象放入内存时,失效数据首先被替换,然后再替换掉最近未使用的数据。



  • 相关阅读:
    pymysql 防止sql注入案例
    4、【常见算法】一道经典的额递归题目
    3、【常见算法】寻找非递减序列中绝对值最小值的绝对值
    2、【常见算法】按序重排问题
    9、【排序算法】基数排序
    8、【排序算法】桶排序
    7、【排序算法】归并排序
    6、【排序算法】堆排序
    20、【图】Prim(普里姆)算法
    19、【图】Kruskal(克鲁斯卡尔)算法
  • 原文地址:https://www.cnblogs.com/wrqysrt/p/10919896.html
Copyright © 2011-2022 走看看