redis内存操作

本文基本上是对redis官网上内存优化一文的翻译,内存优化

集合类型的特殊编码操作

redis 2.2开始会对一些小的数据集进行进行优化以占用更少的空间,如list,hash,元素为整数的set,有序集的元素个数和最大元素大小小于给定值时,会以一种非常高效的方式进行编码,是占用的内存可以减少10倍(平均5倍)。

对于用户和API来说,这些操作完全是透明的,这是由cpu/内存权衡的,以下是是redis.conf指令调整特殊编码类型的最大元素数和最大元素大小。详情可以在redis.conf配置文件上有说明。

hash-max-zipmap-entries 512 (hash-max-ziplist-entries for Redis >= 2.6) #hash类型的元素最大个数
hash-max-zipmap-value 64  (hash-max-ziplist-value for Redis >= 2.6)     #hash类型的最大元素大小
list-max-ziplist-entries 512                           #list类型的元素最大个数
list-max-ziplist-value 64 # list类型的最大元素大小 zset-max-ziplist-entries 128 #有序集的最大元素个数 zset-max-ziplist-value 64 #有序集的最大元素大小 set-max-intset-entries 512 #set集合的最大元素个数

  如何元素的个数或大小超出配置,将转换成自动编码,如果自己修改配置的化,通常建议作下基准测试。

使用32位系统

使用位与字节操作

  redis在2.2版本引入了字节和位操作GETRANGESETRANGEGETBITSETBIT。这些命令可以将字符串类型视作字节数组。使用它们可以更加节约内存使用。如使用一个bit位来保存用户性别信息:0为男,1为女。

尽可能使用hash类型

  如上提到的,hash类型在小的集合下会被特殊编码,可以增加内存使用效率。因此,应当使用hash来表示数据。例如,在一个web应用中,应当使用一个hash保存一个对象,而不是使用许多代表用户属性的key来表示用户属性。如user-100001{age:19, sex:1, adress: 杭州},而不是user.age-100001:19这种键值对来保存用户信息。

使用hash抽象一个节省内存的键值存储

  我们可以使用redis来对普通的键值存储来进行建模,其中值可以是字符串,这不仅比普通的键值存储有更高的内存效率,而且比memcached更加高效。

  让我们从一些事实开始,在少量的数据下,使用key-value表示的化比使用hash来表示占用了更多的内存。

  很多情况下hash表比较小,只包含几个字段。当hash比较小时,会被编码为O(N)的数据结构,如具有长度前缀的键值对数组。由于我们只有在N很小的时候才这样做,所以Hget和HSET的平均时间还是O(1)。

  只从时间复杂度来说,这种解释并不充分,但是常量时间方面来看确实如此,应为数组结构与cpu的缓存能在一起发挥的很好(数组结构比hash的局部缓存性能好)。

  但是由于hash的key功能没有redis的齐全,如不能有过期时间、并且只能时字符串。

 

posted @ 2019-05-31 10:15  hhanhao  阅读(446)  评论(0编辑  收藏  举报