教程目录
Redis 常见数据结构及使用场景?
一、String 最基础,存字符串/整数/二进制。场景:缓存、计数器(incr)、分布式锁(setnx)、限流。 二、List 双向链表。场景:消息队列(lpush/brpop)、最新列表。 三、Hash 键值对集合。场景:对象存储(用户信息)、购物车。 四、Set 无序去重集合。场景:标签、共同好
Redis 的持久化方式有哪些?
一、RDB(快照) 原理:在某个时间点把内存数据序列化写入 dump.rdb。 触发:save(阻塞)、bgsave(fork 子进程)、自动配置(save 900 1)。 优点:文件紧凑、恢复快。 缺点:可能丢失最后一次快照后的数据。 二、AOF(追加日志) 原理:把写命令追加到 appendon
缓存穿透、击穿、雪崩及解决方案?
一、缓存穿透 查询不存在的数据,缓存和数据库都没有,请求全打到数据库。 解决方案: - 缓存空值(设置较短过期时间)。 - 布隆过滤器,不存在的 key 直接拦截。 二、缓存击穿 热点 key 过期瞬间,大量并发请求打到数据库。 解决方案: - 互斥锁(setnx),只有一个请求查库并回填缓存。 -
Redis 如何实现分布式锁?
一、基本实现 SET lock_key unique_value NX EX 30 NX:key 不存在才设置。 EX:过期时间,防止死锁。 unique_value:释放锁时校验,防止误删别人的锁。 二、释放锁(Lua 脚本保证原子) if redis.call("get", KEYS[1])
Redis 为什么单线程还这么快?
一、核心原因 纯内存操作:数据在内存中,访问速度极快。 I/O 多路复用:用 epoll 处理大量并发连接,单线程也能处理高并发。 避免上下文切换:单线程没有线程切换开销,也没有锁竞争。 二、Redis 6.0 多线程 Redis 6.0 引入多线程,但只用于网络 I/O 的读写,命令执行仍是单线程