面试题答案
一键面试商品信息存储策略
- 采用Hash数据结构:
- 由于商品信息包含复杂属性,Hash结构非常适合。每个商品可以作为一个Hash key,而商品的各个属性作为field,属性值作为value。例如,对于一件商品,其key可以是
product:123
,field-value对可以是name:手机
,price:5999
,brand:苹果
等。 - 考虑因素:这种结构不仅可以方便地存储和获取单个商品的所有属性,而且在内存使用上也比较高效。相比将每个属性作为单独的key存储,Hash结构减少了key的数量,降低了内存碎片。
- 由于商品信息包含复杂属性,Hash结构非常适合。每个商品可以作为一个Hash key,而商品的各个属性作为field,属性值作为value。例如,对于一件商品,其key可以是
- 压缩存储:
- 如果商品属性中有一些较长的文本描述等数据,可以考虑启用Redis的压缩功能。对于支持压缩的Redis版本(如Redis 6.0+),可以在配置文件中设置
activerehashing yes
,并且对存储商品信息的键空间启用内存回收策略maxmemory-policy volatile-lru
,结合压缩来减少内存占用。 - 考虑因素:虽然压缩会消耗一定的CPU资源,但对于电商系统中大量的商品信息存储,节省的内存空间可能更为关键,尤其是在内存资源有限的情况下。
- 如果商品属性中有一些较长的文本描述等数据,可以考虑启用Redis的压缩功能。对于支持压缩的Redis版本(如Redis 6.0+),可以在配置文件中设置
购物车数据存储策略
- 使用Set数据结构:
- 购物车有频繁的添加删除操作,Set数据结构非常适合。每个用户的购物车可以作为一个Set key,如
cart:user1
,而购物车中的商品ID作为Set的成员。添加商品时,使用SADD
命令;删除商品时,使用SREM
命令。 - 考虑因素:Set结构可以快速判断一个商品是否在购物车中(通过
SISMEMBER
命令),并且添加和删除操作的时间复杂度都是O(1),能够高效地处理购物车的频繁操作。同时,Set会自动去重,避免同一商品多次添加到购物车造成数据冗余。
- 购物车有频繁的添加删除操作,Set数据结构非常适合。每个用户的购物车可以作为一个Set key,如
- 定期清理过期数据:
- 可以为购物车设置过期时间。例如,对于长时间未操作的购物车,可以设置一个过期时间,比如7天。在添加购物车数据时,使用
SET key value EX seconds
这种方式,为购物车键设置过期时间。 - 考虑因素:电商系统中可能存在很多未结算的购物车,如果不进行清理,会占用大量内存。通过设置过期时间,可以自动清理这些无效数据,提升整体的存储效率。
- 可以为购物车设置过期时间。例如,对于长时间未操作的购物车,可以设置一个过期时间,比如7天。在添加购物车数据时,使用
综合考虑因素
- 内存与性能平衡:在调整存储选项时,要平衡内存使用和系统性能。例如,压缩虽然节省内存,但可能增加CPU负载,影响读写性能。所以要根据实际服务器资源和业务场景进行权衡。
- 数据一致性:对于购物车数据,在高并发场景下,要确保添加和删除操作的原子性,保证数据一致性。使用Redis的事务(
MULTI
、EXEC
)或者Lua脚本可以实现这一点。 - 扩展性:随着电商系统的发展,数据量可能会不断增长。选择的存储策略要便于系统的扩展,例如可以通过集群化部署Redis来应对大数据量的存储需求。