目錄
1、redis數據結構介紹
1.1命令學習方式
1.1.1命令行查詢
2、redis的通用命令
2.1查找常見的通用命令
2.2常見的通用命令:
3、String類型
3.1String類型的常見命令
3.2Key的層級格式
3.2.1Key的結構
4、Hash類型
4.1Hash類型
4.2Hash類型常見命令
5、List類型
5.1 List類型
5.2 List類型的常見命令
5.3List的用法
6、Set類型
6.1 Set類型
6.2Set的常見命令
6.2.1 對單個集合的操作命令
7、SortedSet類型
7.1 SortedSet類型
7.2 sortedset類型的常見命令
1、redis數據結構介紹
redis是一個key-value類型的數據庫,key一般是String類型。
但value的類型多種多樣:
前五種比較常見string、hash、list、set、sortedset
1.1命令學習方式
1.1.1命令行查詢
在redis中我們可以通過help來獲得命令提示

1.1.2官方文檔查詢方式
Commands | Docs
官網地址如上我們可以通過group進行命令篩選

2、redis的通用命令
通用命令是指部分數據類型都可以使用的命令
2.1查找常見的通用命令
fit by group選擇generic
2.2常見的通用命令:
-
keys:查看符合模板的所有key
通過help [command] 查看一個命令的具體用法

查詢所有的key

查詢所有以a開頭的key

keys命令支持通配符的使用,所以他在底層邏輯上是一個模糊查詢,而Redis又為單線程數據庫。所以不建議在生產環境設備上使用。
-
del:刪除某個key

刪除name鍵

批量刪除

-
EXISTS:判斷某個key是否存在

判斷name和age是否存在

-
EXPIRE:給某個key設置有效期,有效期到期時該key會被自動刪除

-
TTL:查看一個key的剩余有效期
我們可以通過TTL關鍵字去查看該鍵的剩余存活時間

當有效期變為-2時,表示該鍵被自動刪除(TTL為-1時表示該鍵永久有效)
3、String類型
String類型,即字符串類型,是Redis中最簡單的存儲類型
其value是字符串,但是字符串又可以分為三種:
-
string:普通字符串
-
int:整數類型,可以做自增自減操作
-
float:浮點類型,可以做自增自減操作
(不論那種類型,底層都是以字節數組形式存儲,只不過編碼方式不同。字節碼或者是直接轉為二進制。字符串類型的最大空間不能超過512M)
3.1String類型的常見命令
-
SET:添加一個鍵值對,或者是修改一個已經存在的鍵值對

-
GET:根據key獲取Sting類型的value

-
MSET:批量添加多個Sting類型的鍵值對

-
MGET:根據多個key獲取多個Sting類型的value

-
INCR:讓一個整型key自增1

-
INCRBY:讓一個整型的key自增并確定步長(自減設置步長為負數即可=DECR)

-
INCRBYFLOAT:讓一個浮點型的數字進行自增長,但必須指定步長

注意!!這里的score最好介于-128~128之間,否則incrbyfloat會發生位數異常

-
SETNX:添加一個sting類型的鍵值對,前提是這個key,不存在,否則不執行
已有——不再新增(分布式鎖的實現)

沒有——新增(setnx==set .... nx)

-
SETEX:添加一個sting類型的鍵值對,并且指定有效期
(setex==set key value ex seconds)

3.2Key的層級格式
redis中沒有table的概念,我們應該如何區分不同類型的key呢?
例如:需要儲存用戶、商品信息到redis中,有一個用戶id是1,有一個商品的id也恰好是1.
3.2.1Key的結構
Redis允許有多個單詞形成層級結構,多個單詞之間用 “:” 隔開,格式如下:
項目名:業務名:類型:id
tang:user:1
tang:product:1
格式并不固定,可根據自己的需求刪除或添加詞條
如果Value是一個java對象,則可以將對象序列化為JSON字符串后儲存
實踐一下,我們把這幾個鍵存一下

打開圖形化界面,我們可以看到 :

這樣就實現了key的分級存儲
4、Hash類型
4.1Hash類型
hash類型,也叫散列,其value就是一個無序字典,類似于java中的hashmap結構。
String結構是將對象序列化為JSON格式的字符串后儲存,需要修改某個對象的某個字段時很不方便,要不覆蓋,要不刪除重寫。
在hash結構中value部分變為了 字段:值 的結構

這樣就可以獨立表示某個字段,修改某一個字段時對其他字段沒有任何影響,十分靈活
4.2Hash類型常見命令
-
HSET key feild value:添加或修改hash類型key的field的值

打開圖形化界面工具

修改(沒有添加或刪除字段,返回值就是0)

-
HGET key feild:獲取hash類型key的field的值

-
HMSET:批量添加多個hash類型key的field的值


注意!!官方文檔上說明Redis4.0.0版本后hmset已經被棄用,可以用HSET直接代替HMSET


-
HMGET:批量獲取多個hash類型key的field的值

-
HGETALL:獲取一個hash類型的key的所有field和value的值
可以理解為java中HashMap.entrySet

-
HKEYS:獲取一個hash類型的key的所有field
可以理解為java中HashMap.keySet

-
HVALS:獲取一個hash類型的key的所有values
可以理解為java中HashMap.keyValues

