[TOC]
# 介紹
Redis使用了單線程架構和I/O多路復用模型來實現高性能的內存數據庫服務。
- 為什么要用單線程?
```
Redis是基于內存的存儲。本身性能足夠高了,沒必要多線程。 --官方解釋
```

- 非阻塞I/O多路復用
```
多路復用: 一個線程處理所有請求。
比喻就是: 一個程序員處理所有問題,前端來活干前端,后臺來活干后端。
非阻塞: 不必等完全處理完前端任務再去處理后臺。
```

# 基礎數據類型
### string
- 字符串類型的內部編碼
```
int:8個字節的長整型
embstr:小于等于39個字節的字符串
raw:大于39個字節的字符串
Redis會根據當前值的類型和長度決定使用哪種內部編碼實現。
```

**常用API算法時間復雜度****

### hash
- 是一個string類型的用來存儲key,field,value的鍵值對的映射表,添加和刪除時間復雜度都為O(1)
```
·ziplist(壓縮列表):當哈希類型元素個數小于hash-max-ziplist-entries配置(默認512個)、同時所有值都小于hash-max-ziplist-value配置(默認64字節)時,Redis會使用ziplist作為哈希的內部實現
·hashtable(哈希表):當哈希類型無法滿足ziplist的條件時,Redis會使用hashtable作為哈希的內部實現,因為此時ziplist的讀寫效率會下降,而hashtable的讀寫時間復雜度為O(1)
```

**常用API算法時間復雜度**

### list
- 列表類型,存儲類似一維數組數據
```
2種編碼實現
1. ziplist(壓縮列表) 元素個數小于配置(默認512),每個元素大小小于64字節(默認)
2. linkedlist(鏈表) 當列表類型無法滿足ziplist的條件時,Redis會使用linkedlist作為列表的內部實現
3. Redis3.2版本提供了quicklist內部編碼,簡單地說它是以一個ziplist為節點的linkedlist,它結合了ziplist和linkedlist兩者的優勢,為列表類型提供了一種更為優秀的內部編碼實現
```

**常用API算法時間復雜度**

### set
- 集合類型
```
intset(整數集合):當集合中的元素都是整數且元素個數小于set-maxintset-entries配置(默認512個)時,Redis會選用intset來作為集合的內部實現,從而減少內存的使用。
hashtable(哈希表):當集合類型無法滿足intset的條件時,Redis會使用hashtable作為集合的內部實現。
```
3.2.6 目前是用hashtable

**常用API算法時間復雜度**

### zset
- 有序集合
```
ziplist(壓縮列表):當有序集合的元素個數小于zset-max-ziplistentries配置(默認128個),同時每個元素的值都小于zset-max-ziplist-value配置(默認64字節)時,Redis會用ziplist來作為有序集合的內部實現。
skiplist(跳躍表):當ziplist條件不滿足時,有序集合會使用skiplist作為內部實現,因為此時ziplist的讀寫效率會下降。
```


**常用API算法時間復雜度**
