1.String類型基本介紹
redis 所有的 key 都是字符串,
value 的類型是存在差異的~~
一般來說,redis 遇到亂碼問題的概率更小~~
Redis 中的字符串,直接就是按照二進制數據的方式存儲的.
(不會做任何的編碼轉換【講 mysql 的時候,知道 mysql 默認的字符集, 是拉丁文,插入中文,就會失敗~~】,存的是啥,取出來就還是啥)
【不僅僅可以存儲文本數據~~整數~~普通的文本字符串~~JSON~~xml~~二進制數據(圖片,視頻,音頻....)(音頻視頻 體積可能會比較大~~Redis 對于 string 類型,限制了大小最大是 512M
Redis 單線程模型,希望進行的操作都能比較快速)】
2.set&get
2.1 set
- redis 文檔給出的語法格式說明:
- []相當于一個獨立的單元.
- 表示可選項 (可有可無的)
- 其中|表示"或者"的意思,多個只能出現一個,
- []和[]之間,是可以同時存在的.
- 如果 key 不存在,創建新的鍵值對,
- 如果 key 存在, 則是讓新的 value 覆蓋舊的 value.
- 可能會改變原來的數據類型,原來這個 key 的 ttl(生存時間) 也會失效
- flash all清除所有的數據庫-對應MySQL的drop database
2.2 get
get key
對于 GET 來說, 只是支持,字符串類型的 value.
如果 value 是其他類型, 使用 GET 獲取就會出錯!!
3.mset&mget
一次操作多組鍵值對。
可以提高效率 但也不要一次添加太多 會導致阻塞
4.SETNX&SETEX&PSETEX
- SETNX不存在才能設置.存在則設置失敗~
- 返回值:1 表?設置成功。0 表?沒有設置。
- SETEX設置 key 的過期時間,單位是秒
- PSETEX設置 key 的過期時間,單位是毫秒
?
5.incr&incrby&decr&decrby
incr
針對 value + 1
INCR將 key 對應的 string 表?的數字加?。如果 key 不存在,則視為 key 對應的 value 是 0。如果 key 對應的 string 不是?個整型或者范圍超過了 64 位有符號整型,則報錯。
- 命令有效版本:1.0.0 之后
- 時間復雜度:O(1)
- 返回值:integer 類型的加完后的數值。
incrby
針對 value + n
decr
針對 value -1
key 對應的 value 必須是整數,在 64位的范圍內,如果這個 key 對應的value不存在則當做 0 來處理
decr 的運算結果,也是計算之后的值
decrby
針對 value -n????
incrbyfloat
- 把 key 對應的 value 進行 +-運算,運算的操作數可以是浮點數。
- 只能用加上負數的形式來實現減法~~
- 雖然此處沒有提供減法版本的命令,但是使用 redis 進行的計數操作,一般都是針對整數來進行的
- 上述操作的時間復雜度,都是 O(1)
- 由于 redis 處理命令的時候,是單線程模型,多個客戶端同時針對同一個 key 進行 incr 操作,不會引起"線程安全”問題?
6.APPEND
- 字符串,也支持一些常用的操作.
- 拼接, 獲取/修改 字符串的部分內容,獲取字符串長度
append
?
- append 返回值, 長度的單位是 字節!!
- redis 的字符串,不會對字符編碼做任何處理,(redis 不認識字符,只認識字節)
- 當前咱們的 xshell 終端,默認的字符編碼是 utf8
- 在終端中輸入漢字之后,也就是按照 utf8 編碼的~~
- 1個漢字在 utf8 字符集中, 通常是 3 個字節的~
- 在啟動 redis 客戶端的時候,加上一個 --raw 這樣的選項就可以使 redis 客戶端能夠自動的把二進制數據嘗試翻譯
- 操作 linux 的時候, 千萬注意,不要亂按 ctrl +s
ctrl +s在 xshell 中的作用是"凍結當前畫面"
ctrl + q 解除凍結~~
7.GETRANGE
- 由 start 和 end 確定(左閉右閉)
- redis 中指定的區間, 是閉區間!!!
- C++ 和 Java 中,談到一個區間,大多都是 前閉后開(左閉右開)編程這個大圈子中,區間大多是前閉后開~~ 但是確實有特殊情況~~
- 正常下標都是 從 0 開始的整數,
- redis 的下標是可以支持負數的~~
- -1 倒數第一個元素.(Python 也是允許下標為 負數 的,此處的 規則 和 python 的設定是一致的)
- 下標為 len-1 的元素
- 如果字符串中保存的是漢字,此時進行子串切分,很可能切出來的就不是完整的漢字了~~
- 上述的代碼,是強行切出了中間的四個字節.
- 隨便這么一切,切出的結果在 utf8 碼表上不知道能査出啥了~~
- 上述問題,在 C++ 中同樣存在
Java 中就沒事~
Java 中字符串的基本單位,是字符(ava 的字符, 占2 個字節的字符),幫我們把漢字的編碼轉換C++中字符串的基本單位是字節~~- Java 中相當于 String 幫我們把漢字的編碼轉換C++中字符串的基本單位是字節~~都處理好了~~
- C++這里頭對于漢字的處理,是沒那么完善的就需要程序猿手動處理了~~
8.SETRANGE ?
SETRANGE key offset value
- 時間復雜度:O(N), N 為 value 的?度. 由于?般給的 value ?較短, 通常視為 O(1).
- 返回值:替換后的 string 的?度。
- 如果當前咱們 value 是一個中文字符串.進行 setrange 的時候, 是可能會搞出問題的!
- \x轉義字符,16進制
- 憑空生成了一個字節,這個字節里的內容就是 0x00
- aaa 就被追加到 0x00 的后面了
setrange 針對 不存在的 key 也是可以操作的.不過會把 offset 之前的內容填充成0x00
9.STRLEN
- 獲取 key 對應的 string 的?度。單位是字節。
- 當 key 存放的類似不是 string 時,報錯。
- C++中,字符串的長度本身就是用字節為單位,
Java 中,字符串的長度則是以字符為單位的.- Java 中的一個 char ==2 字節~~
Java 中的 char 基于 unicode 這樣的編碼方式
就能夠表示中文等符號~~- MySQL 的時候.
varchar(N)
此處 N 的單位就是字符. mysq! 中的字符,也是完整的漢字
這樣的一個字符,也可能是多個字節~~?- 一個漢字通常是 3 個字節呀~~(編碼方式是 utf8)Java 里頭咋一個 2 字節的 char 就能表示漢字呢??【1個漢字幾個字節是針對編碼方式而言的】
- Java 中的 char 是用的 unicode.一個漢字使用兩個字節的Java 中的 String, 則是用的 utf8.一個漢字就是3 個字節了Java 的標準庫內部, 在進行上述的操作過程中,程序猿一般是感知不到編碼方式的變換的~~
?10.小節
命令 | 執?效果 | 時間復雜度 |
set key value [key value...] | 設置 key 的值是 value | O(k), k 是鍵個數 |
get key | 獲取 key 的值 | O(1) |
del key [key ...] | 刪除指定的 key | O(k), k 是鍵個數 |
mset key value [key value ...] | 批量設置指定的 key 和 value | O(k), k 是鍵個數 |
mget key [key ...] | 批量獲取 key 的值 | O(k), k 是鍵個數 |
incr key | 指定的 key 的值 +1 | O(1) |
decr key | 指定的 key 的值 -1 | O(1) |
incrby key n | 指定的 key 的值 +n | O(1) |
decrby key n | 指定的 key 的值 -n | O(1) |
incrbyfloat key n | 指定的 key 的值 +n | O(1) |
append key value | 指定的 key 的值追加 value | O(1) |
strlen key | 獲取指定 key 的值的?度 | O(1) |
setrange key offset value | 覆蓋指定 key 的從 offset 開始的部分值 | O(n),n是字符 串?度, 通常視 為O(1) |
getrange key start end | 獲取指定 key 的從 start 到 end 的部分值 | O(n),n 是字符串?度, 通常視為 O(1) |
?