面试题答案
一键面试数据结构设计优化
- 合理选择哈希编码:
- Redis哈希对象有两种编码方式,ziplist(压缩列表)和hashtable(哈希表)。当哈希对象的元素个数较少且每个元素的键和值都较短时,使用ziplist编码能有效节省内存。例如,存储用户的简单配置信息,如用户名、性别、年龄等少量字段,且这些字段值都较短时,ziplist编码更为合适。可以通过
config set hash-max-ziplist-entries
和config set hash-max-ziplist-value
来调整使用ziplist编码的条件。
- Redis哈希对象有两种编码方式,ziplist(压缩列表)和hashtable(哈希表)。当哈希对象的元素个数较少且每个元素的键和值都较短时,使用ziplist编码能有效节省内存。例如,存储用户的简单配置信息,如用户名、性别、年龄等少量字段,且这些字段值都较短时,ziplist编码更为合适。可以通过
- 对象复用与共享:
- 对于一些常用的固定值,可以使用对象共享机制。比如,在多个哈希对象中都可能出现的“状态正常”“状态异常”等固定字符串,Redis内部可以通过共享这些对象来节省内存。Redis默认会对范围在
0
到9999
的整数对象进行共享。
- 对于一些常用的固定值,可以使用对象共享机制。比如,在多个哈希对象中都可能出现的“状态正常”“状态异常”等固定字符串,Redis内部可以通过共享这些对象来节省内存。Redis默认会对范围在
存储策略优化
- 数据分片策略:
- 一致性哈希:在分布式存储中,一致性哈希算法能有效减少节点变动时数据的迁移量。将哈希空间组织成一个虚拟的圆环,每个节点在这个圆环上有一个对应的位置。对于要存储的哈希对象,通过哈希函数计算出其在圆环上的位置,然后顺时针找到最近的节点进行存储。这样,当新增或删除节点时,只有该节点相邻区域的数据需要迁移。
- 按业务逻辑分片:根据数据的业务特性进行分片。例如,在一个电商系统中,可以按商品类别将哈希对象存储到不同节点,将服装类商品相关的哈希对象存储在一组节点,电子产品类存储在另一组节点。这样能提高查询效率,同时减少单个节点的负载。
- 过期策略:
- 设置合理的过期时间:对于一些时效性强的数据,如缓存的短期用户登录信息等,设置合适的过期时间能及时释放内存。可以在添加哈希对象时使用
EXPIRE
命令设置过期时间。同时,采用定期删除和惰性删除相结合的过期策略。定期删除由Redis定期随机抽取一部分设置了过期时间的键进行检查并删除过期键;惰性删除则是在获取键时检查键是否过期,过期则删除。
- 设置合理的过期时间:对于一些时效性强的数据,如缓存的短期用户登录信息等,设置合适的过期时间能及时释放内存。可以在添加哈希对象时使用
- 内存淘汰策略:
- 选择合适的淘汰策略:根据应用场景选择合适的内存淘汰策略。例如,
volatile - lru
策略会从设置了过期时间的键中选择最近最少使用的键进行淘汰,适用于缓存场景;而allkeys - lru
则从所有键中选择最近最少使用的键淘汰,适合对所有数据都有内存限制的场景。可以通过config set maxmemory - policy
来设置内存淘汰策略。
- 选择合适的淘汰策略:根据应用场景选择合适的内存淘汰策略。例如,