温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

redis面试中常被问到的重点有哪些

发布时间:2022-02-14 13:36:01 来源:亿速云 阅读:154 作者:iii 栏目:关系型数据库
# Redis面试中常被问到的重点有哪些 Redis作为高性能的键值存储系统,在面试中经常被深入考察。以下是Redis面试中的核心知识点整理,涵盖基础概念、数据结构、持久化机制、高可用方案等关键内容。 --- ## 一、Redis基础概念 ### 1. Redis是什么? - **内存数据库**:数据主要存储在内存中,读写性能极高(10万+ QPS) - **键值存储**:支持多种数据结构(String/Hash/List/Set/ZSet等) - **单线程模型**:基于Reactor模式的事件驱动架构(6.0后支持多线程IO) ### 2. Redis vs Memcached | 特性 | Redis | Memcached | |---------------|--------------------------------|------------------------| | 数据类型 | 5种核心+扩展类型 | 仅字符串 | | 持久化 | 支持RDB/AOF | 不支持 | | 集群模式 | Redis Cluster/Codis | 需客户端分片 | | 线程模型 | 单线程(IO多线程可选) | 多线程 | --- ## 二、核心数据结构与使用场景 ### 1. String(字符串) - **底层实现**:SDS(Simple Dynamic String) - **典型场景**: - 缓存(用户会话、页面缓存) - 计数器(`INCR article:readcount:1001`) - 分布式锁(`SETNX lock:order 1 EX 30`) ### 2. Hash(哈希表) - **底层结构**:ziplist(元素少时)/ hashtable - **使用示例**: ```bash HSET user:1001 name "张三" age 28 HGETALL user:1001 

3. List(列表)

  • 实现方式:quicklist(ziplist链表)
  • 应用场景
    • 消息队列(LPUSH+BRPOP)
    • 最新消息排行(LTRIM保持固定长度)

4. Set(集合)

  • 特点:无序、元素唯一
  • 实际应用
    • 共同好友(SINTER user:1001:friends user:1002:friends
    • 抽奖活动(SRANDMEMBER lottery:users 3

5. Sorted Set(有序集合)

  • 底层结构:ziplist + skiplist
  • 经典案例
    • 排行榜(ZADD leaderboard 95 "player1"
    • 延迟队列(score设为执行时间戳)

三、持久化机制

1. RDB(快照)

  • 触发方式
    • 手动执行SAVE/BGSAVE
    • 配置自动保存(save 900 1
  • 优缺点
    • ✅ 恢复速度快
    • ❌ 可能丢失最后一次快照后的数据

2. AOF(追加日志)

  • 写回策略
    • appendfsync always(每次写操作)
    • appendfsync everysec(默认,每秒)
    • appendfsync no(由系统决定)
  • 重写机制
    • BGREWRITEAOF压缩日志文件

3. 混合持久化(Redis 4.0+)

  • 结合RDB和AOF优势:
    • 定期全量备份(RDB)
    • 增量写入AOF日志

四、高可用架构

1. 主从复制

  • 复制流程
    1. 从节点执行SLAVEOF 127.0.0.1 6379
    2. 主节点生成RDB文件发送给从节点
    3. 后续通过传播写命令保持同步

2. Sentinel(哨兵)

  • 核心功能
    • 监控节点状态
    • 自动故障转移(选举新主节点)
    • 配置中心(通知客户端新主节点地址)
  • 部署建议:至少3个Sentinel实例

3. Redis Cluster

  • 数据分片
    • 16384个哈希槽(0-16383)
    • CLUSTER ADDSLOTS分配槽位
  • 节点通信
    • Gossip协议交换信息
    • 每秒1次PING/PONG

五、性能优化

1. 内存管理

  • 内存淘汰策略
    • volatile-lru:从已设置过期时间的键中淘汰最近最少使用的
    • allkeys-lru:从所有键中淘汰LRU
  • 优化建议
    • 使用SCAN替代KEYS
    • 控制Hash/List的元素数量

2. 管道(Pipeline)

# Python示例 pipe = r.pipeline() for i in range(1000): pipe.set(f"key:{i}", i) pipe.execute() 

3. 慢查询分析

  • 配置阈值(毫秒):
     slowlog-log-slower-than 10 slowlog-max-len 128 
  • 查看慢日志:
     SLOWLOG GET 5 

六、事务与Lua脚本

1. 事务特性

  • ACID表现
    • 原子性:单条命令原子执行,事务整体不保证
    • 隔离性:串行执行
  • 命令序列
     MULTI SET book:1 "Redis实战" INCR sales:count EXEC 

2. Lua脚本

  • 优势
    • 减少网络开销(多个操作合并)
    • 原子性执行
  • 示例
     -- 限流脚本 local key = KEYS[1] local limit = tonumber(ARGV[1]) local current = tonumber(redis.call('GET', key) or 0 if current + 1 > limit then return 0 else redis.call('INCR', key) return 1 end 

七、缓存问题解决方案

1. 缓存穿透

  • 现象:大量查询不存在的数据
  • 解决方案
    • 布隆过滤器(BF.ADD
    • 缓存空值(SET null 60

2. 缓存雪崩

  • 预防措施
    • 随机过期时间(EXPIRE key 3600 + rand(600)
    • 多级缓存(本地缓存+Redis)

3. 缓存击穿

  • 热点Key处理
    • 互斥锁(SETNX lock:key 1
    • 永不过期策略(逻辑过期时间)

八、生产环境实践

1. 监控指标

  • 关键指标
    • 内存使用率(used_memory
    • 命中率(keyspace_hits/(keyspace_hits+keyspace_misses)
    • 连接数(connected_clients

2. 安全配置

  • 必要措施
    • 启用密码(requirepass
    • 禁用危险命令:
    rename-command FLUSHALL "" rename-command CONFIG "" 

3. 版本选择

  • 建议
    • 生产环境使用稳定版(偶数版本如7.2.x)
    • 新特性关注:
      • Redis 6.0:多线程IO
      • Redis 7.0:Function API

九、高频面试题示例

  1. Redis为什么快?

    • 内存操作
    • IO多路复用
    • 单线程避免锁竞争
  2. 如何实现分布式锁?

    • SETNX + EXPIRE(Redlock算法)
    • 对比Zookeeper/Etcd方案
  3. BigKey如何处理?

    • 拆分(HSCAN分批删除)
    • 使用Lazy Free(UNLINK
  4. 集群数据如何迁移?

    • MIGRATE命令
    • 第三方工具(redis-shake)

掌握以上知识点后,建议通过以下方式深化理解: 1. 动手搭建Redis集群环境 2. 使用redis-benchmark进行压测 3. 阅读Redis核心源码(如dict.c/ae.c) “`

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI