面试题答案
一键面试字符串
- 使用int编码:如果字符串值是整数值且在一定范围内(如64位系统下,能编码为long类型的整数),Redis会使用int编码存储,仅需8字节,相比普通字符串编码大大减少空间。
- 优化字符串长度:尽量避免过长的字符串,因为长字符串在存储和读写时都会消耗更多资源。对于长文本等数据,可以考虑外部存储(如文件系统),Redis中仅存储引用。
哈希
- ziplist编码:当哈希对象同时满足两个条件:成员数量比较少(默认小于512个)且所有键值对的键和值字符串长度都比较短(默认小于64字节)时,Redis会使用ziplist编码。这种编码方式将所有键值对紧凑地存储在一起,减少内存碎片和总体占用空间。
- hashtable优化:当哈希对象不满足ziplist编码条件时,使用hashtable编码。在这种情况下,可以通过合理预估哈希对象的大小,设置合适的初始容量,减少哈希表扩容带来的性能开销。
列表
- ziplist编码:与哈希类似,当列表对象同时满足元素数量较少(默认小于512个)且所有元素都是小整数值或长度较短的字符串(默认小于64字节)时,使用ziplist编码,紧凑存储元素,减少空间占用。
- linkedlist优化:当列表元素较多或元素不符合ziplist编码条件时,使用linkedlist编码。可以通过批量操作,如一次获取或插入多个元素,减少链表遍历次数,提高读写效率。同时,在插入和删除元素时,尽量在链表两端操作,避免在中间位置频繁操作,因为中间位置操作需要先遍历找到位置,开销较大。