在日常開發中,我們一般都選擇關係型資料庫來儲存資料,如MySQL,Oracle等,但是在並行量比較大的業務場景,關係型資料庫往往會成為系統瓶頸,無法完全滿足我們的需求,所以就誕生了非關係型資料庫,即NoSql資料庫。
NoSql資料庫最常見的解釋是「non-relational」,也有人解釋為「Not Only SQL」。非關係型資料庫不保證事務,也就是不具備ACID特性,這也是非關係型資料庫和關係型資料庫最大的區別,而我們即將介紹的Redis就屬於NoSql資料庫的一種。
PS:本系列文章基於Redis5.0.5版本。
相比較於傳統的關係型資料庫,NoSql資料庫具有如下優點:
同時,NoSql資料庫的種類也非常多,按照不同的資料儲存型別劃分的話主要有以下常見的NoSql資料庫:
Redis全稱:REmote DIctionary Service,即遠端字典服務。Redis是一個開源的(遵守BSD協定)、支援網路、可基於記憶體亦可持久化的紀錄檔型、Key-Value資料庫。
Redis具有以下特性:
Redis當中採用key和value形式儲存,key和value的最大長度限制是512M。
Redis預設有16個資料庫,這個可以在組態檔redis.conf中做出修改:
databases 16
這16個資料庫以編號0-15命名,不支援修改名字,而且各個資料庫之間的資料並不具備隔離性,比如我們切換到任意一個資料庫,執行命令flushall就可以清空所有資料庫的資料,所以並不建議通過資料庫來隔離不同的業務系統資料,但是我們可以針對同一個業務系統中的不同模組將其設定到不同的資料庫中。
select 資料庫編號
下面圖示可以看到,我們是在0號資料庫設值,所以切換到其他資料庫中無法取到值:
flushdb
flushall
Redis中支援的資料型別到5.0.5版本為止,一共有9種。分別是:
雖然這裡列出了9種,但是我們最常用的就是前面5種。
在Redis中,針對每種資料型別都提供了不同的型別的命令,下面就讓我們依次來介紹一下。
字串型別是我們使用最廣泛的一種型別,而且Redis中的key值只能用字串來儲存,而value就可以支援9種資料型別。
Redis當中的字串可以儲存三種資料型別:
所以我們字串型別的操作命令還包括了自增命令,下面我們來看一下字串型別的常用操作命令
下面介紹幾個常用的操作命令:
set key value
mset key1 value1 key2 value2
get key
get key1 key2
keys *
dbsize
dbsize
rename oldKey newKey
del key
del key
incr key
incrby key 需要自增的數位
setnx key value # 設定單個key
mset key1 value1 key2 value2 # 設定多個key
PS:setnx和mset是原子操作,必須所有都設定成功才會返回true,其還有引數可以設定過期時間,一般分散式鎖就是基於帶過期時間的這個命令來實現的。
字串型別的應用場景非常豐富,正常的熱點資料都可以採用字串型別來進行快取,主要可以應用如下場景:
Redis中的List列表內部的元素也是字串,我們可以將指定元素新增到列表中的指定位置。列表資料型別的操作命令一般都會有小寫字母l開頭。
來看一些常用的操作命令:
lpush key value1 value2
lpushx key value1 value2
lpop key
rpush key value1 value2
rpushx key value
rpop key
llen key
lindex key index
lrange key start stop
lset key index value
ltrim key start end
Redis中的集合是一個String型別的無序集合,集合中元素唯一不可重複。
Set集合的操作命令一般都以s開頭,下面就列舉一些常用的命令:
sadd key member1 member2
sismember key member
srem key member1 member2
smove source dest member
smembers key
Redis中的有序集合和集合的區別是有序集合中的每個元素都會關聯一個double型別的分數,然後按照分數從小到大的順序進行排列。
Sorted Sets集合的操作命令一般都以z開頭,下面就列舉一些常用的命令:
zadd key score1 member1 score2 member2
zscore key member
zincrby key num member
zcount key min max
zrange key start stop
zrevrange key start stop
zrangebyscore key min max
zrevrangebyscore key max min
zrank key member
zrevrank key member
zlexcount key min max
雜湊表中儲存的是一個key和value的對映表。操作雜湊資料型別的命令一般都是h開頭。
下面就是一些常用命令的範例:
hset key field value #設定單個field
hmset key field1 value1 field2 value2 #設定多個field
hsetnx key field value
hget key field
hmget key field1 field2
hdel key field1 field2
hlen key
hincrby key field increment
hincrbyfloat key field increment
hincrby key field increment
hkeys key
hvals key
雜湊型別和字串型別其實非常像,所以基本上字串能做的事情,雜湊都能做,而且在有些場景下利用雜湊的分類儲存,將會更加高效。
點陣圖bitmap就是通過最小的單位bit來進行0或者1的設定,表示某個元素對應的值或者狀態,其值只能是0或者1,表示是或者否。所以這個一般用於統計是否登入,是否收藏等非否即是的資料。
比如儲存資料格式一般為:100110000111,這裡的0和1就是bit值,設定的時候可以設定指定位置(偏移量)的bit值。
點陣圖資料型別主要提供了以下命令:
setbit key offset value
getbit key offset
bitcount key [start] [end]
bitpos key bit [start] [end]
這個一般應用在非否即是的場景,比如說是否登入,使用者是否留存,是否收藏商品,是否點贊等等。
HyperLogLog是Redis 2.8.9 版本新增的一種用來做基數統計演演算法的資料結構。其優點是在輸入元素的數量或者體積非常大時,計算基數所需的空間總是固定的、並且是很小的。這種資料結構一般用於統計UV之類的資訊。
HyperLogLog本身是一種演演算法,其來源於論文《HyperLogLog the analysis of a near-optimal cardinality estimation algorithm》,大家如果對這種演演算法感興趣的可以去了解一下。
在Redis裡面,每個HyperLogLog鍵只需要花費12KB記憶體,就可以計算接近2^64 個不同元素的基數,但是也可能有0.81%的錯誤率。
這種資料型別主要提供了以下三個命令:
pfadd key element1 element2
pfcount key1 key2
pfmerge destkey sourcekey1 sourcekey2
從上面我們可以看到,存進去之後並沒有取出來的命令,所以這個一般就是用來統計,而且需要能接受誤差。
比如上面的範例中,假如u1 u2 u3 u4就是使用者id,那麼我不需要判斷,只要使用者來存取一次網頁我就存一次,最後通過pfcount取出來的值就是去重後的值(也就是上面所說的基數),雖然說有一定誤差,但是像uv這種統計資料是可以接受誤差的。
這個一般應用在可以接受誤差場景的資料統計,比如說UV統計等場景
geospatial是Redis在3.2版本中新增的一種具有半徑查詢的地理空間索引資料型別。一般用來儲存並計算兩地之間的距離。
以下就是一些常用命令:
geoadd key longitude latitude member
geopos key member1 member2
geodist key member1 member2 [unit]
georadius key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [ASC|DESC] [COUNT count]
georadiusbymember key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [ASC|DESC] [COUNT count]
最後兩個命令基本上是一樣的,一個是需要指定經緯度,一個是會自動讀取某一個元素的經緯度。主要引數含義如下(單位就不重複介紹了):
這個應用場景就很明顯了,只有需要計算地理位置相關的場景才會需要。
Streams是Redis5.0推出的一種資料型別。支援多播的可持久化訊息佇列,用於實現釋出訂閱功能,Streams的設計借鑑了kafka。Stream是Redis中最複雜的一種資料型別,在這裡我們不展開介紹,後面介紹分佈/訂閱功能的時候再單獨介紹這種資料型別及其強大複雜的操作API。
本文主要介紹了Redis中9種基本資料型別及其常用的操作命令和應用場景進行分析,Redis中的資料型別非常豐富,雖然大部分情況下字串型別就夠用了,但是在某些特定場景使用特定型別將會更加高效和優雅。
下一篇,我們將介紹一下Redis中資料型別底層的資料結構。
請關注我,和孤狼一起學習進步。