面试题答案
一键面试String
- 特点:简单的键值对存储,value 最大可存储 512MB 数据。结构简单,读写性能极高。
- 适用场景:
- 缓存:常用于缓存数据库查询结果,如用户信息、文章内容等。例如缓存用户的基本信息,key 为
user:123
,value 为用户 JSON 格式数据。 - 计数器:利用
INCR
、DECR
等命令实现计数功能,比如记录网站的访问量,key 为page:visit:count
,每次访问执行INCR
操作。
- 缓存:常用于缓存数据库查询结果,如用户信息、文章内容等。例如缓存用户的基本信息,key 为
- 存储优化:适合存储相对简单且独立的数据,避免存储大对象,减少内存占用。
Hash
- 特点:以字段 - 值的形式存储,类似对象。适合存储对象数据,相较于 String 存储对象更节省内存,因为 String 存储对象需序列化整个对象,而 Hash 只需存储各字段值。
- 适用场景:
- 存储用户信息:key 为
user:123
,field 为name
、age
、email
等,value 为对应的值。 - 商品信息存储:key 为
product:456
,field 为title
、price
、description
等,便于对商品属性进行管理。
- 存储用户信息:key 为
- 存储优化:当存储对象属性有增删改操作时,Hash 结构更灵活高效,且能有效减少内存碎片化。
List
- 特点:基于链表结构实现,支持左右两端插入和弹出元素。有序可重复,可根据索引获取元素。
- 适用场景:
- 消息队列:生产者向 List 左侧
LPUSH
消息,消费者从右侧RPOP
消息,实现异步处理。例如订单处理消息队列,将订单相关信息作为消息存入 List。 - 历史记录:记录用户操作历史,如用户浏览商品历史,每次浏览新商品
LPUSH
到 List,可通过LRANGE
获取一定数量历史记录。
- 消息队列:生产者向 List 左侧
- 存储优化:在需要有序且可重复存储数据场景下,List 结构有较好性能,避免频繁插入删除中间位置元素,减少链表操作开销。
Set
- 特点:无序且元素唯一,内部实现基于哈希表。支持交集、并集、差集等集合运算。
- 适用场景:
- 标签系统:为用户或商品设置标签,如用户标签集合,key 为
user:123:tags
,value 为各个标签,可快速判断用户是否有某个标签。 - 去重统计:统计网站 UV(独立访客),每次访问将用户 ID
SADD
到 Set 中,SCARD
获取 Set 元素个数即 UV。
- 标签系统:为用户或商品设置标签,如用户标签集合,key 为
- 存储优化:在需要去重且无序存储场景下表现良好,集合运算高效,但要注意避免存储过多元素导致哈希冲突。
ZSet
- 特点:有序且元素唯一,每个元素关联一个分数(score),通过分数排序。
- 适用场景:
- 排行榜:如游戏玩家排行榜,key 为
game:rank
,member 为玩家 ID,score 为玩家积分,通过ZRANGEBYSCORE
可获取不同排名段玩家。 - 按权重调度:任务调度系统中,将任务放入 ZSet,score 作为任务权重,调度器按分数从高到低获取任务。
- 排行榜:如游戏玩家排行榜,key 为
- 存储优化:根据业务对排序的需求合理设置 score,避免 score 分布不均导致查询性能下降。
业务需求选择示例
假设开发一个电商系统,有如下业务需求:
- 缓存商品基本信息:商品信息为对象,包含名称、价格、描述等,使用 Hash 结构,key 为
product:商品 ID
,field - value 为各属性。 - 记录商品浏览记录:需记录用户浏览商品顺序,使用 List 结构,key 为
user:用户 ID:browse_history
,将浏览商品 ID 依次LPUSH
到 List。 - 统计商品收藏用户数:需去重统计,使用 Set 结构,key 为
product:商品 ID:collect_users
,将收藏用户 IDSADD
到 Set。 - 商品销量排行榜:按销量排序,使用 ZSet 结构,key 为
product:sales_rank
,member 为商品 ID,score 为商品销量。