Redis作为一个缓存解决方案,基于内存操作。主要基于以下几方面原因:
1、基于内存操作
- 全内存存储:
- 所有读写操作都在内存中完成,避免了磁盘 I/O 带来的延迟,
- 速度极快,能够达到每秒百万级别的请求处理能力。
- 低延迟:
- 由于内存访问的速度远远高于磁盘,
- 毫秒级别甚至微秒级别内就能完成一次操作。
2、单线程模型
- 事件驱动:
- 使用单线程的事件驱动模型处理请求,
- 避免了多线程的上下文切换和锁竞争问题。
- 高效的 I/O 多路复用:
- 通过使用 epoll、kqueue 等系统调用,
- 高效地处理大量并发连接。
3、数据结构优化
- 丰富的数据类型:
- 提供多种高效的数据类型,如 String、Hash、List、Set、Zset 等,
- 每种数据类型都经过精心设计以支持高效的操作。
- 紧凑的编码:
- 使用不同的编码方式,如 ziplist、intset,
- 优化内存使用和操作速度。
4、高效的持久化机制
- 两种持久化机制:
- RDB 快照,定期生成快照将数据保存到磁盘,适合应对大规模崩溃恢复的场景。
- AOF 日志,记录每一次写操作,以日志的方式追加保存到文件,能提供更高的数据安全性。
- 异步持久化: 不会阻塞主线程的请求处理。
5、智能内存管理
- 高效内存管理策略:
- 使用 SDS(简单动态字符串) 代替 C 语言标准字符串,
- 利用字典树和跳表进行内存优化,
- 防止内存碎片化,同时能够快速分配和回收内存资源。
- 自动压缩小规模数据存储: 使用紧凑数据结构(如压缩列表)减少内存占用。
6、集群与分片
- Redis Cluster 支持数据分片和自动故障转移,
- 允许在多个节点之间分布数据,实现水平扩展。
7、内置的发布/订阅和 Lua 脚本
- 发布/订阅(Pub/Sub)模式: 允许高效处理消息系统或实时通知等需求。
- Lua 脚本引擎:
- 能够执行原子性、多步的复杂操作,
- 避免多个命令间的网络延迟,提高整体性能。
8、灵活的数据淘汰策略
- 提供多种数据淘汰策略:
- LRU(Least Recently Used,最近最少使用),
- LFU(Least Frequently Used,最不常使用)。
- 可以根据内存使用情况自动删除部分冷数据,确保系统保持高性能
9、我的公众号
敬请关注我的公众号:大象只为你,持续更新技术知识…