asp 網(wǎng)站開發(fā) 軟件怎么做網(wǎng)絡(luò)平臺
目錄
- set
- get
- mset
- mget
- setnx、setex、psetex
- incr、incrby、decr、decrby、incrbyfloat
- append
- getrange
- setrange
- strlen
- 字符串類型編碼方式
- 總結(jié)
Redis - String
Redis存儲的字符串,是直接按二進(jìn)制方式存儲,不會做任何編碼轉(zhuǎn)換,存的是什么,取出來的就是什么
set
set命令的完整體
set key value [expiration EX seconds |PX milliseconds] [NX|XX]
Redis語法格式說明:
[] 表示一個獨(dú)立的單元,表示可選項(xiàng),|表示或者
ex 表示設(shè)置超時時間,單位是秒,px也是設(shè)置超時時間,單位是毫秒
set key value ex 10
相當(dāng)于
set key value ex 10
expire key 10
NX表示:如果key不存在才設(shè)置,如果key存在就不設(shè)置(返回nil)
XX表示:如果key存在才設(shè)置,如果key不存在就不設(shè)置(返回nil)
另外,如果key不存在,會創(chuàng)建新的鍵值對,如果key存在,會把舊的value覆蓋掉,可能會改變原來的數(shù)據(jù)類型,key設(shè)置的ttl也會失效
使用案例:
get
get只支持字符串類型的value,如果value是其他類型,使用get獲取會出錯
mset
一次設(shè)置多個key的值
mset key value [key value...]
時間復(fù)雜度O(N),N指的是命令中key的個數(shù)
mget
一次獲取多個key的值,如果value不是字符串類型的,返回nil
mget key [key...]
時間復(fù)雜度O(N),N指的是命令中key的個數(shù)
setnx、setex、psetex
setnx:不存在才能設(shè)置,存在則設(shè)置失敗
setnx key value
setex:設(shè)置value的同時,設(shè)置過期時間(單位秒)
setex key seconds value
psetex:設(shè)置value的同時,設(shè)置過期時間(單位毫秒)
psetex key milliseconds value
incr、incrby、decr、decrby、incrbyfloat
- incr:針對value+1,key對應(yīng)的value必須是整數(shù)(64位范圍內(nèi)),返回值是 +1 之后的值
incr key
如果key不存在,就把這個key的value當(dāng)做0
- incrby:針對value+n
incrby key increment
如果key不存在,就把這個key的value當(dāng)做0
n也可以是負(fù)數(shù)
- decr:針對value-1,key對應(yīng)的value必須是整數(shù)(64位范圍內(nèi)),返回值是 -1 之后的值
decr key
如果key不存在,就把這個key的value當(dāng)做0
- decrby:針對value-n
decrby key increment
- incrbyfloat:針對value +小數(shù)或者value-小數(shù)
? 這個命令沒有減法版本,但是可以加負(fù)數(shù),并且使用Redis進(jìn)行的計(jì)數(shù)操作一般是整數(shù)
上述時間復(fù)雜度都是O(1),多個客戶端針對同一個key進(jìn)行incr操作,不會引起線程安全問題
append
如果key已經(jīng)存在,并且value是String類型,這個命令會將value追加到原有的value后面。如果key不存在,效果相當(dāng)于set,返回值是追加后的字符串的長度
append key value
append返回值的單位長度是字節(jié),Redis不會對字符編碼做處理,設(shè)置的是什么,獲取的就是什么
Xshell終端默認(rèn)是utf8,所以在終端輸入漢字之后也是按照utf8編碼的,在utf8中,一個漢字通常是3個字節(jié)的,所以在獲取的時候,也是utf8編碼的,那么如何讓Redis獲取key對應(yīng)的value能夠顯示中文?在啟動的時候加上 --raw即可
redis-cli --raw
getrange
返回key對應(yīng)的String的子串,由start和end確定(左閉右閉),使用負(fù)數(shù)表示倒數(shù)。-1表示倒數(shù)第一個字符,-2表示倒數(shù)第二個字符,以此類推如果超過了范圍會根據(jù)String長度自動調(diào)整(下標(biāo)從0開始)
getrange key start end
如果value是中文,切出來的可能是不完整的漢字
setrange
將字符串中的子串進(jìn)行替換
setrange key offset value
offset表示偏移量,表示從第幾個字節(jié)開始進(jìn)行替換,結(jié)束的位置是看value的長度,返回值是替換后新的字符串的長度
如果針對中文字符串進(jìn)行setrange,可能會出問題
如果key不存在,也是可以進(jìn)行setrange操作,只不過會把offset之前的內(nèi)容填充成0x00
strlen
獲取字符串的長度,單位是字節(jié),如果key不存在返回0,如果對應(yīng)的key的value不是String類型的則會報(bào)錯
strlen key
字符串類型編碼方式
字符串類型的內(nèi)部編碼方式有3種,包括int、embstr、raw
int:8個字節(jié)的長整型
embstr:小于39個字節(jié)的字符串
raw:大于39個字節(jié)的字符串
Redis會根據(jù)當(dāng)前值的類型和長度動態(tài)的決定使用哪種編碼方式
總結(jié)
命令 | 效果 | 時間復(fù)雜度 |
---|---|---|
set key value [key value…] | 設(shè)置 key 的值是 value | O(k), k 是鍵個數(shù) |
get key | 獲取 key 的值 | O(1) |
del key [key …] | 刪除指定的 key | O(k), k 是鍵個數(shù) |
mset key value [key value…] | 批量設(shè)置指定的 key 和 value | O(k), k 是鍵個數(shù) |
mget key [key …] | 批量獲取 key 的值 | O(k), k 是鍵個數(shù) |
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) |