- Redis中的資料型別
- 字串
- 散列
- 串列
- 集合
- 有序集合
Redis中的資料型別
Redis定義了這幾種資料型別:
- string(字串)
- hash(散列)
- list(串列)
- set(集合)
- zset(有序集合)
后面會介紹它們各自的特點和使用場景,可以用TYPE命令來獲取鍵的型別,
字串
字串型別是Redis中最基本的資料型別,它能存盤任何形式的字串,包括二進制資料,可以用其存盤用戶的郵箱、JSON化的物件甚至是一張圖片,一個字串型別鍵允許存盤的資料的最大容量是512 MB,
字串型別是其他4種資料型別的基礎,其他資料型別和字串型別的差別從某種角度來說只是組織字串的形式不同,例如,串列型別是以串列的形式組織字串,而集合型別是以集合的形式組織字串,
賦值、取值
SET key value
GET key
SET成功回傳OK,GET鍵不存在時回傳空(nil),
增加、減少數字
當操作的字串是數字形式時,可以用這些命令方便地增加、減少數字
遞增、遞減操作分別為:
INCR key
DECR key
當操作的鍵不存在時,會先創建一個默認為0的值,所以使用INCR得到的結果為1,
如果被操作的鍵值不是整數,會給出錯誤提示: (error) ERR value is not an integer or out of range
增加、減少指定整數:
INCRBY key increment
DECRBY key decrement
INCRBY key1 3就相當于DECRBY key1 -3
增加、減少指定浮點數,支持雙精度浮點數,
INCRBYFLOAT key increment
DECRBYFLOAT key decrement
這些命令都是原子操作,可以保證多客戶端連接的并發場景下讀取寫入不會出錯,
向尾部追加值
APPEND key value
如果鍵不存在則將該鍵的值設定為value,回傳值是追加后字串的總長度,
> SET key1 hello
OK
> APPEND key " world!"
(integer) 12
上面的操作得到的就是“hello world”,由于需要在單詞之間有空格,append時的值用雙引號包裹,
獲取字串長度
STRLEN key
如果鍵不存在則回傳0,
同時獲取/設定多個鍵值
MGET key1 key2 ...
MSET key value key1 value1 ...
散列
Redis是采用字典結構以鍵值對的形式存盤資料,而散列型別(hash)的鍵值也是一種字典結構,其存盤了欄位(field)和欄位值的映射,但欄位值只能是字串,不支持其他資料型別,所以不能嵌套存盤其他資料型別,Redis的其他資料型別也不支持資料型別的嵌套,比如集合型別的每個元素都只能是字串,
一個散列型別的鍵可以最多包含2^32-1個欄位,
散列型別適合存盤物件,使用類名和ID構成鍵名,使用欄位表示物件的屬性,而欄位值則存盤屬性的值,這樣散列型別就與最簡單的DTO類構成了映射關系,
賦值與取值
HSET key field value
HGET key field
這組命令用來設定、獲取單個欄位的值,HSET命令不區分插入和更新操作,修改資料時不用事先判斷欄位是否存在來決定要執行的是插入還是更新,可以通過命令的回傳結果來判斷插入還是更新,插入時回傳1,更新時會回傳0,當鍵或者欄位不存在時,HSET命令還會自動建立它們,
HMSET、HMGET則可以一次操作多個欄位:
HMSET key field value [field value ...]
HMGET key field [field value ...]
獲取鍵的所有欄位使用HGETALL:
HGETALL key
這個命令回傳的結果是欄位和欄位值組成的串列:
1)"price"
2)"500"
3)"name"
4)"BMW"
判斷欄位是否存在
HEXISTS key field
如果存在則回傳1,否則回傳0,如果鍵不存在也會回傳0,
當欄位不存在時賦值
HSETNX key field value
HSETNX命令只有當欄位不存在時才進行賦值,如果欄位已經存在,將不執行任何操作,
增加、減少數字
HINCRBY key field increment
需要減少值時增量設為負值,如果鍵或者值不存在時將初始化并設定為1,
洗掉欄位
HDEL key field1 field2 ...
可以洗掉一個或多個欄位,被洗掉的欄位個數作為回傳值,
只獲取欄位名或欄位值
HKEYS key
HVALS key
這組命令會獲取鍵中所有欄位的名稱或值,
串列
串列型別可以存盤一個有序的字串串列,常用的操作是向串列兩端添加元素,或者獲得串列的某一個片段,串列型別內部是使用雙向鏈表實作的,向串列兩端添加元素的時間復雜度為O(1),獲取越接近兩端的元素速度就越快,但通過索引訪問元素的速度卻比較慢,
所以串列型別最適合于訪問前某幾個元素的場景,比如熱點新聞,一個串列型別鍵最多能容納的元素數量也是2^32-1個,
向串列兩端增加元素
LPUSH key value [value ...]
RPUSH key value [value ...]
LPUSH和RPUSH分別用來先串列的左邊和右邊增加元素,回傳值表示增加元素后串列的長度,可以同時增加多個元素,
從串列兩端彈出元素
LPOP key
RPOP key
LPOP和RPOP分別從串列的左邊和右邊彈出一個元素,回傳值元素的內容,如果串列為空,回傳(nil),
獲取串列中元素的個數
LLEN key
如果串列為慷訓不存在,則回傳0,
獲得串列片段
LRANGE key start stop
回傳索引從start到stop之間的所有元素(包含兩端的元素),與大多數人的直覺相同,Redis的串列起始索引,左邊為從0開始,右邊為從-1開始,-2表示右邊第二個元素,以此類推,
如果start的索引位置比stop的索引位置靠后,則會回傳空串列;如果stop大于實際的索引范圍,則會回傳到串列最右邊的元素,
洗掉串列中指定的值
LREM key count value
洗掉串列中前count個值為value的元素,回傳值是實際洗掉的元素個數,
count值的正負會決定從洗掉開始的方向:
- 當count>0時LREM命令會從串列左邊開始洗掉前count個值為value的元素;
- 當count<0時LREM命令會從串列右邊開始洗掉前|count|個值為value的元素;
- 當count=0時LREM命令會洗掉串列中所有值為value的元素,
獲得/設定指定索引的元素值
LINDEX key index
LSET key index value
與LREM類似,index >= 0表示從左邊開始計算索引,index < 0則從右邊開始,
只保留串列指定片段
LTRIM key start end
洗掉指定索引范圍之外的所有元素,其指定串列范圍的方法和LRANGE命令相同,
向串列中插入元素
LINSERT key BEFORE|AFTER privot value
LINSERT命令首先會在串列中從左到右查找值為pivot的元素,然后根據第二個引數是BEFORE還是AFTER來決定將value插入到該元素的前面還是后面,命令的回傳值是插入后串列的元素個數,
將元素從一個串列轉到另一個串列
RPOPLPUSH source destination
這個命令會先對source執行RPOP命令,從它的右邊彈出一個元素,再對destination執行LPUSH命令,將元素加入到這個串列的左邊,并回傳這個元素的值,整個程序是原子的,
RPOPLPUSH命令可以很直觀地在多個佇列中傳遞資料,當source和destination相同時,RPOPLPUSH命令會不斷地將隊尾的元素移到隊首,同時串列中仍然可以增加、洗掉元素,
集合
同串列型別相比,集合型別中的元素不能相同,同時元素沒有順序,
一個集合型別鍵可以存盤的字串數量最多也是2^32 -1個,
集合型別的常用操作是向集合中加入或洗掉元素、判斷某個元素是否存在等,由于集合型別在Redis內部是使用值為空的散串列(hashtable)實作的,所以這些操作的時間復雜度都是O(1),最方便的是多個集合型別鍵之間還可以進行并集、交集和差集運算,
增加/洗掉元素
SADD key member [member ...]
SREM key member [member ...]
這組命令用來向集合中增加或洗掉一個或多個元素,增加時如果鍵不存在則會自動創建,因為在一個集合中不能有相同的元素,所以增加時如果要加入的元素已經存在于集合中,就會忽略這個元素,命令的回傳值是成功加入或洗掉的元素數量,
獲得集合中的所有元素
SMEMBERS key
判斷元素是否在集合中
SISMEMBER key mumber
這項操作的時間復雜度為O(1),無論集合中有多少個元素,SISMEMBER命令都可以非常快地回傳結果,當值存在時回傳1,不存在或鍵不存在時回傳0,
獲得集合中元素個數
SCARD key
集合間運算
SDIFF key [key...]
SINTER key [key...]
SUNION key [key...]
這組命令用來對多個集合進行差集、交集、并集運算,
SDIFFSTORE destination key [key...]
SINTERSTORE destination key [key...]
SUNIONSTORE destination key [key...]
這組命令會把集合間運算的結果存盤到destination中,
有序集合
有序集合型別與集合型別相比,它為其中的每個元素都關聯了一個分數,這使得可以對元素進行取前N個、獲得指定分數范圍內的元素等操作,
有序集合中的元素也是各不相同的,但元素的分數可以相同,
有序集合型別與串列型別相比,相似的地方在于二者都是有序的,也都可以獲得指定范圍的元素;但他們的區別大于共性:
-
在存盤結構上,串列型別是通過鏈表實作的,獲取靠近兩端的資料速度極快,而當元素增多后,訪問中間資料的速度會較慢,所以它更適合很少訪問中間元素的場景;有序集合型別則是使用散串列和跳躍表實作的,所以即使讀取位于中間部分的資料速度也很快,
-
串列中不能簡單地調整某個元素的位置,但是在有序集合中通過更改元素的分數就可以做到,
-
有序集合要比串列型別更耗費記憶體,
增加元素
ZADD key score member [score member ...]
ZADD命令用來向有序集合中加入若干元素和該元素的分數,如果該元素已經存在則會用新的分數替換原有的分數,命令的回傳值是新加入到集合中的元素個數(不包含之前已經存在的元素),
這里設定的分數可以是整數,也可以是雙精度浮點數,還可以設定為+inf和-inf來分別表示正無窮和負無窮,
獲得元素的分數
ZSCORE key member
獲得排名在某個范圍的元素串列
ZRANGE key start stop [WITHSCORES]
ZREVRANGE key start stop [WITHSCORES]
ZRANGE和ZREVRANGE命令分別按照元素分數從小到大和從大到小的的順序回傳索引從start到stop之間的所有元素(包含兩端的元素),
在命令的尾部加上WITHSCORES可以同時獲得元素的分數,
如果兩個元素的分數相同,Redis會按照字典順序(即"0" < "9" <"A" < "Z" < "a" < "z"這樣的順序)來進行排列,如果元素是中文,會按照中文編碼來排序,
索引>=0表示從前往后查找,為<0表示從后往前查找,
ZRANGE key1 0 4
ZRANGE key1 1 -1
獲得指定分數范圍的元素
ZRANGEBYSCORE key min max [WITHSCORE] [LIMIT offset count]
按照元素分數從小到大的順序回傳分數在min和max之間的元素,默認包含min和max,如果希望分數范圍不包含端點值,可以在分數前加上'('符號
ZRANGEBYSCORE key1 (60 80
這樣寫獲取的范圍就是 60< score <= 80,
這里也同樣可以用-inf和+inf分別表示負無窮和正無窮,
用WITHSCORES可以同時獲得元素的分數,
[LIMIT offset count]表示在獲得的元素串列的基礎上向后偏移offset個元素,并且只獲取前 count個元素,
比如想獲得分數高于60分的從第二個人開始的3個人:
ZRANGEBYSCORE key1 60 +inf LIMIT 1 3
與ZRANGEBYSCORE對應的,還有ZREVRANGEBYSCORE,它會按照元素分數從大到小的順序回傳分數在max和min之間的元素
ZREVRANGEBYSCORE key max min [WITHSCORE] [LIMIT offset count]
增加某個元素的分數
ZINCRBY key increment member
回傳值是更改后的分數,這個操作也是原子的,
獲得指定分數范圍內的元素個數
ZCOUNT key min max
min max可以指定為+inf -inf,也可以用(來設定邊界條件,
洗掉一個或多個元素
ZREM key member [member ...]
回傳值是成功洗掉的元素數量(不包含本來就不存在的元素),
按照排名范圍洗掉元素
ZREMRANGEBYRANK key start stop
按照元素分數從小到大的順序(即索引0表示最小的值)洗掉處在指定排名范圍內的所有元素,并回傳洗掉的元素數量,索引負值表示從后向前查找,
按照分數范圍洗掉元素
ZREMRANGEBYSCORE key min max
洗掉指定分數范圍內的所有元素,引數min和max的特性和ZRANGEBYSCORE命令中的一樣,回傳值是洗掉的元素數量,
獲得元素的排名
ZRANK key member
ZREVRANK key member
這組命令會分別按照元素分數從小到大、從大到小的順序獲得指定的元素的排名(從0開始,即分數最小或最大的元素排名為0)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/2465.html
標籤:NoSQL
上一篇:Cassandra配置JMX
