之前总是说“因为基于内存,所以redis特别的快”,那么具体详细的原因解释,这次深究一下:
基于内存
Redis 是基于内存的数据库,直接由 CPU 控制,也就是 CPU 内部集成的内存控制器,享受 CPU 通信的最优带宽。Redis 将数据存储在内存中,
读写操作不会因为磁盘的 IO 速度限制,所以是飞起一般速度体验
数据结构
Redis 支持 5 种数据类型:
- String: 缓存、计数器、分布式锁等
- List: 链表、队列、微博关注人时间轴列表等等
- Hash: hash 表
- Set: 去重、赞、踩、共同好友等
- Zset:访问量排行榜、点击量排行榜等等
Redis 整体就是一个哈希表来保存所有的键值对,无论数据类型是 5 种中对的任意一种。哈希表,本质就是一个数组,
每个元素被叫做哈希桶,桶里面的 entry 保存着实际具体值的指针。哈希表的时间复杂度是O(1), 只需要计算每个键的哈希值,便知道对应的桶的位置,
定位桶里面的 entry 找到对应的数据,这也是 Redis 快的原因之一。
单线程模型
Rdis 的单线程,是指 Redis 的网络IO以及对指令读写是一个线程来执行的。对于 Redis 的持久化,集群数据同步,异步删除都是其他线程执行的。
- 单线程的好处:
- 不会因为线程的创建导致性能消耗
- 避免上下文切换引起的 CPU 消耗,没有多线程切换的开销
- 避免了线程之间的竞争问题,比如添加锁、释放锁,不需要考虑各种锁的问题
- 代码逻辑更清晰、简单
因为 Redis 是基于内存操作的,CPU不是 Redis 的瓶颈,而 Redis 的瓶颈最有可能是机器内存大小或者网络带宽。
IO 多路复用模型
Redis 使用非阻塞 IO:IO 多路复用(多路,指的是多个 Socket 链接,复用指的是复用一个线程),使用单线程来轮询描述符,将数据库的
开、关、读、写都转换成了事件,Redis 采用自己的的事件分离器,效率比较高。