-
HINCRBY:讓一個hash類型的key的字段值自增長并確定步長

步長確定為負數就是負增長

-
HSETNX:添加一個hash類型的key的field的值,前提是這個field不存在,否則不添加
添加失敗,因為4已經有這個field了

5、List類型
5.1 List類型
Redis中的List類型與Java中的LinkedList類似,可以看作是一個雙向鏈表結構。既可以支持正向檢索也可以支持反向檢索。
有序
元素可以重復
插入和刪除速度快
查詢速度一般(逐個遍歷去查詢)
List類型常用來存儲一個有序數據,例如:朋友圈點贊列表,評論列表等。
5.2 List類型的常見命令
-
LPUSH key element...:向列表左側插入一個或多個元素
L,R可以理解為隊首隊尾的區別

打開圖形化界面,我們觀察到,最先放入的在最下方(有點類似于棧的樣子,但他是隊列,上下都能取)

-
LPOP key:移除并返回列表左側被移除的某幾個元素,沒有則返回nil
(3 2 1 1 2 3)


當list中沒有元素時,返回nil

-
RPUSH key element...:向列表右側插入一個或多個元素

與LPOP相反的,RPOP從下往上插入

-
RPOP key:移除并返回列表右側被移除的某幾個元素,沒有則返回nil

取到4

取到之后移除

-
LRANGE key star end:返回一段角標范圍內的所有元素
目前庫的樣子

開始編號為0

-
BLPOP和BRPOP:與LPOP和RPOP類似,只不過在沒有元素時指定等待時間,而不是返回nil
B代表阻塞Block,我們來實操一下這個阻塞的過程:
在這里我們開兩個窗口

由于沒有users2這個key,所以這個窗口會被阻塞在這個位置

我們在另一個對話框,向users2中放入元素

回到剛剛阻塞的窗口,我們發現他取到了,并且報告了用時

5.3List的用法
1)如何利用List結構去模擬一個棧?
棧:先進后出——入口出口在同一邊
LPUSH+LPOP
RPUSH+RPOP
2)如何利用List結構去模擬一個隊列?
隊列:先進先出——入口出口不在同一邊
LPUSH+RPOP
RPUSH+LPOP
3)如何利用List結構去模擬一個阻塞隊列?
入口出口不在同一邊+實現阻塞
LPUSH+BRPOP
RPUSH+BLPOP
6、Set類型
6.1 Set類型
Redis的Set結構和Java中的HashSet相似,可以看作是一個值為null的HashMap。因為也是一個Hash表,因此也具備以下特征:
無序
元素不可重復
查找快
支持交集,并集,差集
6.2Set的常見命令
6.2.1 對單個集合的操作命令
-
SADD key member ..:向set中添加一個或多個元素。


-
SREM key member ...:移除set中的指定元素

-
SCARD key:返回set中的元素個數
CARD(cardinal)

-
SISMEMBER key member:判斷一個元素是否在set中

-
SMEMBERS:獲取set中所有元素
我們會發現所得順序和我們存入的數據順序并不一致,這是因為set類型無序的特點

6.2.2對多個集合的操作命令
-
SINTER key1 key2 ...:求key1 key2的交集(共同好友)
-
SDIFF key1 key2 ...:求key1 key2的差集
key1 SDIFF key2
-
SUNION key1 key2 ...:求key1 key2的并集
注意重復元素只能出現一次

1)新建key:zs ls

2)計算張三的好友數量

3)計算張三和李四的共同好友

4)查詢是張三的好友但不是李四的好友

5)張三和李四一共有哪些好友

6)判斷李四是否是張三的好友

7)判斷張三是否是李四的好友

8)將李四從張三好友列表中移除

7、SortedSet類型
7.1 SortedSet類型
redis的sortedset類型是一個可排序的Set集合,與Java中的TreeSet有一些相似,但底層的數據結構差別很大。SortedSet中的每個元素都帶有一個score屬性,可以基于score屬性對元素進行排序,底層的實現是一個跳表加hash表。
可排序
元素不重復
查詢速度快
經常被用作實現排行榜這樣的功能
7.2 sortedset類型的常見命令
這些排序默認是升序,如果想要降序則在需要的命令的Z的后面添加REV即可。
-
ZADD key score member:添加一個或多個元素到sortedset,如果已經存在進行更新
-
ZREM key member:刪除sortedset中的一個指定元素
-
ZSCORE key member:獲取sortedset中的一個指定元素的score值
-
ZRANK key member:獲取sortedset中指定元素的排名
-
ZCARD key:獲取sortedset中的元素個數
-
ZCOUNT key min max:統計score值在給定范圍內的所有元素個數
-
ZINCRBY key increment member:讓sortedset中的指定元素自增,步長為指定的increment值
-
ZRANGE key min max:按照score排序后,獲取指定排名范圍內的元素(max包括在內)
-
ZRANGEBYSCORE key min max:按照score排序后,獲取指定score范圍內的元素
-
ZDIFF\ZINTER\ZUNION:求差集、交集、并集

1)將學生信息添加數據庫

2)刪除Tom同學

3)獲取Amy同學的分數

3)獲取Rose同學的排名

排名編號從0開始

4)查詢80分以下的同學數量

5)給Amy同學加2分

6)查出成績前三名的同學

7)返回80分以下的所有同學信息
