首页 » Python » python获取memcached所有keys

python获取memcached所有keys

 

memcached钙化问题总结点:

1 、memcached内存分配是由slabs,page,chunk组成,chunks是具体存储key的值的,slabs根据增加因子(默认1.25)来增加chunks的大小的,一个slabs可以由多个page组成,一个page默认是1M,一个page可以分配多个chunks,分的数据是根据chunks大小来决定的。

2、当某个值大小的key很多,比如92b,memcached会先分配一个page给这个slabs,然后有新的值进入的时候,不够用,这个slabs又去申请新的page;直至内存分配完了。

3、当slabs 1分配了2个page,slabs 2分配了20个page,这时内存分配完了,由于key过期,slabs2 又空闲了10个page的空间,但这个空闲的空间不会给slabs 1用,因为memcached内存已经分配好了,不会动了,当有新的数据存入slabs 1,会覆盖掉原来的算法,覆盖的原因是根据LRU淘汰算法来的。

Slab钙化降低内存使用率,如果发生Slab钙化,有三种解决方案:

1) 重启Memcached实例,简单粗暴,启动后重新分配Slab class,但是如果是单点可能造成大量请求访问数据库,出现雪崩现象,冲跨数据库。

2) 随机过期:过期淘汰策略也支持淘汰其他slab class的数据,twitter工程师采用随机选择一个Slab,释放该Slab的所有缓存数据,然后重新建立一个合适的Slab。

3) 通过slab_reassign、slab_authmove参数控制。

能过get 所有keys,让过期的key腾出空间,
以下是python代码去获取所有keys,并get
#!/usr/bin/python
# -*- encoding=utf-8 -*-
# describe 主要是获取memcached 中所有keys值,然后对值get一次,让过期的key去释放空间,
#cachedump这个最大只能获取2M的值,所以有缺陷。
#钙化问题,如果内存分配完了,如果某个slab满了,但还有新数据存进来,原来的数据会丢掉,
#这是LRU算法来选择覆盖那个;另外一个slab 2分配了10个page,但现在数据量只用到了5个page,其余的空闲5个page是不会拿出来重新分配的。
#这个程序主要是解决,key设置了过期,内存也分配完了,get一下把过期的key释放,这样他就可以不需要用到LRU算法
import memcache
mem_address=["127.0.0.1:11211","192.168.37.128:11211"]

for m in mem_address:
    l_host=[]
    l_host.append(m)
    mem=memcache.Client(l_host)
    #获取stats items,从信息中需要获取slabs个数及对应的keys数量
    a=mem.get_stats("items")
    mem_use=a[0][1].keys()
    l_num=[]
    #这个for是从items找到类似于items:27:number 39 这样的值,最后l_num存储的是items:27:number 这个值 
    for n in mem_use:
        if n.endswith("number"):
    	    l_num.append(n)
    for i in l_num:
        b=a[0][1][i]
        c=i.split(":")[1]
        d="cachedump" + " " + c +" " + b
        tmp_a=mem.get_stats(d)
	#对某个slab中的所有keys获取keys值,对memcached所有keys进行get一次
        for n in tmp_a[0][1].keys():
     		 mem.get(n)

 

原文链接:python获取memcached所有keys,转载请注明来源!

1