Redis 关于大量1级key的测试
版权声明 本站原创文章 由 萌叔 发表
转载请注明 萌叔 | https://vearne.cc
起因:有文章提到Redis的1级key数量不应该超过100w
我十分怀疑这个结论是怎么得到的。我们知道在Redis中一个DB中的所有key维护在一个HashMap中,较多的key当然会导致,key的移动更加困难,当然由于HashMap的原因,在rehash时,可能消耗更多的时间;另外内存可能有少部分浪费。可是key的数量增大到100w以上,是否真的会带来其它问题吗
1. 测试验证
1.1 测试方法
使用string 类型,不断的插入新key,为了保证key仅可能不重复,且长度一致
使用自增变量 i 的md5值
每写入10w个key记录一下当前的内存值,已经插入这10w个key所消耗的时间
import json
import redis
import random
import time
import hashlib
r = redis.Redis(host='localhost',port=6379,db=5)
SIZE = 100000
fp = open('result.txt', 'w')
counter = 0
for i in xrange(0, 100):
t1 = time.time()
for j in xrange(0, SIZE):
counter += 1
print 'counter', counter
m = hashlib.md5()
m.update(str(i * SIZE + j))
key = m.hexdigest()
r.set(key, 1)
t2 = time.time()
margin = t2 - t1
info = r.info()
#print info
ll = []
ll.append( str((i + 1) * SIZE) )
ll.append(str(margin))
ll.append(str(info['used_memory']))
fp.write(','.join(ll) + '\n')
fp.flush()
print (i + 1) * SIZE, margin, info['used_memory']
fp.close()
1.2 测试数据
测试总计写入1000w个key,耗时大概在半小时
图1
图1 X轴是单位是10万(1表示10w个key,100表示1000w个key),Y轴单位是秒,写入10万key所花的时间是在12 ~ 15 秒之间波动,但并没有随着key的数量变多,而显著增加
图2
图2 X轴是单位是10万(1表示10w个key,100表示1000w个key),Y轴单位是字节
内存的消耗,基本随着key的数量变化成线性变化,但是在某些点上明显有跳变的情况,可能是rehash的结果。
1.3 结论
可见redis本身还是相当靠谱的,在1000w个key的情况, 性能数据也还是十分稳定。100w这个数值,极有可能是拍脑袋得到的。