面试题答案
一键面试Redis中并不存在STORE选项
在Redis中,可能你想问的是STANDARD
编码方式(Redis内部对数据结构存储编码方式,不是一个显式“选项”)。
提升存储效率的工作原理
- 字符串优化:
- 对于小字符串,Redis会采用
embstr
编码方式(属于STANDARD编码范畴)。embstr
编码将Redis对象头和字符串内容连续存储在一块内存中,相比于raw
编码(用于大字符串),减少了内存碎片。例如,一个短字符串“hello”,使用embstr
编码可以在内存中紧凑存储,避免了为对象头和字符串内容分别分配内存。
- 对于小字符串,Redis会采用
- 整数优化:
- 对于小整数,Redis会直接将整数值存储在Redis对象结构内,而不是像大整数那样需要额外分配内存存储数字的字符串表示。例如,对于整数1 - 2^31 - 1 (在32位系统下),会采用
int
编码方式,这种方式直接在对象结构中存储整数值,大大节省了内存空间。
- 对于小整数,Redis会直接将整数值存储在Redis对象结构内,而不是像大整数那样需要额外分配内存存储数字的字符串表示。例如,对于整数1 - 2^31 - 1 (在32位系统下),会采用
主要作用的数据结构或场景
- 字符串:
- 对于短字符串,
embstr
编码(STANDARD编码的一种形式)可显著提升存储效率。在缓存一些小的文本数据,如配置信息、短文本消息等场景中,这种优化效果明显。例如,缓存一个网站的简短标题,使用embstr
编码可以减少内存占用。
- 对于短字符串,
- 哈希:
- 当哈希对象中的键值对数量较少且每个键值对的长度较短时,Redis会使用
ziplist
编码(一种STANDARD编码方式)。ziplist
是一种紧凑的连续内存结构,它将多个键值对紧凑存储在一起,减少了内存碎片化,提升存储效率。比如,在存储用户的一些基本信息,如姓名、年龄等少量字段时,使用ziplist
编码的哈希结构可以高效存储。
- 当哈希对象中的键值对数量较少且每个键值对的长度较短时,Redis会使用
- 列表:
- 当列表对象中的元素数量较少且每个元素都是小整数或者短字符串时,会采用
ziplist
编码。这种编码方式在存储少量有序元素场景中,能有效利用内存。例如,存储一个小型任务队列,任务标识是短字符串,使用ziplist
编码的列表可以提升存储效率。
- 当列表对象中的元素数量较少且每个元素都是小整数或者短字符串时,会采用
- 集合:
- 当集合对象中的元素都是小整数或者短字符串且元素数量较少时,会采用
intset
(用于小整数集合)或hashtable
(用于短字符串集合,这里hashtable
是STANDARD编码的一种实现形式)编码。intset
是一种紧凑的整数集合结构,对于存储少量不重复的小整数集合非常高效;而hashtable
编码的集合在处理少量短字符串元素集合时,能有效利用内存。例如,存储一个小型标签集合,标签是短字符串,hashtable
编码的集合可以高效存储。
- 当集合对象中的元素都是小整数或者短字符串且元素数量较少时,会采用