面试题答案
一键面试键值对设计
- 精简键名:使用简短但有意义的键名,减少键名占用的内存空间。例如,将
user:123:profile
改为u:123:p
。 - 合理设计键空间:避免使用过于宽泛的键名模式,如
*
,因为这可能导致在遍历或删除键时消耗大量内存。按业务模块或功能划分键空间,例如user:login:123
、user:order:123
。 - 短值优先:如果值是一些固定的短字符串,尽量直接存储,而不是引用其他对象。例如,对于表示状态的
"active"
、"inactive"
,可以直接作为值存储。
数据结构选择
- 字符串(String):当数据是简单的文本、数字等时,使用字符串类型。但对于数值类型,注意合理使用
INCR
、DECR
等原子操作,避免每次读取和写入整个字符串。 - 哈希(Hash):当存储对象时,使用哈希结构。它比多个字符串键值对更节省内存,因为哈希的键值对紧凑存储。例如,存储用户信息
{name: "John", age: 30}
,可以用一个哈希结构hset user:123 name John age 30
。 - 列表(List):适用于按插入顺序存储数据的场景,如消息队列。但如果只需要存储唯一值且无序,考虑使用集合(Set) ,因为列表可能会存储重复值,浪费内存。
- 集合(Set):用于存储无序且唯一的数据,如标签集合。相比列表,它在去重方面更节省内存。
- 有序集合(Sorted Set):当需要对数据按某个分数排序时使用,如排行榜。合理设置分数和成员,避免过多冗余信息。
内存配置优化
- 调整内存分配策略:通过
maxmemory
配置项设置Redis使用的最大内存,避免内存耗尽导致服务器崩溃。同时,可以根据业务读写特性,设置合适的maxmemory-policy
,如volatile-lru
(在设置了过期时间的键中使用LRU淘汰策略)、allkeys-lru
(在所有键中使用LRU淘汰策略)等。 - 启用内存碎片整理:可以通过
activedefrag
配置项启用内存碎片整理,Redis会在运行过程中自动整理内存碎片,提高内存利用率。但注意这可能会消耗一定的CPU资源。
过期策略使用
- 合理设置过期时间:对于一些临时数据,如验证码、缓存数据等,设置合理的过期时间。这样可以在数据过期后自动释放内存,避免无用数据长期占用内存。
- 使用懒删除和定期删除结合:Redis采用懒删除(键被访问时发现过期则删除)和定期删除(定期扫描部分键空间删除过期键)相结合的策略。可以适当调整定期删除的频率和扫描比例,平衡内存释放和CPU消耗。