1、首先需要再启动的时候这样:
memcached -d -m 4 -u root -p 11211 -o slab_reassign,slab_automove=1
2、然后利用python脚本写入memcache进行测试
写小数据的程序
#!/usr/bin/python
# -*- coding: UTF-8 -*-
from pymemcache.client.hash import HashClient
server = [('localhost', 11211), ('localhost', 11212)]
server = server[:1]
if __name__ == '__main__':
print(server)
mc = HashClient(server)
count = 50000
while (count > 0):
key = "eeee%.5d" % count
mc.set(key, "a", 30)
# mc.get(key)
print(key)
count -= 1
print('ok...')
写大数据的程序
#!/usr/bin/python
# -*- coding: UTF-8 -*-
from pymemcache.client.hash import HashClient
import uuid
server = [('localhost', 11211), ('localhost', 11212)]
server = server[:1]
if __name__ == '__main__':
print(server)
mc = HashClient(server)
count = 30000
while (count > 0):
key = "cccc%.5d" % count
value = str(uuid.uuid4()) + str(uuid.uuid4()) + str(uuid.uuid4())
mc.set(key, value)
# mc.get(key)
print(key)
count -= 1
print('ok...')
为了方便查看结果,我们这样,先把启动参数修改成这样(注意在生产环境中不要把slab_automove设置为2):
memcached -d -m 8 -u root -p 11211 -o slab_reassign,slab_automove=2
然后,我们先运行一下保存小数据量的程序,然后看一下memcache中的状态。
稍等一会。等待小数据都过期
这时,保存大数据量的数据。
能够看到,现在是把已经分配给slab 1的page重新分配给了slab 4。
那么这个时候会不会有LRU淘汰呢?答案是会的。
内部的机制是如果发现当前的有LRU淘汰,那么会从其他有空闲的slab中抢过来一个页。同时在stats命令中能够看到已经进行slabs_moved的次数。
现在再次扩大slab 4中的存储内容,然后看一下效果。
能够看到slab4 又抢走了slab1一个page