标签:修改 存储 一个 字符串类型 的区别 free tom pretty 方式
redis :
redis使用malloc和free来进行内存分配,会导致内存碎片,加重操作系统内存管理器的负担,但是在4.0之后增加了自动回收内存碎片的功能,activedefrag
过期key:惰性删除 + 定期删除
达到maxmemory时的处理:配合maxmemory-policy 和 maxmemory-samples
maxmemory-policy:
volatile-lru ## 利用LRU算法移除设置过过期时间的key。
volatile-random ## 随机移除设置过过期时间的key。
volatile-ttl ## 移除即将过期的key,根据最近过期时间来删除(辅以TTL)
allkeys-lru ## 利用LRU算法移除任何key。
allkeys-random ## 随机移除任何key。
noeviction ## 不移除任何key,只是返回一个写错误
举个栗子:
REDIS的LRU:按策略采样 N 个 key(max-memory-samples) ,淘汰访问时间离现在最久的一个 ---volatile从设置了过期时间的key中抽样,allkeys从所有key中抽样
memcache:
Memcached默认情况下采用了名为Slab Allocator的机制分配、管理内存,在该机制出现以前,内存的分配是通过对所有记录简单地进行malloc和free来进行的。但是,这种方式会导致内存碎片,加重操作系统内存管理器的负担,最坏的情况下,会导致操作系统比memcached进程本身还慢。Slab Allocator就是为解决该问题而诞生的。
过期key:惰性删除
先说memcache的几个概念:
Slabs划分数据空间
Memcached并不是将所有大小的数据都放在一起的,而是预先将数据空间划分为一系列大小的slabs,每个slab只负责一定大小范围内的数据存储。每个slab只存储大于其上一个slab的size并小于或者等于自己最大size的数据。例如:slab 3只存储大小介于137 到 224 bytes的数据。如果一个数据大小为230byte的数据进行存储,它将被分配到slab 4中。每个slab负责的空间其实是不等的,memcached默认情况下下一个slab的最大值为前一个的1.25倍,这个可以通过修改-f参数来修改增长比例
Chunk才是存放缓存数据的单位
Chunk是一系列固定的内存空间,这个大小就是管理它的slab的最大存放大小。例如:slab 1的所有chunk都是104byte,而slab 4的所有chunk都是280byte。chunk是memcached实际存放缓存数据的地方,因为chunk的大小固定为slab能够存放的最大值,所以所有分配给当前slab的数据都可以被chunk存下。如果实际的数据大小小于chunk的大小,空余的空间将会被闲置,这个是为了防止内存碎片而设计的。举例来说,如果chunk size是224byte,而存储的数据只有200byte,剩下的24byte将被闲置。此外,memcached允许配置的最小的chunk空间为48个字节(key+value+flags),通过-n参数可以调节这个数值
达到maxmemory: memcache有三种LRU,Hot LRU , Warm LRU, COLD LRU
Hot LRU , Warm LRU都有特定的长度,当新数据访问,会放到Hot lru,然后末尾的元素插入到Warm LRU, warm lru末尾的元素插入到cold lru
当达到max memory 时,会从cold lru中剔除最久没有被访问的数据
内存驱逐策略LRU不是全局的,当不能为某个slab再分配页的时候,就会触发LRU机制,清除这个slab中最不经常使用的数据
Memcached在启动时通过-m指定最大使用内存,但是这个不会一启动就占用,是随着需要逐步分配给各slab的。 如果一个新的缓存数据要被存放,memcached首先选择一个合适的slab,然后查看该slab是否还有空闲的chunk,如果有则直接存放进去;或者替换已经标记为过期的键,如果没有则要进行申请。当没有内存页能够分配的时候(就是已经分配的内存达到启动时的-m参数),就会去驱逐策略去驱逐键
根据以上情况,memcached 加入了页面重分配机制
标签:修改 存储 一个 字符串类型 的区别 free tom pretty 方式
原文地址:https://www.cnblogs.com/start-from-zero/p/12937979.html