1. 程式人生 > 其它 >redis 基本資料型別簡介

redis 基本資料型別簡介

1、含義

Redis(Remote Dictionary Server)由C語言開發的一款作為記憶體中的資料結構儲存系統,它可以用作資料庫,快取和訊息中介軟體。它的value支援多種型別的資料結,基本資料結構包括:字串(strings)、雜湊(hashes)、列表(lists)、集合(sets)、有序集合(sorted set)五種

2、字串(strings)

2-1、型別介紹

字串是Redis最簡單的儲存型別,它儲存的值可以是字串、整數或者浮點數,對整個字串或者字串的其中一部分執行操作;對整數或者浮點數執行自增(increment)或者自減(decrement)操作

Redis的字串是一個由位元組組成的序列,跟Java的ArrayList有點類似,採用預分配冗餘空間的方式來減少記憶體的頻繁分配,內部為當前字串實際分配的空間capacity一般要高於實際字串長度len。當字串長度小於1M時,擴容都是加倍現有的空間,如果超過1M,擴容一次只會多擴1M的空間。需要注意的是字串最大長度為512M

2-2、使用場景

字串型別在工作中使用廣泛,主要用於快取資料,提高查詢效能。比如儲存登入使用者資訊、電商中儲存商品、可以做計數器等等

2-3、操作命令

set key value:新增一條String型別資料
get key:獲取一條String型別資料
mset key value [key value ...]:批量新增String型別資料
mget key [key ...]:批量獲取String型別資料
incr key:自增(+1)
decr key:自減(-1)
incrby key step:按照步長(step)自增
decrby key step:按照步長(step)自減

3、雜湊(hashes)

3-1、型別介紹

雜湊相當於Java中的HashMap,內部是無序字典。實現原理跟HashMap一致。一個雜湊表有多個節點,每個節點儲存一個鍵值對。

與Java中Hash不同的是,rehash的方式不一樣,因為Java的HashMap在字典很大時,rehash是個耗時的操作,需要一次性全部rehash。Redis為了高效能,不能堵塞服務,所有采用漸進式rehash策略

漸進式rehash會在rehash的同事,保留新舊兩個hash結構,查詢會同時查詢兩個hash結構,然後在後續的定時任務中以及hash操作指令中,循序漸進地將舊hash的內容一點點遷移到新的hash結構中。當搬遷完成了,會使用新的hash結構取而代之。

當hash移除了最後一個元素之後,該資料結構自動被刪除,記憶體被回收

3-2、使用場景

Hash也可以同於物件儲存,比如儲存使用者資訊、使用者購買記錄,與字串不一樣的是,字串是需要將物件進行序列化之後才能儲存,而hash則可以將使用者物件的每個欄位單獨儲存,這樣就能節省序列化和反序列化

3-3、操作命令

hset key field value [field value ...]:儲存hash
hget key field:獲取hash
hexists key field:判斷是否存在
hlen key:獲取長度

4、列表(lists)

4-1、型別介紹

Redis中的lists相當於Java中的LinkedList,實現原理是雙向列表(其實底層就是一個快速列表),即可以支援反向查詢和遍歷,更方便操作。查詢和刪除操作非常快,時間複雜度為0(1),但是索引定位很慢,時間複雜度為O(n)

4-2、使用場景

利用它可以輕鬆實現熱銷榜;可以實現工作佇列(利用lists的push操作,將任務存在lists中,然後工作執行緒再用pop操作將任務取出進銷執行);可以時間最新列表,比如最新評價等

4-3、操作命令

linsert key BEFORE|AFTER pivot value:在什麼之前或之後插入  
lpush key value [value ...]:連結串列從左往右新增資料
rpush key value [value ...]:連結串列從右往左新增資料
lrange key start stop:按指定位置檢視list的連結串列式
lindex key index:獲取list的指定索引的元素
lpop key:從左往右連結式刪除指定key
rpop key:從右往左連結式刪除指定key
lrem key count value:如果是包含0在內的整數,是從前往後刪,如果是負數是從後往前刪
lset key index value:修改一個索引為幾的value值
ltrim key start stop:只保留指定範圍內的元素,刪除不在範圍內的元素
llen key:檢視list的長度
# 批量操作set /get
hmset key field value [field value ...]
hmget key field [field ...]
hdel key field [field ...]:刪除hash
hkeys key:檢視所有hash欄位
hgetall key:檢視所有hash
hincrby key field increment:自增,increment如果是字串就會報錯

5、集合(sets)

5-1、型別介紹

集合類似Java中的HashSet,內部實現是一個value永遠為Null的HashMap,實際就是通過計算hash的方式來快速排重的,這也是set能提供判斷一個成員是否在集合內的原因

5-2、使用場景

redis的sets型別是使用雜湊表構造的,因此複雜度是O(1),它支援集合內的增刪查改,並且支援多個集合間的交集,並集,差集操作。可以利用這些集合操作,解決程式開發過程當中很多資料集合間的問題。比如計算網站獨立IP,使用者畫像中的使用者標籤,共同好友等功能

5-3、操作命令

sadd key member [member ...]:新增
srem key member [member ...]:刪除
smembers key:查詢所有key
scard key:計算集合的大小
sismember key member:判斷set集合中的元素是否存在
spop key [count]:隨機刪除任何一個元素
sdiff key [key ...]:差集
sinter key [key ...]:交集
sunion key [key ...]:並集
sunionstore destination key [key ...]:把key1,key2,key3.....的並集儲存到一個新的destination集合上  
sinterstore destination key [key ...]:把key1,key2,key3.....的交集儲存到一個新的destination集合上
sdiffstore destination key [key ...]:把key1,key2,key3.....的差集儲存到一個新的destination集合上

6、有序集合(storted sets)

6-1、型別介紹

storted sets是Redis類似於SortedSet和HashMap的集合體,一方面它是一個set,保證了內部value的唯一性,另一方面它可以給每個value賦予一個score,代表這個value的排序權重。內部使用HashMap和跳躍表(SkipList)來保證資料的儲存和有序,HashMap裡放的是成員到score的對映,而跳躍表裡存放的是所有的成員,排序依據是HashMap裡存的score,使用跳躍表的結構可以獲取比較高的查詢效率,並且在實現上比較簡單。storted sets中最後一個value被移除後,資料結構自動刪除

6-2、使用場景

主要應用於根據某個權重進行排序的佇列的場景。比如遊戲積分排行榜,設定優先順序的任務列表,學生成績等等

6-3、操作命令

zadd key [NX|XX] [GT|LT] [CH] [INCR] score member [score member ...]:新增
zscore key member:檢視當前集合中key的數字  
zcard key:總記錄數
zrem key member [member ...]:刪除當前集合中key
zincrby key increment member:給有序set集合中的key的member加increment分
zcount key min max:檢視最小-最大範圍內有多少元素

7、通用命令

del key [key ...]:刪除一個key
exists key:判斷key是否存在,1代表存在|0代表不存在
incrbyfloat key increment:float的自增型別
getrange key start end:獲取字串指定下標的所有值
setrange key index value:設定指定下標對應的值
expire key value:設定過期時間
ttl key:檢視過期時間
persist key:去掉過期時間
type key:檢視key的型別
keys *:輸出所有的key
dbsize:輸出key的數量
flushdb:刪除該資料庫下的全部資料
flushall:刪除redis伺服器下的所有資料庫的資料(16張資料庫的資料全部清理乾淨)
clear:清屏
keys *value*:模糊查詢
rename key newkey:key重新命名
select index:切換資料庫
move key db:把當前資料庫的key移植到幾號資料庫