Redis教程(十四):内存优化介绍

 更新时间:2015年05月04日 08:45:27   投稿:junjie  
这篇文章主要介绍了Redis教程(十四):内存优化介绍,本文讲解了特殊编码、BIT和Byte级别的操作、尽可能使用Hash等内容,需要的朋友可以参考下

一、特殊编码:

    自从Redis 2.2之后,很多数据类型都可以通过特殊编码的方式来进行存储空间的优化。其中,Hash、List和由Integer组成的Sets都可以通过该方式来优化存储结构,以便占用更少的空间,在有些情况下,可以省去9/10的空间。
    这些特殊编码对于Redis的使用而言是完全透明的,事实上,它只是CPU和内存之间的一个交易而言。如果内存使用率方面高一些,那么在操作数据时消耗的CPU自然要多一些,反之亦然。在Redis中提供了一组配置参数用于设置与特殊编码相关的各种阈值,如:
 

复制代码 代码如下:

    #如果Hash中字段的数量小于参数值,Redis将对该Key的Hash Value采用特殊编码。
    hash-max-zipmap-entries 64
    #如果Hash中各个字段的最大长度不超过512字节,Redis也将对该Key的Hash Value采用特殊编码方式。
    hash-max-zipmap-value 512
    #下面两个参数的含义基本等同于上面两个和Hash相关的参数,只是作用的对象类型为List。
    list-max-ziplist-entries 512
    list-max-ziplist-value 64
    #如果set中整型元素的数量不超过512时,Redis将会采用该特殊编码。
    set-max-intset-entries 512
 

    倘若某个已经被编码的值再经过修改之后超过了配置信息中的最大限制,那么Redis会自动将其转换为正常编码格式,这一操作是非常快速的,但是如果反过来操作,将一个正常编码的较大值转换为特殊编码,Redis的建议是,在正式做之前最好先简单测试一下转换效率,因为这样的转换往往是非常低效的。
   
二、BIT和Byte级别的操作:

    从Redis 2.2开始,Redis提供了GETRANGE/SETRANGE/GETBIT/SETBIT四个用于字符串类型Key/Value的命令。通过这些命令,我们便可以像操作数组那样来访问String类型的值数据了。比如唯一标识用户身份的ID,可能仅仅是String值的其中一段子字符串。这样就可以通过GETRANGE/SETRANGE命令来方便的提取。再有就是可以使用BITMAP来表示用户的性别信息,如1表示male,0表示female。用这种方式来表示100,000,000个用户的性别信息时,也仅仅占用12MB的存储空间,与此同时,在通过SETBIT/GETBIT命令进行数据遍历也是非常高效的。
   
三、尽可能使用Hash:

    由于小的Hash类型数据占用的空间相对较少,因此我们在实际应用时应该尽可能的考虑使用Hash类型,比如用户的注册信息,这其中包括姓名、性别、email、年龄和口令等字段。我们当然可以将这些信息以Key的形式进行存储,而用户填写的信息则以String Value的形式存储。然而Redis则更为推荐以Hash的形式存储,以上信息则以Field/Value的形式表示。
    现在我们就通过学习Redis的存储机制来进一步证明这一说法。在该篇博客的开始处已经提到了特殊编码机制,其中有两个和Hash类型相关的配置参数:hash-max-zipmap-entries和hash-max-zipmap-value。至于它们的作用范围前面已经给出,这里就不再过多的赘述了。现在我们先假设存储在Hash Value中的字段数量小于hash-max-zipmap-entries,而每个元素的长度又同时小于hash-max-zipmap-value。这样每当有新的Hash类型的Key/Value存储时,Redis都会为Hash Value创建定长的空间,最大可预分配的字节数为:
    total_bytes = hash-max-zipmap-entries * hash-max-zipmap-value
    这样一来,Hash中所有字段的位置已经预留,并且可以像访问数组那样随机的访问Field/Value,他们之间的步长间隔为hash-max-zipmap-value。只有当Hash Value中的字段数量或某一新元素的长度分别超过以上两个参数值时,Redis才会考虑将他们以Hash Table的方式进行重新存储,否则将始终保持这种高效的存储和访问方式。不仅如此,由于每个Key都要存储一些关联的系统信息,如过期时间、LRU等,因此和String类型的Key/Value相比,Hash类型极大的减少了Key的数量(大部分的Key都以Hash字段的形式表示并存储了),从而进一步优化了存储空间的使用效率。

相关文章

  • Redis大Key问题的解决方案

    Redis大Key问题的解决方案

    Redis中的大Key问题指的是某些键(key)所对应的值(value)特别大或集合类数据结构中元素数量过多,大Key会导致读取成本高、写操作易阻塞、慢查询和主从同步异常等问题,本文就来介绍一下如何解决,感兴趣的可以了解一下
    2024-09-09
  • Redis高可用之持久化

    Redis高可用之持久化

    在web服务器中,高可用是指服务器可以正常访问的时间,衡量的标准是在多长时间内可以提供正常服务(99.9%、99.99%、99.999%等等),Redis中,实现高可用的技术主要包括持久化、主从复制、哨兵和cluster集群,感兴趣的同学可以阅读本文
    2023-04-04
  • Redis是单线程的吗

    Redis是单线程的吗

    Redis使用单线程的原因就是多线程并不能有效提升Redis的性能,相反可能还会降低性能,所以自然而然使用单线程,本文给大家详细介绍了Redis为什么是单线程的,感兴趣的朋友跟随小编一起看看吧
    2023-06-06
  • windows下通过批处理脚本启动redis的操作

    windows下通过批处理脚本启动redis的操作

    本文主要给大家介绍了windows下通过批处理脚本启动redis的操作,windows下redis启动,需要进入redis安装目录,然后shift+右键,选择“在此处打开命令窗口”,然后输入redis-server.exe redis.conf,就可以启动redis了,文中有详细的图文参考,感兴趣的朋友可以参考下
    2023-12-12
  • Linux 下redis5.0.0安装教程详解

    Linux 下redis5.0.0安装教程详解

    这篇文章主要介绍了Linux 下redis5.0.0安装教程,本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-10-10
  • Redis中的慢日志

    Redis中的慢日志

    这篇文章主要介绍了Redis中的慢日志,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • Redis实现分布式锁和等待序列的方法示例

    Redis实现分布式锁和等待序列的方法示例

    这篇文章主要介绍了Redis实现分布式锁和等待序列的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-06-06
  • redis启动失败问题之完美解决方案

    redis启动失败问题之完美解决方案

    这篇文章主要介绍了redis启动失败问题之完美解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • 详解Redis单线程架构的优势与不足

    详解Redis单线程架构的优势与不足

    很多人都遇到过这么一道面试题:Redis是单线程还是多线程?这个问题既简单又复杂,说他简单是因为大多数人都知道Redis是单线程,说复杂是因为这个答案其实并不准确,本文就给大家讲讲Redis单线程架构的优势与不足,需要的朋友可以参考下
    2024-02-02
  • Redis数据结构原理浅析

    Redis数据结构原理浅析

    这篇文章主要为大家介绍了Redis数据结构原理浅析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02

最新评论