2022-12-02 15:38:24
掌握以下15大Redis核心知识点,可系统应对Java面试中的Redis相关问题:
1. Redis基础概念数据存储在内存中,读写性能极高(每秒10万+操作)。
支持丰富的数据类型(如字符串、哈希、列表等),适应多种场景。
提供持久化、主从复制、哨兵模式和集群方案,保障高可用性。
场景:缓存、计数器、分布式锁。
命令:SET、GET、INCR、DECR。
场景:存储对象(如用户信息)。
命令:HSET、HGET、HGETALL。
场景:消息队列、最新消息排行。
命令:LPUSH、RPOP、LRANGE。
场景:标签系统、去重。
命令:SADD、SMEMBERS、SINTER(交集)。
场景:排行榜、带权重的队列。
命令:ZADD、ZRANGE、ZSCORE。
HyperLogLog:基数统计(如UV计算),占用内存极小(12KB)。
Geospatial:地理位置存储与计算(如附近的人)。
Bitmap:位图操作(如用户签到状态)。
通过MULTI、EXEC、WATCH等命令实现原子性操作,但不支持回滚。
场景:批量操作需保证一致性时(如转账)。
模式:发布者(PUBLISH)发送消息,订阅者(SUBSCRIBE)接收。
场景:实时消息推送(如聊天室)。
惰性删除:访问时检查键是否过期并删除。
定期删除:随机抽查部分过期键删除。
volatile-lru:淘汰最近最少使用的过期键。
allkeys-lru:淘汰所有键中最近最少使用的。
noeviction:不淘汰,返回错误(默认策略)。
原理:定时生成内存数据的二进制快照(如save 60 10000表示60秒内1万次修改触发保存)。
优点:恢复速度快,适合备份。
缺点:可能丢失最后一次快照后的数据。
原理:记录所有写操作命令,重启时重放。
优点:数据安全性高。
缺点:文件体积大,恢复速度慢。
追求性能选RDB,追求数据安全选AOF,或两者结合。
自动故障转移、节点扩容/缩容。
客户端需支持集群协议(如JedisCluster)。
全量同步:主节点生成RDB文件并发送给从节点。
增量同步:主节点记录写命令到缓冲区,从节点同步。
从节点发送PSYNC命令。
主节点判断同步类型(全量/增量)。
执行同步并保持心跳检测(REPLCONF ACK)。
监控:定期检查节点状态。
通知:故障时发送警报。
自动故障转移:选举新主节点并更新配置。
现象:查询不存在的数据导致直接访问数据库。
解决方案:布隆过滤器、缓存空值。
现象:大量缓存同时失效导致数据库压力激增。
解决方案:设置随机过期时间、多级缓存。
现象:热点键过期时大量请求涌入数据库。
解决方案:互斥锁、逻辑过期(不自动删除缓存)。
读:先查缓存,未命中则查数据库并写入缓存。
写:更新数据库后删除缓存(或更新缓存)。
应用只与缓存交互,由缓存负责同步数据库。
写操作先更新缓存,异步批量写入数据库(提高性能但可能丢失数据)。
命令:SETNX lock_key unique_value NX PX 30000(设置过期时间防止死锁)。
释放锁:检查值匹配后删除(Lua脚本保证原子性)。
在多个独立Redis节点上尝试获取锁,超过半数成功才算获取成功。
内存使用率、命中率、连接数、QPS。
INFO命令、Redis-Exporter + Prometheus + Grafana。
内存存储、单线程避免线程切换、IO多路复用(epoll)。
Redis支持更多数据类型、持久化、主从复制;Memcached仅支持字符串且无持久化。
主从复制 + 哨兵模式或集群方案。
掌握以上知识点后,可结合实际项目经验深入理解,面试时通过具体场景阐述技术选型和优化思路,更能体现实战能力。