目錄
- 一、五大基本資料型別
- 1.1、String(字串)
- 1.2、List(串列)
- 1.3、Set(集合)
- 1.4、Hash(哈希)
- 1.5、Zset(有序集合)
- 二、三種特殊資料型別
- 2.1、geospatial(地理位置)
- 2.1.1、GEOADD
- 2.1.2、GEOPOS
- 2.1.3、GEODIST
- 2.1.4、GEORADIUS
- 2.1.5、GEORADIUSBYMEMBER
- 2.1.6、GEOHASH
- 2.1.7、總結
- 2.2、hyperloglog
- 2.2.1、簡介
- 2.2.2、應用場景
- 2.2.3、命令
- 2.2.4、示例
- 2.2.5、總結
- 2.3、bitmaps
- 2.3.1、簡介
- 2.3.2、示例
一、五大基本資料型別
Redis 是一個開源(BSD許可)的,記憶體中的資料結構存盤系統,它可以用作資料庫、快取和訊息中間件, 它支持多種型別的資料結構,如 字串(strings), 散列(hashes), 串列(lists), 集合(sets), 有序集合(sorted sets) 與范圍查詢, bitmaps, hyperloglogs 和 地理空間(geospatial) 索引半徑查詢, Redis 內置了 復制(replication),LUA腳本(Lua scripting), LRU驅動事件(LRU eviction),事務(transactions) 和不同級別的 磁盤持久化(persistence), 并通過 Redis哨兵(Sentinel)和自動 磁區(Cluster)提供高可用性(high availability),
Key(鍵):Redis 鍵命令用于管理 redis 的鍵
keys * #查看所有的key
EXISTS key #判斷key是否存在,存在則回傳1
MOVE key db #將key移動到目標資料庫
DEL key #洗掉key
EXPIRE key seconds #設定key的過期時間,單位為s
TTL key #查看key的剩余時間
TYPE key #查看當前key的型別
1.1、String(字串)
Redis 字串資料型別的相關命令用于管理 redis 字串值
SET key value #設定指定key的值
GET key #獲取指定key的值
APPEND key value #如果key已經存在并且是一個字串,則將指定的value追加到該key的末尾;如果key不存在,則相當于set key
STRLEN key #回傳key所儲存的字串值的長度
INCR key #將key中儲存的數字值增一
INCRBY key increment #將key所儲存的值加上給定的增量值
DECR key #將key中儲存的數字值減一
DECRBY key decrement #key所儲存的值減去給定的減量值
GETRANGE key start end #回傳key中下標從start到end的子字串(下標從0開始)
GETRANGE key 0 -1 #回傳key全部字串
SETRANGE key offset value #用value引數覆寫給定key所儲存的字串值,從偏移量offset始,
SETNX key value #不存在則創建:只有在key不存在時設定key的值;否則創建失敗
SETEX key seconds value #設定過期時間:將值key的值為value,且過期時間為seconds(以秒為單位)
MSET key value [key value ...] #同時設定一個或多個key-value對
MGET key1 [key2..] #獲取所有(一個或多個)給定key的值,
MSETNX key value [key value ...] #同時設定一個或多個key-value對,當且僅當所有給定key都不存在(原子性操作,要么一起成功,要么一起失敗)
物件:
set user:1{name:zsr,age:20} #設定一個user:1物件,值為json的字符來保存一個物件
#這里的key是一個巧妙的設計:user:{id}:{filed}
mset user:1:name zsr user:1:age 20
mget user:1:name user:1:age
GETSET key value #如果不存在值,回傳nil;如果存在值,回傳原來的值,并設定為新的值
使用場景:value除了是字串還可以是數字
- 計數器
- 統計多單位的數量
- 粉絲數
- 物件快取存盤
1.2、List(串列)
Redis串列是簡單的字串串列,按照插入順序排序;既可以作為佇列,也可以作為堆疊
- 你可以添加一個元素到串列的頭部(左邊)或者尾部(右邊)
- 一個串列最多可以包含 2^32 - 1 個元素 (4294967295, 每個串列超過40億個元素),
LPUSH list value1 [value2] #將一個或多個值插入到串列頭部(左)
RPUSH list value1 [value2] #將一個或多個值插入到串列尾部(右)
LRANGE list start stop #獲取串列指定范圍內的元素
LRANGE list 0 -1 #顯示全部串列元素
LPOP list #移出并獲取串列的頭部元素,回傳值為移除的元素
RPOP list #移除串列的尾部元素,回傳值為移除的元素,
LINDEX list index #通過下標獲取串列中的值(下標從0開始)
LLEN list #獲取串列長度
LREM list count value #移除串列count個指定元素
LTRIM list start stop #截取串列指定區間
RPOPLPUSH list1 list2 #移除串列1的尾部元素,并將該元素從頭部添加到串列2并回傳
exists list #判斷串列是否存在
lset list index value #更改串列index處的值為value(前提是串列存在,否則會報錯)
linsert list before|after pivot element #向串列pivot元素的前|后插入元素element
使用場景:
- 訊息佇列
- 堆疊
1.3、Set(集合)
String型別的無序不重復集合
- Redis 中集合是通過哈希表實作的,所以添加,洗掉,查找的復雜度都是 O(1)
- 集合中最大的成員數為 2^32 - 1 (4294967295, 每個集合可存盤40多億個成員)
sadd set member [member ...] #向集合set中添元素member
smembers set #顯示集合set的全部元素
sismember set member #判斷member是不是集合set中的元素
scard set #獲取集合set中元素的個數
srem set member [member ...] #洗掉set集合中的元素member
spop set [count] #隨機洗掉set集合中的元素,可以指定個數count,默認為一個
srandmember set [count] #隨機抽取set集合中元素,可以指定個數count,默認為一個
smove set1 set2 member #將set1中的元素member移動到set2中
sdiff set [set...] #集合差集
sinter set [set...] #集合交集
sunion set [set...] #集合并集
使用場景:
- 微博關注的人
- 共同關注、共同愛好、推薦好友(六度分割理論)
1.4、Hash(哈希)
String 型別的
field(欄位)和value(值)的映射表,hash 特別適合用于存盤物件,
- 每個 hash 可以存盤 232 - 1 鍵值對(40多億),
hset key field value [field value ...] #將一個多個field-value對設定到哈希表key中
hmset key field1 value1 [field2 value2 ] #同時將多個field-value對設定到哈希表key中
hget key field #獲取存盤在哈希表中指定欄位的值
hmget key field [field ...] #獲取所有給定欄位的值
hgetall key #獲取在哈希表中指定key的所有欄位和值
hdel key field [field ...] #洗掉一個或多個哈希表欄位
hlen key #獲取哈希表中欄位的數量
hexists key feild #判斷哈希表key中指定的欄位是否存在
hkeys key #獲取所有哈希表中的欄位
hvals key #獲取哈希表中所有值
hincrby key field increment #為哈希表key中的指定欄位的整數值加上增量increment
hsetnx key field value #只有在欄位field不存在時,設定哈希表欄位的值
使用場景:
- 存盤物件
1.5、Zset(有序集合)
有序不重復集合
- 每個元素關聯一個double型別的分數score,通過此分數為集合中的成員進行從小到大的排序,
- 有序集合的成員是唯一的,但分數(score)卻可以重復、
- 集合是通過哈希表實作的,所以添加,洗掉,查找的復雜度都是 O(1)
- 集合中最大的成員數為 232 - 1 (4294967295, 每個集合可存盤40多億個成員),
zadd key [nx|xx] [ch] [incr] score member [score member ...]
zadd key score member [score member ...] #向有序集合添加一個或多個成員,或者更新已存在成員的分數
zrange key start stop [withscores] #通過索引區間回傳有序集合指定區間內的成員,可附帶分數
zrange key 0 -1 [withscores] #回傳所有的成員[及其分數]
zrevrange key start stop [withscores] #回傳有序集中指定區間內的成員,通過索引,分數從高到低
zrangebyscore key min max [withscores] [limit offset count] #通過分數回傳有序集合指定區間內的成員
zrevrangebyscore key max min [withscores] [limit offset count] #回傳有序集中指定分數區間內的成員,分數從高到低排序
# 示例
127.0.0.1:6379> zadd salary 2000 zsr 3000 gcc 5000 bareth
(integer) 3
127.0.0.1:6379> zrangebyscore salary -inf +inf
1) "zsr"
2) "gcc"
3) "bareth"
127.0.0.1:6379> zrangebyscore salary -inf +inf withscores
1) "zsr"
2) "2000"
3) "gcc"
4) "3000"
5) "bareth"
6) "5000"
127.0.0.1:6379> zrangebyscore salary -inf 4000 withscores
1) "zsr"
2) "2000"
3) "gcc"
4) "3000"
zrem key member [member ...] #移除有序集合中的一個或多個成員
zcard key #獲取有序集合的成員數
zcount key min max #獲取有序集合指定區間分數的成員數
使用場景:
- 排序:存盤班級成績,工資表排序
- 權重:普通訊息(1),重要訊息(2)
- 排行榜實作:top 10設定
二、三種特殊資料型別
2.1、geospatial(地理位置)
官方檔案:geoadd 命令 – Redis中國用戶組(CRUG)

