学习memcache要点

it2022-05-09  30

(1)memcache概述:

分布式内存缓存系统,简单而强大,以键值对形式存储,内部实现hashmap,大部分操作复杂度是O(1)

memcached 的特点 1.支持基于客户端实现的分布式功能,服务器端互不通信, 2.支持内存存储 3.协议简单 4.基于libevent的事件处理  

(2)使用及配置

增长因子是很重要的,如果出现key值分配不均时,适当的调整增长因子,可以解决内存使用不合理和key值偏移量过大的问题。

(3)slab内存分配

内存碎片化

当使用c语言或其他语言时进行malloc(申请内存),free(释放内存)等类似的命令操作内存的时候,在不断的申请和释放的过程中,形成了一些很小的内存碎片,我们无法继续使用,这种空闲,无法继续利用内存的情况,我们称之为内存的碎片化。

mc使用slab allocator的机制来管理内存

原理:预先将内存划分成数个slab class的仓库,各个仓库切分成不同尺寸的小块(chunk),需要存放内容的时候,先判断内容的大小,为其选取合理的仓库存放。如图:

 

mc如何选择合适的chunk?

 

mc会根据收到的数据的大小,选择最合适数据大小的chunk组(slab class),mc中保存着slab class内空闲chunk的列表,根据列表选择空的chunk,然后将数据缓存其中。

但是,假如有100字节的内容要存,但122大小的仓库的chunk满了,他并不会寻求更大的,比如144字节的,只会将122字节的仓库中的旧数据剔除,然后在假如进来,(最近最少使用算法)

固定大小的chunk带来的内存浪费

由于slab allocate机制中,分配的chunk的大小是固定的,因此,对于特定的item,可能会造成内存浪费,比如说,将100字节的数据缓存到122字节的chunk中,剩余的22个字节就浪费了,对于chunk空间的浪费问题,无法彻底的解决,只能缓解该问题,

如何解决该问题?

grow factor增长因子通过启动增长因子,默认是1.25,可以指定。在启动memcache的时候根据我们要存的键值对的大小,来指定-f的大小。

(4)一致性hash算法

采用一致性hash,可以解决分布式系统在增加或减少机器时大量的缓存key失效,而导致数据库瞬间压力过大。

 

设置虚拟节点

如果机器少的情况,会出现key值分配不均,增加虚拟节点,可以将key平均分布在各个节点,而且可以设置每个节点的权重,机器性能好的可以设置少的虚拟节点。

再有就是在增减机器时,只会影响部分key值失效,从而降低数据库压力增大带来的风险。

(5)LRU算法

超出内存限制后,剔除最近最少使用的key,

每个key在创建时会生成一个计数器,在更新或读取时都会更新这个计数器,这是一个时间戳。当要执行 LRU算法时,将距离当前时间最长的计数器的key删除。

 

转载于:https://www.cnblogs.com/maxingkai/p/7612145.html

相关资源:数据结构—成绩单生成器

最新回复(0)