1.Redis中的string
? ? ? ? 注意本文以及之后講的redis的類型但是指的value的類型,所有的key都是string
? ? ? ? Redis中的字符串,直接就是按照二進制數據的方式存儲的,不會做任何的編碼轉換,這里相對于mysql就比較好(個人感覺),因為mysql默認的字符集是拉丁文插入中文會失敗。
? ? ? ? string不僅可以存儲文本數據還可以存儲整數、普通文本字符串、JSON、xml、二進制數據,這里值得一提的是redis對于string的類型限制了大小最大為512M,這是因為redis是單線程其希望進行的操作都比較快速。
2.String常用操作
2.1 SET
SET key value [expiration EX seconds | PX milliseconds] [NX | XX]
? ? ? ?redis文檔給出的語法格式說明:[]相當于一個獨立的單元,表示可選項(可有可無),|表示或者的意思,[]和[]之間可以同時存在
????????對于第一個中括號其指的是設不設置過期時間,EX表示設置的時間單位是s而PX表示設置的時間的單位是ms。
? ? ? ? 對于第二個括號中的NX表示如果key不存在才設置,如果key存在則不設置(返回nil),而XX表示key存在才設置(相當于更新key中的value),如果key不存在則返回nil? ? ? ??
2.2 失去年終獎小技巧
? ? ? ? 清除redis上所有的數據的操作,這就等價于刪庫了(drop database)
FLUSHALL //輕易不要使用,不然廢了,但是學習中可以隨便用
2.3 GET
GET key //這個命令還是比較簡單的
·? ? ? ? 對于GET來說,只是支持字符串類型的value,如果value是其他類型,使用GET獲取就會報錯,下面我對list類型的value使用get就出現了報錯
2.4 MGET 以及 MSET
MGET key [key ...]
MSET key value [key value ...]
? ? ? ? 對比于上面的set和get其實mset和mget的區別在于一次操作多組鍵值對。
? ? ? ? 對于多組key和value其實mset和mget是高效的,這是因為我們的這些命令其實是需要通過網絡來發送給redis的服務端的,那么相對于多次發送的set和get顯然是一次發送多組數據的mset和mget更高效
????????
? ? ? ? 但是一次設置太多的數據依舊可能會導致redis阻塞。
2.5 String中存儲的是數字時可以使用的操作
2.5.1 value是整數
????????incr:針對value+1
? ? ? ? incrby:針對value+n
? ? ? ? decr:針對value-1
? ? ? ? decrby:針對value-n
? ? ? ? 這四個操作的返回值都是相應操作后的值,值得一提的是上面的操作如果key不存在會將key視為0創建并進行操作。
? ? ? ? 其實incrby也可以用來實現減法,這就好比加上一個負數。同樣的decrby也可以用來實現加法
2.5.2 value是浮點數
? ? ? ? incrbyfloat:把key對應的value進行+-運算,運算的操作數可以是浮點數,但是并沒有提供decrbyfloat這樣的命令,就只能同加上負數來實現減法
? ? ? ? 這里猜測為什么沒有提供減法版本,可能是因為使用redis進行的計數操作一般都是針對整數進行的。
? ? ? ? 這里因為是多個客戶端對接一個服務端那么上面的這些對數字操作的命令會不會存在線程安全的問題呢?就比如在c++中我們起了兩個線程對同一個變量都進行++10000次但是結果并不是20000一般結果都是比20000小的。但是其實是沒有問題的這是因為redis是一個單線程。
2.6 字符串操作
2.6.1 獲取字符串的長度
APPEND KEY VALUE
? ? ? ? append返回值的長度單位是字節,這是因為redis的字符串并不會對字符編碼做任何處理,換而言之就是redis只認識字節不認識字符。
? ? ? ? append可以用來設置key,如果key已經存在那么append會將value追加到key原來的value中
2.6.2 從某個位置開始替換字符串
SETRANGE key offset value
? ? ? ? offset表示從哪個位置開始,value表示替換的字符串。
2.6.3 截取字符串
GETRANDGE key start end
? ? ? ? 這個區間是左閉右閉的,這里確實需要注意,因為C++中的區間是左閉右開的,并且這里的下標是支持負數的對應關系如下,簡單來說負數就是len-1位置處的元素
3.string內部的三種編碼格式
? ? ? ? int:64位/8字節的整數
? ? ? ? embstr:壓縮字符串。適用于比較短的字符串
? ? ? ? raw:普通字符串。適用于表示更長的字符串。
object encoding 可以查看value的編碼格式