Redis资料
Redis是什么?
Redis(Remote Dictionary Server)是一个开源的、基于内存的键值数据库,支持多种数据结构,可用作数据库、缓存和消息中间件。主要特点包括:
- 基于内存操作,读写性能极高
- 支持持久化,可将内存数据保存到磁盘
- 支持主从复制和高可用集群
- 提供丰富的数据结构和操作命令
Redis为什么这么快?
- 内存操作:数据存储在内存中,访问速度比磁盘快几个数量级
- 单线程模型:避免多线程上下文切换和锁竞争
- IO多路复用:使用epoll/kqueue等机制实现高效网络通信
- 高效数据结构:专门优化的数据结构实现(如SDS、跳跃表等)
- 单线程模型也造成cpu不能充分利用
Redis数据结构
1. 五种基本数据类型及使用场景
数据类型 | 特点 | 使用场景 |
---|---|---|
String | 二进制安全,最大512MB | 缓存、计数器、分布式锁 |
List | 双向链表,元素可重复 | 消息队列、最新消息排行 |
Hash | 键值对集合 | 存储对象、购物车 |
Set | 无序唯一集合 | 标签、共同好友 |
ZSet | 有序集合(带分数) | 排行榜、延时队列 |
2. 特殊数据类型
- BitMap:二值统计(签到、在线状态)
- HyperLogLog:基数统计(UV统计)
- GEO:地理位置(附近的人)
- Stream:消息流(替代Kafka)
3. 底层数据结构实现
String:SDS(简单动态字符串),支持动态扩容和二进制安全
List:3.2版本前使用ziplist或linkedlist,3.2后统一使用quicklist
Hash:ziplist(元素少时)或hashtable
Set:intset(整数集合)或hashtable
ZSet:ziplist或skiplist+dict组合
三、Redis持久化机制
1. RDB与AOF对比
维度 | RDB | AOF |
---|---|---|
原理 | 定时快照 | 记录写操作日志 |
性能 | 高(二进制压缩) | 较低(文本追加) |
恢复速度 | 快 | 慢(需重放命令) |
数据完整性 | 可能丢失最后一次快照后的数据 | 更可靠 |
文件大小 | 小 | 大 |
四、Redis高可用架构
1. 主从复制
- 作用:数据冗余、读写分离、故障恢复
- 同步过程:
- 全量同步:从节点初次连接时,主节点生成RDB发送给从节点
- 增量同步:主节点将写命令发送给从节点
2. 哨兵模式(Sentinel)
是一种用于构建高可用性 Redis 集群的解决方案。它通过监控 Redis 实例的状态并自动进行故障转移,提供了客户端重定向机制以确保应用程序可以正常访问 Redis
- 功能:监控、自动故障转移、配置中心
3. Redis Cluster
- 数据分片:16384个slot,每个节点负责部分slot
- 优点:支持海量数据存储和高并发写
- 限制:不支持跨slot事务,多key操作需使用hash tag
五、Redis缓存问题与解决方案
1. 缓存穿透
现象:查询不存在的数据,绕过缓存直接访问数据库
解决方案:
布隆过滤器拦截
缓存空对象(设置短过期时间)
对业务参数进行校验,不合法的值直接返回
2. 缓存击穿
现象:热点key过期瞬间,大量请求直接访问数据库
解决方案:
互斥锁(如Redis分布式锁)
热点数据永不过期
3. 缓存雪崩
现象:大量key同时过期,导致请求直接访问数据库
解决方案:
设置随机过期时间,均匀分布key的失效时间
多级缓存
熔断降级机制
六、Redis内存管理
1. 过期键删除策略
- 惰性删除:访问时检查是否过期,过期则删除
- 定期删除:定时随机检查并删除过期键
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_47242663/article/details/149520081