面试题答案
一键面试预防策略
- 定期清理过期键:通过定期执行
FLUSHDB
或FLUSHALL
命令,在业务低峰期清理Redis数据库中的过期键,减少过期键对AOF文件的影响。但需谨慎操作,避免误删数据。 - 合理设置键的过期时间:对于库存相关的键,根据业务需求设置合适的过期时间,尽量避免过期时间设置过短导致频繁过期键处理问题,同时也不能过长造成内存浪费。
- 监控内存使用:使用Redis提供的监控工具(如
INFO
命令获取内存相关信息),实时监控Redis内存使用情况。当内存使用率接近阈值时,及时调整过期策略或增加内存资源,防止因内存不足导致过期键处理异常。 - 采用惰性删除与定期删除结合:利用Redis默认的惰性删除机制(访问键时检查是否过期,过期则删除),同时合理配置定期删除的频率和扫描比例(通过
redis.conf
中的hz
参数和active-expire-effort
参数控制),确保过期键能及时被删除。
解决方法
- 数据校验与修复:
- 定期校验:定时对库存数据进行全量或增量校验。例如,对比Redis中的库存数据与数据库中的原始库存数据(假设数据库为库存的最终一致性存储)。如果发现不一致,根据数据库中的数据修复Redis库存。
- 实时校验:在关键操作(如秒杀成功时),对库存数据进行实时校验。若发现库存数据异常,立即暂停相关业务操作,进行数据修复后再恢复业务。
- AOF重写优化:
- 手动重写:在业务低峰期手动执行
BGREWRITEAOF
命令,重写AOF文件,去除过期键相关的无效记录,优化AOF文件大小,减少因过期键处理导致的兼容性问题。 - 自动重写配置:合理配置
redis.conf
中的auto - aof - rewrite - min - size
和auto - aof - rewrite - percentage
参数,让Redis在满足一定条件时自动进行AOF重写。
- 手动重写:在业务低峰期手动执行
- 升级Redis版本:关注Redis官方发布的新版本,及时升级到稳定性更好、对过期键处理兼容性问题修复更完善的版本,以减少因版本问题导致的过期键处理异常。
- 使用Lua脚本:将涉及库存操作(如扣减库存、检查库存等)的逻辑封装到Lua脚本中。Lua脚本在Redis中执行是原子性的,可避免因过期键处理和其他并发操作造成的库存数据不准确问题。