Redis-String
本文章記錄Redis中String資料類型的筆記
- 結構
- 内部編碼
- 指令和栗子
結構
key | value |
---|---|
hello | world(字元串) |
counter | 1(整型Redis這裡會字元串類型轉換) |
bits | 10111101(二進制在位圖有用到) |
data | JSON資料"{...}" |
PS:「value最多存512MB上限」,Redis字元串類型用于場景這裡舉幾個栗子,緩存,計數器(播放量和浏覽量等),分布式鎖等等。
内部編碼
String類型的内部編碼有三個分别是
int
,
raw
,
embstr
,下面介紹一下它們:
- 「int編碼」 :儲存
型的64位有符号整數long
- 「raw編碼」:儲存長度小于44位元組的字元串
- 「embstr編碼」:儲存長度大于44位元組的字元串
可以利用
object encoding key
進行檢視String類型的key用的那些内部編碼
127.0.0.1:6379> object encoding str
"raw"
127.0.0.1:6379> set str 123456789123456789
OK
127.0.0.1:6379> object encoding str
"int"
127.0.0.1:6379> set str 1234567891234567899999
OK
127.0.0.1:6379> object encoding str
"embstr"
複制
指令和栗子
「get,set,del」
API指令 | 詳解 | 時間複雜度 |
---|---|---|
get key | 擷取指定 key 的對應的value | O(1) |
set key value | 設定 key - value | O(1) |
del key | 删除 key - value | O(1) |
127.0.0.1:6379> get aquan
"aquan"
127.0.0.1:6379> set name "aquan"
OK
127.0.0.1:6379> get name
"aquan"
127.0.0.1:6379> del name
(integer) 1
127.0.0.1:6379> get name
(nil)
複制
「incr, decr,incrby,decrby」
API指令 | 詳解 | 時間複雜度 |
---|---|---|
incr key | key自增1,如果不存在key,自增後get key = 1 | O(1) |
decr key | key自減1,如果不存在key,自減後get key = -1 | O(1) |
incrby key num | key自增num,如果不存在key,自增後get key = num | O(1) |
decrby key count | key自減num,如果不存在key,自增後get key = -num | O(1) |
127.0.0.1:6379> get count
(nil)
127.0.0.1:6379> incr count
(integer) 1
127.0.0.1:6379> get count
"1"
127.0.0.1:6379> incrby count 99
(integer) 100
127.0.0.1:6379> decr count
(integer) 99
127.0.0.1:6379> get coutn
(nil)
複制
「set,setnx,set xx」
API指令 | 詳解 | 時間複雜度 |
---|---|---|
set key value | 不管 key 是否存在,都設定 | O(1) |
setnx key value | key不存在,才設定(add) | O(1) |
set key value xx | key存在,才設定(updata) | O(1) |
PS:
setnx
可以了解為資料的ADD操作,
set xx
了解為更新操作
127.0.0.1:6379> exists name
(integer) 0
127.0.0.1:6379> set name "aquan"
OK
127.0.0.1:6379> setnx name "666"
(integer) 0
127.0.0.1:6379> get name
"aquan"
127.0.0.1:6379> set name "nb" xx
OK
127.0.0.1:6379> get name
"nb"
127.0.0.1:6379> exists java
(integer) 0
127.0.0.1:6379> setnx java "nb"
(integer) 1
127.0.0.1:6379> get java
"nb"
複制
「mget,mset」
API指令 | 詳解 | 時間複雜度 |
---|---|---|
mget key1 key2 key3 ... | 批量擷取key | O(n) |
mset key1 value1 key2 value2 .. | 批量設定key - value | O(n) |
127.0.0.1:6379> mset key1 value1 key2 value2 key3 value3
OK
127.0.0.1:6379> mget key1 key2 key3
1) "value1"
2) "value2"
3) "value3"
複制
PS:在适量的情況下
mget
比多次使用單個
get
擷取key值效率高,速度快
「getset,append,strlen」
API指令 | 詳解 | 時間複雜度 |
---|---|---|
getset key value | set key newvalue并且傳回舊的value | O(1) |
append key value | 将value追加到舊的value | O(1) |
strlen key | 傳回字元串的長度 | O(1) |
PS:注意中文使用
strlen
的時候,一個中文的長度為2
127.0.0.1:6379> getset name "aquan"
"nb"
127.0.0.1:6379> append name "666"
(integer) 8
127.0.0.1:6379> get name
"aquan666"
127.0.0.1:6379> strlen name
(integer) 8
複制
「incrbyfloat,getrange,setrange」
API指令 | 詳解 | 時間複雜度 |
---|---|---|
incrbyfloat key 2.8 | 增加對應key的值2.8 | O(1) |
getrange key start end | 擷取字元串指定下标所有的值 | O(1) |
setrange key index value | 設定指定下标所有對應的值 | O(1) |
127.0.0.1:6379> incr count
(integer) 100
127.0.0.1:6379> incrbyfloat count 2.8
"102.8"
127.0.0.1:6379> get count
"102.8"
127.0.0.1:6379> set str abcdef
OK
127.0.0.1:6379> getrange str 0 2
"abc"
127.0.0.1:6379> setrange str 2 "zzz"
(integer) 6
127.0.0.1:6379> get str
"abzzzf"
複制