Redis的數據結構
1、Redis數據結構介紹
Redis是一種高級的key-value存儲系統,其中value支持五種數據結構
- 字符串(String)
- 哈希(hash)
- 字符串列表(list)底層是鏈表形式的
- 字符串集合(set)
- 有序字符串集合(sorted set)
關於key的定義,如下幾點須要注意:
- key不要太長,應該小於1024字節,消耗額外查找性能
- key也不要過短,影響可讀性
- 在項目中key應該有一個統一的命名規範
2、存儲String
1.概述
字符串類型是Redis中最爲基礎的數據存儲類型,它在Redis中是二進制安全的(存入和獲取的數據二進制層面上徹底相同)。Redis中字符串類型的value每條最多能夠容納的數據長度是512M。
2.經常使用命令
(1)
賦值:
set key value
設定key特有指定的字符串value,若是該key存在則進行覆蓋操做,老是返回"OK」
(2)
取值:
get key
獲取特定key的value。若是與該key關聯的value不是String類型,redis將返回錯誤信息,由於get命令只能獲取String類型的value。若value不存在,返回"(nil)"
getset key value
先獲取特定key對應value,再從新設置該key的值
(3)
刪除:
d
el key(全部數據類型通用)
刪除指定key的鍵值對,返回(integer)刪除的鍵值對個數
(4)
數值增減:
*Redis將自動解析value中是否能夠增減的數將其轉換爲數字再增減。
將返回遞增後的數據
incr key
將指定的key的value原子性地遞增1。若該key不存在,默認建立這個key並設value初始值爲0,在incr後其值將變爲1。若value的值不能轉爲整型,如'hello',則該操做失敗並返回錯誤信息
key不存在:
value不能轉爲整型:
decr key
將指定的key的value原子性地遞減1。若該key不存在,默認建立這個key並設value初始值爲0,在incr後其值將變爲-1。若value的值不能轉爲整型,如'hello',則該操做失敗並返回錯誤信息
key不存在:
value不能轉爲整型:
(5)
拼接字符串:
append key appendValue
若是該key存在,則在原來的value後追加填入的appendValue值;若不存在,則從新建立一個對應的鍵值對。返回拼接後字符串的長度
key存在:
key不存在:
(6)
其餘命令:
*原子性增長/減少:(相似"i+=5")
incrby key increment
decrby key decrement
等等,自查文檔
3、存儲hash
1.概述
Redis
中的Hashes類型能夠當作具備
String Key
和String Value的
map
容器。因此該類型很是適合於存儲值對象的信息。如
Username
、Password和Age等。若是
Hash
中包含不多的字段,那麼該類型的數據也將僅佔用不多的磁盤空間。每個
Hash
能夠存儲
4294967295
個鍵值對。
2.經常使用命令
!圖例中hash表命名爲myset,更好的應該是命名爲myhash,忽略這個細節
(1)
賦值:
爲指定的key設定field/value對(hash鍵值對)
hset key field value
將自動建立一個hash類型的value
設置
key
中的多個
filed/value
hmset key field value [field2 value2 ...]
(2)取值:
獲取指定key中指定field的value
hget key field
獲取key中多個field的值
hmget key field [field2 ...]
獲取指定key的全部f/v
hgetall key
(3)刪除:
刪除一個或多個字段,返回被刪除字段個數(返回0表示要刪除的字段不存在)
hdel key field [field2 ...]
刪除整個hash表
del key
(4)
增長數字:
設置key中的field的值增長increment(返回增長後的結果)(field不存在的話類同String的增減數據)
hincrby key field increment
field不存在:
無hdecrby key field decrement這個命令
可使increment爲負數代替
(5)其餘命令:
判斷指定key中的指定field是否存在
hexists key field
獲取指定key中包含的field的數量
hlen key
hkeys key
- 字符串(String)
- 哈希(hash)
- 字符串列表(list)底層是鏈表形式的
- 字符串集合(set)
- 有序字符串集合(sorted set
4、存儲list類型
1.概述
在
Redis
中,List類型是按照插入順序排序的字符串鏈表。和數據結構中的普通鏈表同樣,咱們能夠在其頭部
(left)
和尾部(right)添加新的元素。在插入時,若是該鍵並不存在,Redis將爲該鍵建立一個新的鏈表。與此相反,若是鏈表中全部的元素均被移除,那麼該鍵也將會被從數據庫中刪除。
List
中能夠包含的最大元素數量是4294967295個。
從元素插入和刪除的效率視角來看,若是咱們是在鏈表的兩頭插入或刪除元素,這將會是很是高效的操做,即便鏈表中已經存儲了百萬條記錄,該操做也能夠在常量時間內完成。然而須要說明的是,若是元素插入或刪除操做是做用於鏈表中間,那將會是很是低效的。相信對於有良好數據結構基礎的開發者而言,這一點並不難理解。
在Redis的鏈表中,0表明頭元素,一、二、3等依次類推;-1表明尾元素,-二、-3類推爲倒數第2、倒數第三等。
2.經常使用命令(命令中l表明left/list,r表明right)
1)
lpush key value1 [value2...]
:在指定的key所關聯的list的頭部
添加
全部的 values,若是該key不存在,該命令在添加的以前建立一個與該key關聯的空鏈表,以後再向該鏈表的頭部添加數據。添加成功,返回元素的個數。
2)
rpush key value1 [value2...]
:在該list的尾部
添加
元素
3)
lrange key start end
:
獲取
鏈表中從start到end的元素的值,start、end可 爲負數,若爲-1則表示鏈表尾部的元素,-2則表示倒數第二個,依次類推…
獲取
全部
value用:
lrange key 0 -1
4)
lpushx key value
:
僅當參數中指定的key存在時
(若是與key對應的list中沒有值時,則該key是不存在的)在指定的key所關聯的list的頭部插入value。這個命令不能夠一次插入多個value
不能夠插入多個value
5)
rpushx key value
:同上,在該list的尾部添加元素
6)
lpop key
:返回並
彈出
指定的key關聯的鏈表中的第一個元素,即頭部元素。
彈出:從list中獲取且移除
7)
rpop key
:從尾部
彈出
元素。
8)
rpoplpush resource(源list) destination(目標list)
:將鏈表中的尾部元素彈出並添加到頭部(循環操做)
「排隊隊列」
、
9)
llen key
:返回指定的key關聯的鏈表中的元素的數量。
10)
lset key index value
:設置鏈表中的index的腳標的元素值,0表明鏈表的頭元素,-1表明鏈表的尾元素。
即替換元素
11)
lrem key count value
:
刪除
count個值爲value的元素,
若是count大於0,從頭向尾遍歷並刪除count個值爲value的元素,若是count小於0,則從尾向頭遍歷並刪除(根據具體場景進行選擇,優化性能)。若是count等於0,則刪除鏈表中全部等於value的元素。
12)
linsert key before/after pivot value
:在值爲pivot元素前或者後插入value這個元素。
失敗返-1
即
向list中間插入元素
*pivot:樞軸; 中心點
5、存儲set類型
1.概述
在
Redis
中,咱們能夠將Set類型看做爲沒有排序的字符集合,和
List
類型同樣,咱們也能夠在該類型的數據值上執行添加、刪除或判斷某一元素是否存在等操做。須要說明的是,這些操做的時間是常量時間。
Set
可包含的最大元素數是4294967295個。
和
List
類型不一樣的是,Set集合中不容許出現重複的元素。和List類型相比,
Set
類型在功能上還存在着一個很是重要的特性,即在服務器端完成多個
Sets
之間的聚合計算操做,如
unions(並集)
、intersections(交集)和
differences(差集)
。因爲這些操做均在服務端完成, 所以效率極高,並且也節省了大量的網絡IO開銷。
2.經常使用命令
1)sadd key value1 value2...:向set中添加數據,若是該key的值已有則不會重複添加
2)smembers key:獲取set中全部的成員
3)scard key:獲取set中成員的數量
4)sismember key member:判斷參數中指定的成員是否在該set中,1表示存在,0表示不存在或者該key自己就不存在
5)srem key member1 member2...:刪除set中指定的成員
6)srandmember key:隨機返回set中的一個成員
7)sdiff sdiff key1 key2:返回key1與key2中相差的成員,並且與key的順序有關。即返回差集。
8)sdiffstore destination key1 key2:將key一、key2相差的成員存儲在destination上
9)sinter
key1 key2...
:返回交集。
10)sinterstore destination key1 key2:將返回的交集存儲在destination上
11)sunion key1 key2:返回並集。
12)sunionstore destination key1 key2:將返回的並集存儲在destination上
6、存儲sorted set類型
1.概述
Sorted-Sets和Sets類型極爲類似,它們都是字符串的集合,都不容許重複的成員出 如今一個Set中。它們之間的主要差異是Sorted-Sets中的每個成員都會有一個分數(score)與之關聯,Redis正是經過分數來爲集合中的成員進行從小到大的排序。然而須要額外指出的是,儘管Sorted-Sets中的成員必須是惟一的,可是分數(score) 倒是能夠重複的。
redis
在Sorted-Set中添加、刪除或更新一個成員都是很是快速的操做,其時間複雜度爲集合中成員數量的對數。因爲Sorted-Sets中的成員在集合中的位置是有序的,所以,即使是訪問位於集合中部的成員也仍然是很是高效的。事實上,Redis所具備的這一特徵在不少其它類型的數據庫中是很難實現的,換句話說,在該點上要想達到和Redis一樣的高效,在其它數據庫中進行建模是很是困難的。 數據庫
使用sorted set的場景:遊戲排名、微博熱點話題等使用場景。安全
2.經常使用命令(rev表明reverse)
1)zadd key score member score2 member2 ...:將全部成員以及該成員的分數存放到sorted-set中,若member不存在,建立這個member,若member已存在,則更新這個member的分數(添加)
2)zcard key:獲取集合中的成員數量
3)
zcount key min max
:獲取分數在[min,max]之間的成員個數
4)
zincrby key increment member
:設置指定成員的增長的分數。返回增長後該成員的score
5)
zrange key start end [withscores]
:獲取集合中腳標爲start-end的成員,從分數低到高排序,[withscores]參數代表返回的成員包含其分數(類同list中的lrange)
從高到低排序
有命令:
zrevrange key start stop [withscores]
6)
zrangebyscore key min max [withscores] [limit offset count]
:返回分數在[min,max]的成員並按照分數從低到高排序。[withscores]:顯示分數;[limit offset count]:offset,代表從腳標爲offset的元素開始並返回count個成員
7)
zrank key member
:返回成員在集合中的排名
有從大到小排序的:
zrevrank key member
8)
zrem key member[member
…
]
:移除集合中指定的成員,能夠指定多個成員。
9)
zscore key member
:返回指定成員的分數
10)
zremrangebyrank key start stop
:按照排名順序刪除元素
11)zincrby key increment member:設置成員增長的分數,返回增長後的分數
7、通用命令
1)
keys pattern:獲取全部與pattern匹配的key,返回全部匹配的keys(*表示一個或多個任意字符,?表示任意一個字符)(
搜索)
2)
del key1 key2...
:刪除指定key的數據
3)
exists key
:判斷key是否存在,1爲t,0爲f
4)
rename key newkey
:重命名key
5)
expire key
:設置過時時間(過時即移除),單位爲秒(
!
!注意:設置爲0或-1的話會刪除這個key)
可使用
persist key
在不刪除key的狀況下移除設置的超時時間,更多超時的命令詳見文檔
6)
ttl key
:獲取該key所生的過時時間,若該key沒有設置超時expire時間,返回-1;返回-2表示key不存在
7)
type key
:獲取指定key對應的數據類型,返回字符串(string、list、set、hash、zset),若不存在則返回none
附件列表