使用場景:
- 朋友的定位
- 附近的人
- 打車距離計算
2.1.1、GEOADD
將指定的地理空間位置(經度、緯度、名稱)添加到指定的
key中GEOADD key longitude latitude member [longitude latitude member ...]
- 有效的經度從-180度到180度,
- 有效的緯度從-85.05112878度到85.05112878度,
當坐標位置超出上述指定范圍時,該命令將會回傳一個錯誤,
示例:
127.0.0.1:6379> geoadd china:city 116.23128 40.22077 beijing
(integer) 1
127.0.0.1:6379> geoadd china:city 114.02919 30.58203 wuhan
(integer) 1
127.0.0.1:6379> geoadd china:city 120.21201 30.2084 hangzhou
(integer) 1
127.0.0.1:6379> geoadd china:city 113.88308 22.55329 shenzhen
(integer) 1
127.0.0.1:6379> geoadd china:city 117.30794 31.79322 hefei
(integer) 1
2.1.2、GEOPOS
從
key里回傳所有給定位置元素的位置(經度和緯度)GEOPOS key member [member ...]
示例:
127.0.0.1:6379> geopos china:city beijing wuhan hangzhou shenzhen hefei
1) 1) "116.23128265142440796"
2) "40.22076905438526495"
2) 1) "114.02918905019760132"
2) "30.58203052674790712"
3) 1) "120.21200805902481079"
2) "30.20839995425554747"
4) 1) "113.88307839632034302"
2) "22.55329111565713873"
5) 1) "117.30793744325637817"
2) "31.79321915080526395"
2.1.3、GEODIST
回傳兩個給定位置之間的距離,
GEODIST key member1 member2 [unit]
- 如果兩個位置之間的其中一個不存在, 那么命令回傳空值,
- 指定單位的引數 unit 必須是以下單位的其中一個:
- m 表示單位為米
- km 表示單位為千米
- mi 表示單位為英里d
- ft 表示單位為英尺
- 如果用戶沒有顯式地指定單位引數, 那么
GEODIST默認使用米作為單位
示例:
127.0.0.1:6379> geodist china:city beijing wuhan km
"1090.4028"
2.1.4、GEORADIUS
以給定的經緯度為中心, 回傳鍵包含的位置元素當中, 與中心的距離不超過給定最大距離的所有位置元素,
GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]范圍可以使用以下其中一個單位:
- m 表示單位為米,
- km 表示單位為千米,
- mi 表示單位為英里,
- ft 表示單位為英尺,
在給定以下可選項時, 命令會回傳額外的資訊:
WITHDIST: 在回傳位置元素的同時, 將位置元素與中心之間的距離也一并回傳, 距離的單位和用戶給定的范圍單位保持一致,WITHCOORD: 將位置元素的經度和維度也一并回傳,WITHHASH: 以 52 位有符號整數的形式, 回傳位置元素經過原始 geohash 編碼的有序集合分值, 這個選項主要用于底層應用或者除錯, 實際中的作用并不大,命令默認回傳未排序的位置元素, 通過以下兩個引數, 用戶可以指定被回傳位置元素的排序方式:
ASC: 根據中心的位置, 按照從近到遠的方式回傳位置元素,DESC: 根據中心的位置, 按照從遠到近的方式回傳位置元素,在默認情況下, GEORADIUS 命令會回傳所有匹配的位置元素, 雖然用戶可以使用 COUNT
<count>選項去獲取前 N 個匹配元素, 但是因為命令在內部可能會需要對所有被匹配的元素進行處理, 所以在對一個非常大的區域進行搜索時, 即使只使用COUNT選項去獲取少量元素, 命令的執行速度也可能會非常慢, 但是從另一方面來說, 使用COUNT選項去減少需要回傳的元素數量, 對于減少帶寬來說仍然是非常有用的,
示例:
#查詢經緯度(110,30)附近1000km的城市
127.0.0.1:6379> georadius china:city 110 30 1000 km
1) "shenzhen"
2) "wuhan"
3) "hefei"
4) "hangzhou"
#查詢經緯度(110,30)附近500km的城市,并回傳城市與其的距離
127.0.0.1:6379> georadius china:city 110 30 500 km withdist
1) 1) "wuhan"
2) "392.3221"
#查詢經緯度(110,30)附近500km的城市,并回傳城市的經緯度
127.0.0.1:6379> georadius china:city 110 30 500 km withcoord
1) 1) "wuhan"
2) 1) "114.02918905019760132"
2) "30.58203052674790712"
#查詢經緯度(110,30)附近1000km的城市,并回傳城市的經緯度和城市與其的距離,限定回傳前兩個城市
127.0.0.1:6379> georadius china:city 110 30 1000 km withcoord withdist count 2
1) 1) "wuhan"
2) "392.3221"
3) 1) "114.02918905019760132"
2) "30.58203052674790712"
2) 1) "hefei"
2) "725.2703"
3) 1) "117.30793744325637817"
2) "31.79321915080526395"
2.1.5、GEORADIUSBYMEMBER
這個命令和
GEORADIUS命令一樣, 都可以找出位于指定范圍內的元素, 但是GEORADIUSBYMEMBER的中心點是由給定的位置元素決定的, 而不是像GEORADIUS那樣, 使用輸入的經度和緯度來決定中心點GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]
示例:
#查詢以北京為中心,方圓1000km內的城市,并附加與城市的距離以及城市的經緯度
127.0.0.1:6379> georadiusbymember china:city beijing 1000 km withcoord withdist
1) 1) "beijing"
2) "0.0000"
3) 1) "116.23128265142440796"
2) "40.22076905438526495"
2) 1) "hefei"
2) "942.3343"
3) 1) "117.30793744325637817"
2) "31.79321915080526395"
2.1.6、GEOHASH
該命令將回傳11個字符的Geohash字串
GEOHASH key member [member ...]
示例:
#將二維的經緯度轉換為一維的字串,兩個字串越像,距離越接近
127.0.0.1:6379> geohash china:city beijing wuhan
1) "wx4sucvncn0"
2) "wt3jfz390x0"
2.1.7、總結
GEO底層的原理就是Zset,我們可以使用Zset的命令來操作GEO
127.0.0.1:6379> zrange china:city 0 -1
1) "shenzhen"
2) "wuhan"
3) "hefei"
4) "hangzhou"
5) "beijing"
127.0.0.1:6379> zrem china:city beijing
(integer) 1
127.0.0.1:6379> zrange china:city 0 -1
1) "shenzhen"
2) "wuhan"
3) "hefei"
4) "hangzhou"
2.2、hyperloglog
2.2.1、簡介
什么是
基數?
資料集 {1, 3, 5, 7, 5, 7, 8},該資料集的基數集為 {1, 3, 5 ,7, 8},基數(不重復元素) = 5
hyperloglog簡介
Redis 在 2.8.9 版本添加了 HyperLogLog 結構,
-
Redis
HyperLogLog是用來做基數統計的演算法 -
基數估計就是在誤差可接受的范圍內,快速計算基數,
-
優點:在輸入元素的數量或者體積非常大時,計算基數所需的空間總是固定且很小的,每個 HyperLogLog 鍵只需要花費
12 KB記憶體,就可以計算接近2^64個不同元素的基數,這和計算基數時,元素越多耗費記憶體就越多的集合形成鮮明對比, -
缺點:有%0.81的錯誤率(統計UV資料時可忽略不計)
-
HyperLogLog只會根據輸入元素來計算基數,不會儲存輸入元素本身不能像集合那樣,回傳輸入的各個元素
2.2.2、應用場景
比如統計網頁的UV(一個人訪問多次但只算做一次)時
- 傳統的方式:set保存用戶的id,利用其不重復特性,統計set集合中的用戶數即可
缺點:我們的目的時計數,而不是保存用戶的id,此方法會保存大量用戶的id,占記憶體
2.2.3、命令
PFADD key element [element ...] #添加指定元素到HyperLogLog中
PFCOUNT key [key ...] #回傳給定HyperLogLog的基數估算值
PFMERGE destkey sourcekey [sourcekey ...] #將多個HyperLogLog合并為一個
2.2.4、示例
127.0.0.1:6379> pfadd c1 1 2 3 4 5 6 7 #創建c1集合{1,2,3,4,5,6,7}
(integer) 1
127.0.0.1:6379> pfadd c2 6 7 8 9 10 11 #創建c2集合{6,7,8,9,10,11}
(integer) 1
127.0.0.1:6379> pfcount c1 #統計c1集合的基數數量
(integer) 7
127.0.0.1:6379> pfcount c2 #統計c2集合的基數數量
(integer) 6
127.0.0.1:6379> pfmerge c3 c1 c2 #合并c1集合和c2集合成c3
OK
127.0.0.1:6379> pfcount c3 #統計合并后c3集合的基數
(integer) 11
2.2.5、總結
- 如果允許容錯,則一定使用Hyperloglog
- 如果不允許容錯,則使用set或者自己的資料型別
2.3、bitmaps
2.3.1、簡介
位存盤
常用場景:兩個狀態的,都可以使用 Bitmaps
- 統計用戶資訊:活躍,不活躍!
- 登錄、未登錄!
- 打卡,未打卡!
Bitmaps位圖,資料結構!都是操作二進制位來進行記錄,就只有0和1兩個狀態
2.3.2、示例
使用bitmaps來記錄周一到周日的打卡資訊
127.0.0.1:6379> setbit week 1 1 #設定week的位置1的值為1:代表周一打卡
(integer) 0
127.0.0.1:6379> setbit week 2 0 #設定week的位置2的值為0:代表周二未打卡
(integer) 0
127.0.0.1:6379> setbit week 3 1 #設定week的位置3的值為1:代表周三打卡
(integer) 0
127.0.0.1:6379> setbit week 4 1 #設定week的位置4的值為1:代表周四打卡
(integer) 0
127.0.0.1:6379> setbit week 5 0 #設定week的位置5的值為0:代表周五未打卡
(integer) 0
127.0.0.1:6379> setbit week 6 1 #設定week的位置6的值為1:代表周六打卡
(integer) 0
127.0.0.1:6379> setbit week 7 0 #設定week的位置7的值為0:代表周日未打卡
(integer) 0
查看某天是否打卡
127.0.0.1:6379> getbit week 3 #查看周三是否打卡
(integer) 1
127.0.0.1:6379> getbit week 7 #查看周日是否打卡
(integer) 0
統計打卡的天數(就是統計1的個數)
127.0.0.1:6379> bitcount week #統計一周的打卡天數
(integer) 4
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/282897.html
標籤:其他
