首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Redis内存优化

Redis内存优化
EN

Stack Overflow用户
提问于 2011-09-18 22:25:46
回答 4查看 2.1K关注 0票数 8

我试图在Redis端以非常高效的内存方式编码一些数据(实际上是一个非常大的字符串)。根据Redis文档,声称“在可能的情况下使用散列”,并声明了两个配置参数:

  • “散列-max-zipmap-条目”,如果我理解得很好的话,它表示最多每个散列键必须有多少个键(对吗?)
  • “散列-max-zipmap-值”,它表示该值的最大长度。实际上,它指的是字段还是值?长度是以字节、字符还是什么为单位?

我的想法是将字符串(在某种程度上具有固定的长度)拆分成这样的数量,以便很好地处理上述参数,并将它们存储为值。字段应该是序号,以确保一致的解码。

编辑:我已经做了大量的基准测试,似乎在哈希中编码字符串会产生大约50%更好的内存消耗。

下面是我的基准脚本:

代码语言:javascript
复制
import redis, random, sys

def new_db():
    db = redis.Redis(host='localhost', port=6666, db=0)
    db.flushall()
    return db

def db_info(db):
    return " used memory %s " % db.info()["used_memory_human"]

def random_string(_len):
    letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
    return "".join([letters[random.randint(0,len(letters)-1)] for i in range(_len) ]) 

def chunk(astr, size):
    while len(astr) > size:
        yield astr[:size]
        astr = astr[size:]
    if len(astr):  
        yield astr 

def encode_as_dict(astr, size): 
    dod={}
    cnt = 0
    for i in chunk(astr,size):
        dod[cnt] = i
        cnt+=1
    return dod


db=new_db()
r = random_string(1000000)
print "size of string in bytes ", sys.getsizeof(r)
print "default Redis memory consumption", db_info(db)
dict_chunk = 10000

print "*"*100
print "BENCHMARKING \n"

db=new_db()
db.set("akey", r)
print "as string " , db_info(db)
print "*"*100

db=new_db()
db.hmset("akey", encode_as_dict(r,dict_chunk))
print "as dict and stored at value" , db_info(db)
print "*"*100

以及我的机器上的结果(32位Redis实例):

代码语言:javascript
复制
size of string in bytes  1000024
default Redis memory consumption  used memory 534.52K 
******************************************************************************************
BENCHMARKING 

as string   used memory 2.98M 
******************************************************************************************
as dict and stored at value  used memory 1.49M 

我在问是否有一种更有效的方法,通过播放我提到的参数来将字符串存储为散列。所以首先,我必须明白他们的意思..。然后我再做一次测试,看看是否有更多的收获。

EDIT2:,我是个白痴吗?基准是正确的,但它被确认为一个大字符串。如果我重复许多大字符串,将它们存储为大字符串是绝对的赢家。我认为我得到一个字符串的结果的原因在于Redis内部.

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-09-19 13:59:52

实际上,存储一个大字符串的最有效的方法是作为一个大字符串--任何其他增加开销的方法。您提到的优化用于处理大量短字符串,其中字符串之间的空空间可能成为一个问题。

存储大字符串的性能可能不如小型字符串,因为需要找到更多的连续块来存储它,但这不太可能对任何事情产生实际影响。

票数 6
EN

Stack Overflow用户

发布于 2011-09-19 02:34:36

我试过阅读Redis文档中提到的设置,这并不容易。但我不觉得你的计划是个好主意。他们描述的散列是为了为小值节省内存。这些值仍然完全存储在内存中。在我看来,当它们多次出现时(例如,当一个字符串被添加到多个集合时),它们似乎在减少开销。您的字符串不符合这些条件。我强烈怀疑你是否会用你的计划来节省内存。

当然,您可以对其进行基准测试。

票数 4
EN

Stack Overflow用户

发布于 2011-09-19 07:15:15

尝试查看红宝石内存使用文章,在文章中您可以很好地比较各种数据类型及其内存消耗。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7464867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档