面试题答案
一键面试系统架构方面
- 主从架构:
- 主节点负责处理写请求,从节点复制主节点的数据。这样主节点专注于处理高并发写入,从节点可用于读操作分担压力,并且在主节点故障时,从节点可晋升为主节点,保证系统可用性。例如在电商的秒杀场景中,主节点接收大量商品库存扣减等写请求,从节点为前端展示剩余库存等读请求服务。
- 读写分离:
- 对于只读请求,直接路由到从节点,减少主节点压力。可以通过客户端的读写分离库,如Jedis的读写分离配置,根据请求类型自动选择连接主节点或从节点。
- 缓存分层:
- 在应用层和Redis之间添加一层本地缓存(如Guava Cache)。对于一些读多写少且变化不频繁的数据,先从本地缓存读取,命中则避免访问Redis,减少Redis压力。例如新闻资讯类应用,文章详情等数据在一定时间内不变,可先从本地缓存读取。
配置参数调整
- AOF相关参数:
- appendfsync参数:
- 考虑设置为
everysec
,该模式下Redis每秒执行一次fsync操作将缓冲区数据写入磁盘。虽然相比always
模式(每次写操作都同步到磁盘),everysec
在极端情况下可能丢失1秒的数据,但性能有显著提升,且能在大多数情况下保证数据安全。例如在一般的社交平台用户消息写入场景中,丢失1秒内的消息数据对整体业务影响较小,但能大大提高写入性能。
- 考虑设置为
- no - appendfsync - on - rewrite:
- 设置为
yes
,在AOF重写期间,不进行fsync操作。因为AOF重写时会有大量的磁盘I/O操作,此时禁止常规的fsync操作,可避免磁盘I/O竞争,提高重写效率,同时保证数据写入缓冲区,重写完成后再进行同步,确保数据安全。
- 设置为
- appendfsync参数:
- 内存相关参数:
- maxmemory:
- 根据服务器内存合理设置Redis的最大内存。避免因内存使用过度导致Redis性能下降甚至OOM(Out Of Memory)。例如在一台有16GB内存的服务器上,考虑给Redis分配8GB内存,同时结合
maxmemory - policy
参数设置内存淘汰策略,如volatile - lru
(在设置了过期时间的键中使用LRU算法淘汰),保证在内存不足时合理淘汰数据。
- 根据服务器内存合理设置Redis的最大内存。避免因内存使用过度导致Redis性能下降甚至OOM(Out Of Memory)。例如在一台有16GB内存的服务器上,考虑给Redis分配8GB内存,同时结合
- maxmemory:
持久化策略优化
- AOF重写策略:
- 自动重写:
- 合理设置
auto - aof - rewrite - min - size
和auto - aof - rewrite - percentage
参数。例如设置auto - aof - rewrite - min - size
为64MB,auto - aof - rewrite - percentage
为100,当AOF文件大小超过64MB且当前AOF文件大小相比上次重写后的大小增长了100%时,自动触发AOF重写。重写可以将AOF文件中的冗余命令合并,减小文件体积,提高重启载入效率。
- 合理设置
- 手动重写:
- 在业务低峰期,通过
BGREWRITEAOF
命令手动触发AOF重写,减少对正常业务的影响。例如在凌晨3 - 5点,电商平台业务量较低时执行该命令,优化AOF文件。
- 在业务低峰期,通过
- 自动重写:
- 混合持久化:
- 开启混合持久化(
aof - use - rdb - preamble yes
),在AOF重写时,开头部分使用RDB格式记录数据,后面再记录增量的AOF日志。这样在重启时,先通过RDB快速载入大部分数据,再通过AOF日志恢复最新数据,既保证了数据恢复的高效性,又能确保数据的完整性和准确性。
- 开启混合持久化(