您好,欢迎来到12图资源库!分享精神,快乐你我!我们只是素材的搬运工!!
  • 首 页
  • 当前位置:首页 > 开发 > WEB开发 >
    能够是目前最详细的Redis内存模型及运用解读(7)
    时间:2018-08-09 08:10 来源:网络整理 作者:网络 浏览:收藏 挑错 推荐 打印

    jedis.set("aa" + i, "aa" + i); //key和value长度都是7字节,且不是整数 

     

    public static String getMemory(){ 

    String memoryAllLine = jedis.info("memory"); 

    String usedMemoryLine = memoryAllLine.split("\r\n")[1]; 

    String memory = usedMemoryLine.substring(usedMemoryLine.indexOf(':') + 1); 

    return memory; 

    运转结果:8247552

    实际值与结果值误差在万分之1.2,关于计算需求多少内存来说,这个精度曾经足够了。之所以会存在误差,是由于在我们插入90000条数据之前redis已分配了一定的bucket空间,而这些bucket空间尚未运用。

    作为比照将key和value的长度由7字节添加到8字节,则对应的SDS变为17个字节,jemalloc会分配32个字节,因此每个dictEntry占用的字节数也由80字节变为112字节。此时预算这90000个键值对占据内存大小为:90000*112 + 131072*8 = 11128576。

    在redis中验证代码如下(只修正插入数据的代码):

    public static void insertData(){ 

    for(int i = 10000; i < 100000; i++){ 

    jedis.set("aaa" + i, "aaa" + i); //key和value长度都是8字节,且不是整数 

    运转结果:11128576;预算准确。

    关于字符串类型之外的其他类型,对内存占用的预算办法是相似的,需求结合详细类型的编码方式来确定。

    2、优化内存占用

    了解redis的内存模型,对优化redis内存占用有很大协助。下面引见几种优化场景。

    (1)应用jemalloc特性停止优化

    上一小节所讲述的90000个键值便是一个例子。由于jemalloc分配内存时数值是不延续的,因此key/value字符串变化一个字节,能够会惹起占用内存很大的变动;在设计时可以应用这一点。

    例如,假设key的长度假设是8个字节,则SDS为17字节,jemalloc分配32字节;此时将key长度缩减为7个字节,则SDS为16字节,jemalloc分配16字节;则每个key所占用的空间都可以增加一半。

    (2)运用整型/长整型

    假设是整型/长整型,Redis会运用int类型(8字节)存储来替代字符串,可以节省更多空间。因此在可以运用长整型/整型替代字符串的场景下,尽量运用长整型/整型。

    (3)共享对象

    应用共享对象,可以增加对象的创立(同时增加了redisObject的创立),节省内存空间。目前redis中的共享对象只包括10000个整数(0-9999);可以经过调整REDIS_SHARED_INTEGERS参数提高共享对象的个数;例如将REDIS_SHARED_INTEGERS调整到20000,则0-19999之间的对象都可以共享。

    思索这样一种场景:论坛网站在redis中存储了每个帖子的阅读数,而这些阅读数绝大少数散布在0-20000之间,这时分经过适当增大REDIS_SHARED_INTEGERS参数,便可以应用共享对象节省内存空间。

    (4)避免过度设计

    但是需求留意的是,不论是哪种优化场景,都要思索内存空间与设计复杂度的权衡;而设计复杂度会影响到代码的复杂度、可维护性。

    假设数据量较小,那么为了节省内存而使得代码的开发、维护变得愈加困难并不划算;还是以前面讲到的90000个键值对为例,实践上节省的内存空间只要几MB。但是假设数据量有几千万甚至上亿,思索内存的优化就比较必要了。

    3、关注内存碎片率

    内存碎片率是一个重要的参数,对redis 内存的优化有重要意义。

    假设内存碎片率过高(jemalloc在1.03左右比较正常),阐明内存碎片多,内存糜费严重;这时便可以思索重启redis效劳,在内存中对数据停止重排,增加内存碎片。

    假设内存碎片率小于1,阐明redis内存不足,部分数据运用了虚拟内存(即swap);由于虚拟内存的存取速度比物理内存差很多(2-3个数量级),此时redis的拜访速度能够会变得很慢。因此必须设法增大物理内存(可以添加效劳器节点数量,或提高单机内存),或增加redis中的数据。

    要增加redis中的数据,除了选用适宜的数据类型、应用共享对象等,还有一点是要设置合理的数据回收策略(maxmemory-policy),当内存到达一定量后,依据不同的优先级对内存停止回收。

    六、参考文献

    《Redis开发与运维》

    《Redis设计与完成》

    https://redis.io/documentation

    https://www.cnblogs.com/lhcpig/p/4769397.html

    https://searchdatabase.techtarget.com.cn/7-20218/

    【编辑引荐】

    3分钟深化学习Redis的高可用特性“耐久化”

    学会这15点,让你分分钟拿下Redis数据库

    这7本书,让你分分钟拿下Redis数据库

    散布式之Redis数据库温习精讲

    【引荐】六大收费的Redis内存剖析工具

    (责任编辑:admin)