Redis :优化方法和内部编码介绍

一:Redis 优化方法
1:尽可能使用hash数据结构(缺点,不支持过期时间)组合多个fileld-value, Hash 比多个key-value分开写更省内存,性能更快。可以在redis.conf 配置特殊编码的最大元素数(512个key)和最大元素大小(64kb)。
hash-max-zipmap-entries 512 (hash-max-ziplist-entries for Redis >= 2.6)
hash-max-zipmap-value 64 (hash-max-ziplist-value for Redis >= 2.6)
list-max-ziplist-entries 512
list-max-ziplist-value 64
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
set-max-intset-entries 512
2:尽可能使用Bit数据结构,性能高,占用内存小。
3:尽可能的少创建key,key 也占用内存,key多的时候内存大小占用的内存也有点多
4:如果缓存的大小少于4MB,使用32位实例节省更多的内存,使用32位目标编译的Redis使用每个密钥的内存少得多,因为指针很小。
5:合理设置内部编码的值,如果没有超过内部编码设置的最大值,操作速度会非常快,否则会转换成正常编码。
6:应该尽量避免频繁执行增长字符串的命令,如append、setrange,改为直接用set一次性创建字符串,减少预分配带来的内存浪费和降低内存碎片率
7:字符串长度在39字节以内对象,在创建redisObject封装对象时只需分配内存1次,可提高性能
8 : 使用管道执行批量操作(只能在同一个Redis实例上)
9:共享对象池,Redis内部维护[0-9999]的整数对象池,对于0-9999的内部整数类型的元素、整数值对象都会直接引用整数对象池中的对象,因此尽量使用整数对象可节省内存;
注意:
启用LRU相关的溢出策略时,无法使用共享对象池;
对于ziplist编码的值对象,也无法使用共享对象池(成本过高);

二:Redis 内部编码介绍

1260387-20171217225104530-830166094.png

参考:https://www.cnblogs.com/yangmingxianshen/p/8054094.html
a:内部编码好处:
1:可以改进内部编码,对外的命令和数据结构没有改变,这样一旦开发开发出优秀的内部编码,无需改动外部数据结构和命令
2:redis 会根据内部编码配置选项动态调整内部编码,可节省空间和提升性能。
b:内部编码详细介绍
String : int 8个字节的长整型
embstr : 小于等于39个字节的字符串(推荐)
raw:大于39个字节的字符串(最大不能超过512MB)
Hash : ziplist 节省内存,当数量过大时读写性能差,数量小适合使用
hashtable : 比较耗内存,但是读写性能高
列表类型的内部编码有两种:

ziplist(压缩列表):当哈希类型元素个数小于hash-max-ziplist-entries配置(默认512个)
    同时所有值都小于hash-max-ziplist-value配置(默认64个字节)时,Redis会使用ziplist作为哈希的内部实现。

linkedlist(链表):当列表类型无法满足ziplist的条件时,Redis会使用linkedlist作为列表的内部实现。

4.集合的内部编码

集合类型的内部编码有两种:

intset(整数集合):当集合中的元素都是整数且元素个数小于set-max-intset-entries配置(默认512个)时,
    Redis会选用intset来作为集合内部实现,从而减少内存的使用。

hashtable(哈希表):当集合类型无法满足intset的条件时,Redis会使用hashtable作为集合的内部实现。

5.有序集合的内部编码

有序集合类型的内部编码有两种

ziplist(压缩列表):当有序集合的元素个数小于zset-max-ziplist-entries配置(默认128个)
    同时每个元素的值小于zset-max-ziplist-value配置(默认64个字节)时,Redis会用ziplist来作为有序集合的内部实现,ziplist可以有效减少内存使用。

skiplist(跳跃表):当ziplist条件不满足时,有序集合会使用skiplist作为内部实现,因为此时zip的读写效率会下降。

c:如何查看一个key的内部编码?
object encoding key

你可能感兴趣的:(Redis :优化方法和内部编码介绍)