zoukankan      html  css  js  c++  java
  • Memcached数据存储方式

    1. memcached的数据存储方式被称为Slab Allocator,其基本方式是:

      ①:先把内存分成很多Slab,这个大小是预先规定好的,已解决内存碎片的问题。分配给Slab的内存空间被称为Page,默认为1M。一个Slab下可以有多个Page。  

    内存分成多个Slab-->Slab分成多个Page(Page默认为1M)-->Page分成多个Trunk

    ②然后把一个Page分成很多个chunk块,chunk块用于缓存记录的空间,chunk的大小是先有一个基本值,然后根据增长因子来增大

    ③slab class:内存区类别(48byte-1M),每个类别有一个slab clasid

    ④memcached里面保存着slab内空闲的chunk列表,当收到要保存item的时候,它会根据item的大小,去选择一个最合适的slab,然后找到空闲的chunk,把数据存放进去。

    2. 新建item分配内存过程

    ①快速定位slab classid ,先计算item长度=key键长+flag+suffix(17/16字节)+value值长+结构大小(32字节),如90byte 如果>1MB,无法存储丢弃,取最小冗余的slab class 如 48,96,120,存30会选择96(stats slab)

    3.按顺序寻找可用chunk

    ①slot:检查slab回收空间slot里面是否有剩余chunk

       delete:delete是标记到slot

       exptime: get时检查的过期对象标记到slot

    ②end_page_ptr:检查page中是否有剩余chunk

    ③memory:内存还有剩余空间可以用于开辟新的slab

    ④LRU

    4.memcached的数据存储方式的缺点:

    由于chunk的大小是预先分配好的特定长度,因此如果数据不能完全填满chunk,那么剩余的空间就浪费了

    5.lazy expiration(延迟/惰性 过期)

    memcached不会监控是否过期,而是在外部来获取数据的时候,才检查记录的时间戳,因此成为lazy expiration

    6.LRU(least recently userd 最近最少使用)

    当空间不足的时候,memcached会优先使用已经过期的数据空间,如果还不够,那么就会把最近最少使用的对象的空间释放出来使用

    7.懒惰删除机制

    删除item对象时,不释放内存,作删除标记,指针放入slot回收插槽,次分配的时候直接使用

    注意:memcached的LRU不是全局的,而是针对slab的,可以说是区域性的

  • 相关阅读:
    解决svn working copy locked问题
    如何:给代码加上书签
    Ext Gantt Web甘特图自定义任务树
    Ext Gantt Web甘特图数据结构
    配置Apache服务器(2)
    Ext Gantt Web自定义条形图
    安装Apache服务器(1)
    IF YOU HAVE A DREAM, GO FOR IT RIGHT NOW
    发现自己是这么不理智
    这班上的
  • 原文地址:https://www.cnblogs.com/an5211/p/6779951.html
Copyright © 2011-2022 走看看