# 字符串
[TOC=2,3]
`REDIS_STRING` (字符串)是 Redis 使用得最為廣泛的數據類型,它除了是 `SET` 、 `GET` 等命令的操作對象之外,數據庫中的所有鍵,以及執行命令時提供給 Redis 的參數,都是用這種類型保存的。
### 字符串編碼
字符串類型分別使用 `REDIS_ENCODING_INT` 和 `REDIS_ENCODING_RAW` 兩種編碼:
- `REDIS_ENCODING_INT` 使用 `long` 類型來保存 `long` 類型值。
- `REDIS_ENCODING_RAW` 則使用 `sdshdr` 結構來保存 `sds` (也即是 `char*` )、 `long long` 、 `double` 和 `long double` 類型值。
換句話來說,在 Redis 中,只有能表示為 `long` 類型的值,才會以整數的形式保存,其他類型的整數、小數和字符串,都是用 `sdshdr` 結構來保存。
![digraph redis_string { node[shape=plaintext, style = filled]; edge [style = bold]; // type REDIS_STRING [label="字符串\nREDIS_STRING", fillcolor = "#95BBE3"]; // encoding REDIS_ENCODING_RAW [label="字符串\nREDIS_ENCODING_RAW", fillcolor = "#FADCAD"]; REDIS_ENCODING_INT [label="整數\nREDIS_ENCODING_INT", fillcolor = "#FADCAD"]; // edge REDIS_STRING -> REDIS_ENCODING_RAW; REDIS_STRING -> REDIS_ENCODING_INT; REDIS_ENCODING_RAW -> sdshdr; REDIS_ENCODING_INT -> long; // datastruct 1 sdshdr [label="sdshdr"]; sds [label="sds/char*"]; long_long [label="long long"]; double [label="double"]; long_double [label="long double"]; sdshdr -> sds; sdshdr -> long_long; sdshdr -> double; sdshdr -> long_double; // datastruct 2 long [label="long"]; long_type [label="long"]; long -> long_type;}](https://box.kancloud.cn/2015-09-13_55f4effc6a210.svg)
### 編碼的選擇
新創建的字符串默認使用 `REDIS_ENCODING_RAW` 編碼,在將字符串作為鍵或者值保存進數據庫時,程序會嘗試將字符串轉為 `REDIS_ENCODING_INT` 編碼。
### 字符串命令的實現
Redis 的字符串類型命令,基本上是通過包裝 `sds` 數據結構的操作函數來實現的,沒有什么需要說明的地方。