一) redis常用的数据结构以及在业务中使用的场景和注意事项

部分参考 https://zhuanlan.zhihu.com/p/38079073
精讲Redis内存模型

  1. 5种基本数据类型
  2. 字符串
    字符串是最基础的类型,所有的key都是字符串类型。字符串的长度不得超出512MB。字符串内部有3种int(长整型,当字符串的值是整型时就用int来存储)、embstr(短字符串)、raw(长字符串)。

string 类型在 redis 中是二进制安全(binary safe)的,这意味着 string 值关心二进制的字符串,不关心具体格式,你可以用它存储 json 格式或 JPEG 图片格式的字符串。

  1. list
    实际上是双向链表。故可以充当数组、队列和栈。
    需要注意,list类型的内部编码支持压缩列表(ziplist)和双端链表(linkedList)两种。其中压缩列表是一种特殊设计的数据结构,可以大大节约内存存储空间大小,代价是查找和修改操作时间损耗偏大。故在节点数比较少的时候,可以通过ziplist来减少内存空间使用;当节点数较多时考虑到时间成本,就还是使用双端链表了。
    默认情况下,只有同时满足下面两个条件时,才会自动使用压缩列表:列表中元素数量小于512个;列表中所有字符串对象都不足64字节。

  2. 哈希hash
    Hash不仅仅是5种基本类型,也是redis作为K-V数据库所使用的数据结构,也就是说整个K-V是一个大的hash结构,实际上用的是一个字典dict结构,dict中有2个哈希表。每个哈希表都是一个链表数组。 在这里插入图片描述

Hash内部的编码既有可能是压缩列表,也有可能是哈希表。常用命令: hget,hset,hgetall 等。

使用场景:减少序列化开销和存储成本
https://blog.csdn.net/xiaoliuliu2050/article/details/73250708

  1. set
    Set中元素是不能重复的,并且无序的。它可以用来做两大块
    a)set的增删改查
    b)set的交集、并集、差集等,这个的典型应用场景就是求两个人的共同的好友。
    集合的内部编码可以是整数集合(intset)或哈希表(hashtable)。集合在使用哈希表时,值全部被置为null。就是只用了其中的key功能。

5.sortSet
有序集合,通过为每一个元素设置一个score分数来作为排序依据。在集合类型的场景上加入排序就是有序集合的应用场景了。比如根据好友的“亲密度”排序显示好友列表。

实际上还有一些基于上述类型的组合类型,例如位图bitmap、hyperloglog等

使用场景
https://segmentfault.com/a/1190000012212663

2.了解这几种基本类型的作用
1)估计redis使用内存大小
假设有90000个键值对,每个key的长度是7个字节,每个value的长度也是7个字节(且key和value都不是整数);下面来估算这90000个键值对所占用的空间。在估算占据空间之前,首先可以判定字符串类型使用的编码方式:embstr。

根据redis的内存模型,90000个键值对占用的内存空间分为两大块:
A)90000个dictEntry组成的Dict的空间(也叫bucket桶空间)
先不考虑ht1(扩容时才会有实际大小),对应ht0,它的数组的长度n为大于90000的最小的2^n,是131072,每个bucket元素需要占用8字节(64位OS,每个指针都是8 byte)
B)90000个键值对对应的DictEntry的空间
每个DictEntry需要约80字节,合计是90000*80 byte

  1. 一个dictEntry,24字节,jemalloc会分配32字节的内存块
  2. 一个key,7字节,所以SDS(key)需要7+9=16个字节,jemalloc会分配16字节的内存块
  3. 一个redisObject,16字节,jemalloc会分配16字节的内存块
  4. 一个value,7字节,所以SDS(value)需要7+9=16个字节,jemalloc会分配16字节的内存块

故总计空间是9000080 + 1310728 = 8248576byte

2)优化内存占用
注意利用jemalloc特性进行优化,主要是jemalloc是分配一个稍大的最小表中提供的值,故分配17 byte对应32byte;而16byte就是16byte,两者空间损耗差了一倍。

如果是整型/长整型,Redis会使用int类型(8字节)存储来代替字符串,可以节省更多空间。因此在可以使用长整型/整型代替字符串的场景下,尽量使用长整型/整型。
3)关注内存碎片率

猜你喜欢

转载自blog.csdn.net/xiaohesdu/article/details/87906063