如何基于Redis实现消息队列?
Stream 让 Redis 具备可 ACK 的消息语义,适合轻量异步任务,但不等同于 Kafka 级日志系统。 核心命令XADD 写入;XREAD/XREADGROUP 消费;XACK 确认;XPENDING 查未 ack;XCLAIM 转移超时消息。 123XADD orders * type created id 1001XGROUP CREATE orders cg1 $ MKSTREAMXREADGROUP GROUP cg1 c1 COUNT 10 STREAMS orders > 与 List 队列差异支持消费组、持久化消息 ID、pending 列表与范围查询,更适合多消费者竞争与重试。 实践建议设置 MAXLEN 近似裁剪防无限增长;业务幂等;监控 lag 与 pending 数。 与 Pub/Sub 区别Pub/Sub 无持久、无消费组;Stream 可持久、可回溯。广播用 Pub/Sub,任务队列用 Stream。 消费者崩溃恢复XPENDING + XCLAIM 重新分配 idle 消息;设置 min-i...
Redis为什么用跳表实现有序集合
Sorted Set 需要有序+范围查询+动态更新,跳表在实现复杂度与性能之间取得了平衡。 为什么不用红黑树跳表实现更简单,范围查询更直观(链表层级),并发扩展友好;与哈希表组合实现 O(logN) 插入与 O(1) 单 member 查找。 结构直觉多层索引链表,查找时从顶层开始「跳跃」,平均 O(logN)。Redis 实现带 span 便于 rank 查询。 与 ziplist/listpack小集合仍可用紧凑编码省内存;超过阈值转跳表+dict。 对比其他结构 结构 范围查询 实现难度 跳表 优秀 中 红黑树 中 高 数组 差 低 随机层概率Redis 跳表层高 p=0.25;期望层数 O(logN)。手写跳表是很好算法练习。 范围查询复杂度ZRANGEBYSCORE O(logN+M),M 为结果数;大数据量分页用 LIMIT 游标。 实践复习清单跳表期望复杂度;与红黑树对比;ZSet 底层双结构;score 相同 tie-break;ZRANGE 分页;手写跳表练习。 常见坑 面试只背「ZSet 用跳表」说不出与 dict...
Redis常见面试题总结(上)
Redis「单线程」是经典考点,但 4.0 后已有 IO 线程与 6.0 多线程 IO。准确表述比背口号更重要。 为何说单线程也快纯内存、高效数据结构、IO 多路复用(epoll/kqueue)、避免上下文切换与锁竞争。命令执行仍主线程串行,保证简单性。 6.0+ 多线程 IO网络读写可线程池并行,命令执行仍在主线程。适合大 value 高带宽场景,需 io-threads 调优。 常见面试点 持久化方式与选型 过期删除:惰性+定期 内存淘汰策略 LRU/LFU/TTL 主从复制:全量+增量 PSYNC 实践建议用 redis-benchmark 只作相对参考;真实压测带业务 payload 与 pipeline。 事件循环细节aeEventLoop 处理 readable/writable;beforeSleep 做 fast expire、异步关闭。了解即可,面试点到为止。 事务与 LuaMULTI/EXEC 非 rollback 语义;Lua 脚本原子执行,注意脚本时长。 实践复习清单单线程+IO 线程表述;过期策略;...
Redis持久化机制详解
持久化是在性能与数据安全之间做选择。缓存场景可以弱持久,Redis 作主存储则必须严肃配置。 RDB周期性 fork 子进程写快照;恢复快、文件紧凑;可能丢失最后一次快照后的数据。save 规则如 save 900 1。 AOF记录写命令,everysec/always/no 三档 fsync。rewrite 压缩体积;恢复慢于 RDB。 混合持久化(4.0+)AOF 重写时嵌入 RDB 前缀,兼顾恢复速度与增量完整度,生产推荐开启 aof-use-rdb-preamble yes。 123appendonly yesappendfsync everysecauto-aof-rewrite-percentage 100 实践建议主从+哨兵/集群保证高可用;备份 RDB 到对象存储;演练 restore。 磁盘与 AOFAOF 文件过大触发 rewrite;rewrite 期间积压 buffer。SSD 与 noatime 挂载推荐。 灾备 RPO/RTOeverysec 可能丢 1 秒;always 最安全但慢。 实践复习清单AOF ...
Redis内存碎片详解
used_memory 不高却触发 maxmemory,可能是碎片率在作怪。理解分配器行为才能对症调参。 碎片从哪来频繁更新不同大小 value、大量过期删除留下「瑞士奶酪」式空闲块;jemalloc 不一定会立刻归还 OS。 如何观察12INFO memory# mem_fragmentation_ratio = used_memory_rss / used_memory 比例持续 >1.5 且 RSS 明显高于 logical 需关注。 治理手段 4.0+ activedefrag yes 在线整理(CPU 开销)。 重启实例(维护窗口)。 避免大量小对象频繁变长;大 value 压缩或拆分。 实践建议设置合理 maxmemory-policy;监控 fragmentation;版本升级关注 listpack 等内存优化。 复制与内存主从全量同步时副本也会 fork;碎片高时同步更慢。尽量低峰 restart 或 active defrag。 大 key 迁移DUMP/RESTORE 或 双写切换,避免 BLOCK 线上。 实践复习清单mem_frag...
如何基于Redis实现延时任务?
延迟任务要同时满足「到时触发」与「至少一次执行」。Redis 提供多种轻量实现,但可靠性与精确度不同。 方案对比 方案 原理 优点 缺点 ZSet score=执行时间 简单 单点需抢任务 Keyspace 过期 过期事件通知 省结构 不保证触发、易丢 Redisson DelayQueue 内部队列 封装好 依赖组件 Stream 定时扫描+消费组 可 ACK 需调度器 12ZADD delay:tasks 1735689600000 "order:1001"# 轮询 ZRANGEBYSCORE 取到期任务,Lua 原子 ZREM 防重复 实践建议执行端幂等;任务状态机落 DB;多实例用 Lua/Redlock 抢任务;监控 pending 堆积。 与 MQ 分工短延迟、量不大用 Redis;长延迟、堆积、审计要求用 RocketMQ 定时/延迟消息。 时钟依赖多机 NTP 同步;延迟队列比较的是 Redis 所在机器时间。 实践复习清单ZSet 延迟队列 Lua 原子;幂等消费;pending ...
Redis 3 种特殊数据类型详解
三种特殊类型在签到、UV 统计与 LBS 场景非常省内存,但语义与误差要事先接受。 Bitmap位数组,SETBIT/GETBIT/BITCOUNT。适合日活签到、布尔特征压缩。注意偏移过大稀疏时仍占上限内存。 12SETBIT sign:202609:uid1001 2 1BITCOUNT sign:202609:uid1001 HyperLogLog基数估计,标准误差约 0.81%,PFADD/PFCOUNT 极省内存。不适合需要精确去重或单成员查询。 GEO基于 Sorted Set 的经纬度,GEORADIUS 查附近。地球半径计算有固定误差,高精度地图仍用专业引擎。 Stream(补充)消息流+XGROUP 消费组,可替代简单 List 队列,支持 ACK 与 pending 列表。 Bloom 模块RedisBloom 模块提供 scalable bloom;与纯 Bitmap 方案对比内存与误判率。 时序数据TS 模块或直接用 ZSet/TStream 自建;注意 retention。 实践复习清单Bitmap 签到键设...
Redis 5 种基本数据类型详解
选对数据结构等于选对时间复杂度。五种基础类型覆盖大部分业务缓存与计数场景。 String二进制安全字符串,可存 JSON、计数、分布式锁(SET NX EX)。INCR 原子计数;GETSET 可用于简单轮换。 List双端链表,LPUSH/RPOP 做队列;注意中间查找 O(n),长列表慎用。 Hash字段级更新,适合对象缓存(用户 profile)。小 hash 用 ziplist/listpack 省内存。 Set去重集合,SADD/SISMEMBER O(1);交集可用于共同好友。 Sorted Set带 score 有序集合,排行榜、延迟队列(score=时间戳)。底层跳表+哈希表。 12ZADD rank 980 user:1001ZRANGE rank 0 9 WITHSCORES REV 编码转换阈值ziplist/listpack 与 hashtable 转换阈值由配置项控制;升级版本阈值变化可能导致内存突增。 管道 pipeline批量命令减少 RTT;注意非事务场景下部分失败的处理。 实践复习清单五类型...
Redis常见阻塞原因总结
Redis 单线程执行命令,一条慢操作会拖住全局。阻塞排查要同时看命令、持久化、复制与 big key。 常见阻塞源 慢命令:KEYS、FLUSHALL、大集合 SUNION、无 LIMIT 的 LRANGE。 持久化:RDB fork 导致 COW 内存压力;AOF rewrite 子进程 IO。 主从全量同步:生成 RDB 期间 buffer 堆积。 big key 删除/过期:4.0+ 可用 UNLINK 异步释放。 集群/网络:阻塞在 IO 多路复用之外的系统调用较少,但磁盘 AOF 同步写会放大延迟。 排查工具1234redis-cli SLOWLOG GET 10redis-cli --latencyredis-cli --bigkeysINFO persistence 实践建议生产禁用 KEYS;用 SCAN 迭代;AOF 用 everysec;监控 latest_fork_usec。 内核透明大页 THPRedis 官方建议 disable THP,否则 latency 尖刺。sysctl vm.overcommit_memory...
缓存基础常见面试题总结
引入缓存的第一课不是性能提升多少,而是故障模式下系统还能不能扛住。 三大经典问题 穿透:查不存在的数据,缓存与 DB 都被打穿 → 布隆过滤器/空值缓存/参数校验。 击穿:热点 key 过期瞬间并发打 DB → 互斥重建/逻辑过期/永不过期+异步刷新。 雪崩:大量 key 同时过期或 Redis 宕机 → 过期时间加随机、集群高可用、限流降级。 一致性问题双写顺序、删缓存时机、延迟双删、订阅 binlog 异步删缓存。以 DB 为准,接受短暂 stale。 123456# 伪代码:互斥重建if cache_miss: if lock.acquire(key): load_from_db() set_cache() lock.release() 实践建议监控 cache hit ratio、慢查询与 Redis CPU;核心链路压测验证击穿策略。 热点 key 探测Redis 4.0+ hotkeys 或客户端采样;大促前预热。限流降级模板:sentinel/hystrix 风...