Fork me on GitHub

版权声明 本站原创文章 由 萌叔 发表
转载请注明 萌叔 | 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

2018110402.jpeg-55.7kB

图1 X轴是单位是10万(1表示10w个key,100表示1000w个key),Y轴单位是秒,写入10万key所花的时间是在12 ~ 15 秒之间波动,但并没有随着key的数量变多,而显著增加

图2
2018110401.jpeg-48.8kB

图2 X轴是单位是10万(1表示10w个key,100表示1000w个key),Y轴单位是字节
内存的消耗,基本随着key的数量变化成线性变化,但是在某些点上明显有跳变的情况,可能是rehash的结果。

1.3 结论

可见redis本身还是相当靠谱的,在1000w个key的情况, 性能数据也还是十分稳定。100w这个数值,极有可能是拍脑袋得到的。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据