[TOC]
## Redis 為什么這么快?
1、完全基于內存,絕大部分請求是純粹的內存操作,非常快速。數據存在內存中,類似于 HashMap,HashMap 的優勢就是查找和操作的時間復雜度都是O(1);
2、數據結構簡單,對數據操作也簡單,Redis 中的數據結構是專門進行設計的;
3、采用單線程,避免了不必要的上下文切換和競爭條件,也不存在多進程或者多線程導致的切換而消耗 CPU,不用去考慮各種鎖的問題,不存在加鎖釋放鎖操作,沒有因為可能出現死鎖而導致的性能消耗;
4、使用多路 I/O 復用模型,非阻塞 IO。

## 單線程有什么好處?
1. 不會因為線程創建導致的性能消耗;
2. 避免上下文切換引起的 CPU 消耗,沒有多線程切換的開銷;
3. 避免了線程之間的競爭問題,比如添加鎖、釋放鎖、死鎖等,不需要考慮各種鎖問題。
4. 代碼更清晰,處理邏輯簡單。
## redis hash 字典
Redis 整體就是一個 哈希表來保存所有的鍵值對,無論數據類型是 5 種的任意一種。哈希表,本質就是一個數組,每個元素被叫做哈希桶,不管什么數據類型,每個桶里面的 entry 保存著實際具體值的指針。

Redis 全局哈希表 **rehash**
整個數據庫就是一個全局哈希表,而哈希表的時間復雜度是 O(1),只需要計算每個鍵的哈希值,便知道對應的哈希桶位置,定位桶里面的 entry 找到對應數據,這個也是 Redis 快的原因之一。
那 Hash 沖突怎么辦?
當寫入 Redis 的數據越來越多的時候,哈希沖突不可避免,會出現不同的 key 計算出一樣的哈希值。
Redis 通過鏈式哈希解決沖突:也就是同一個 桶里面的元素使用鏈表保存。但是當鏈表過長就會導致查找性能變差可能,所以 Redis 為了追求快,使用了兩個全局哈希表。用于 rehash 操作,增加現有的哈希桶數量,減少哈希沖突。
開始默認使用 hash 表 1 保存鍵值對數據,哈希表 2 此刻沒有分配空間。當數據越來多觸發 rehash 操作,則執行以下操作:
1. 給 hash 表 2 分配更大的空間;
2. 將 hash 表 1 的數據重新映射拷貝到 hash 表 2 中;
3. 釋放 hash 表 1 的空間。
值得注意的是,將 hash 表 1 的數據重新映射到 hash 表 2 的過程中并不是一次性的,這樣會造成 Redis 阻塞,無法提供服務。
而是采用了漸進式 rehash,每次處理客戶端請求的時候,先從 hash 表 1 中第一個索引開始,將這個位置的 所有數據拷貝到 hash 表 2 中,就這樣將 rehash 分散到多次請求過程中,避免耗時阻塞。
## 知識補充
https://mp.weixin.qq.com/s/z4VjDaDDbspFz1rIBwazIA
- 消息隊列
- 為什么要用消息隊列
- 各種消息隊列產品的對比
- 消息隊列的優缺點
- 如何保證消息隊列的高可用
- 如何保證消息不丟失
- 如何保證消息不會重復消費?如何保證消息的冪等性?
- 如何保證消息消費的順序性?
- 基于MQ的分布式事務實現
- Beanstalk
- PHP
- 函數
- 基礎
- 基礎函數題
- OOP思想及原則
- MVC生命周期
- PHP7.X新特性
- PHP8新特性
- PHP垃圾回收機制
- php-fpm相關
- 高級
- 設計模式
- 排序算法
- 正則
- OOP代碼基礎
- PHP運行原理
- zavl
- 網絡協議new
- 一面
- TCP和UDP
- 常見狀態碼和代表的意義以及解決方式
- 網絡分層和各層有啥協議
- TCP
- http
- 二面
- TCP2
- DNS
- Mysql
- 鎖
- 索引
- 事務
- 高可用?高并發?集群?
- 其他
- 主從復制
- 主從復制數據延遲
- SQL的語?分類
- mysqlQuestions
- Redis
- redis-question
- redis為什么那么快
- redis的優缺點
- redis的數據類型和使用場景
- redis的數據持久化
- 過期策略和淘汰機制
- 緩存穿透、緩存擊穿、緩存雪崩
- redis的事務
- redis的主從復制
- redis集群架構的理解
- redis的事件模型
- redis的數據類型、編碼、數據結構
- Redis連接時的connect與pconnect的區別是什么?
- redis的分布式鎖
- 緩存一致性問題
- redis變慢的原因
- 集群情況下,節點較少時數據分布不均勻怎么辦?
- redis 和 memcached 的區別?
- 基本算法
- MysqlNew
- 索引new
- 事務new
- 鎖new
- 日志new
- 主從復制new
- 樹結構
- mysql其他問題
- 刪除
- 主從配置
- 五種IO模型
- Kafka
- Nginx
- trait
- genergtor 生成器
- 如何實現手機掃碼登錄功能
- laravel框架的生命周期