目錄
1、Redis數據結構
2、命令簡介
2.1、通用命令
DEL
EXISTS
EXPIRE
2.2、String命令
SET和GET
MSET和MGET
INCR和INCRBY和DECY
SETNX
SETEX
2.3、Key的層級結構
2.4、Hash命令
HSET和HGET
HMSET和HMGET
HGETALL
HKEYS和HVALS
HINCRBY
HSETNX
2.5、List命令
LPUSH和RPUSH
LPOP和RPOP
LRANGE
2.6、Set命令
2.7、SortedSet類型
1、Redis數據結構
Redis是一個key-value的數據庫,key一般是String類型,不過value的類型多種多樣:
貼心小建議:命令不要死記,學會查詢就好啦
Redis為了方便我們學習,將操作不同數據類型的命令也做了分組,在官網( https://redis.io/commands?)可以查看到不同的命令:
不同類型的命令稱為一個group,我們也可以通過help命令來查看各種不同group的命令:
2、命令簡介
2.1、通用命令
通用指令是部分數據類型的,都可以使用的指令,常見的有:
- KEYS:查看符合模板的所有key
- DEL:刪除一個指定的key
- EXISTS:判斷key是否存在
- EXPIRE:給一個key設置有效期,有效期到期時該key會被自動刪除
- TTL:查看一個KEY的剩余有效期
通過help [command] 可以查看一個命令的具體用法,例如:
127.0.0.1:6379> keys *1) "\"unique_visitor_count\""2) "sys_config:sys.index.skinName"3) "sys_dict:sys_common_status"4) "sys_dict:sys_normal_disable"5) "sys_config:sys.login.blackIPList"# 查詢以a開頭的key
127.0.0.1:6379> keys a*
1) "age"
小提示:在生產環境下,不推薦使用keys 命令,因為這個命令在key過多的情況下,效率不高
DEL
127.0.0.1:6379> help delDEL key [key ...]summary: Delete a keysince: 1.0.0group: generic127.0.0.1:6379> del name #刪除單個
(integer) 1 #成功刪除1個127.0.0.1:6379> keys *
1) "age"127.0.0.1:6379> MSET k1 v1 k2 v2 k3 v3 #批量添加數據
OK127.0.0.1:6379> keys *
1) "k3"
2) "k2"
3) "k1"
4) "age"127.0.0.1:6379> del k1 k2 k3 k4
(integer) 3 #此處返回的是成功刪除的key,由于redis中只有k1,k2,k3 所以只成功刪除3個,最終返回
127.0.0.1:6379>127.0.0.1:6379> keys * #再查詢全部的key
1) "age" #只剩下一個了
127.0.0.1:6379>
EXISTS
127.0.0.1:6379> help EXISTSEXISTS key [key ...]summary: Determine if a key existssince: 1.0.0group: generic127.0.0.1:6379> exists age
(integer) 1127.0.0.1:6379> exists name
(integer) 0
EXPIRE
127.0.0.1:6379> expire age 10
(integer) 1127.0.0.1:6379> ttl age
(integer) 8127.0.0.1:6379> ttl age
(integer) 6127.0.0.1:6379> ttl age
(integer) -2127.0.0.1:6379> ttl age
(integer) -2 #當這個key過期了,那么此時查詢出來就是-2 127.0.0.1:6379> keys *
(empty list or set)127.0.0.1:6379> set age 10 #如果沒有設置過期時間
OK127.0.0.1:6379> ttl age
(integer) -1 # ttl的返回值就是-1
2.2、String命令
String類型,也就是字符串類型,是Redis中最簡單的存儲類型。
Redis Strings存儲字節序列,包括文本、序列化對象和二進制數組。因此,字符串是最基本的 Redis 數據類型。它們通常用于緩存,但它們支持額外的功能,讓您也可以實現計數器并執行按位操作。
其value是字符串,不過根據字符串的格式不同,又可以分為3類:
string:
普通字符串int:
整數類型,可以做自增.自減操作float:
浮點類型,可以做自增.自減操作
String的常見命令有:
- SET:添加或者修改已經存在的一個String類型的鍵值對
- GET:根據key獲取String類型的value
- MSET:批量添加多個String類型的鍵值對
- MGET:根據多個key獲取多個String類型的value
- INCR:讓一個整型的key自增1
- INCRBY:讓一個整型的key自增并指定步長,例如:incrby num 2 讓num值自增2
- INCRBYFLOAT:讓一個浮點類型的數字自增并指定步長
- SETNX:添加一個String類型的鍵值對,前提是這個key不存在,否則不執行
- SETEX:添加一個String類型的鍵值對,并且指定有效期
注意: 默認情況下,單個 Redis 字符串最大為 512 MB。
案例:
SET和GET
小提示:
如果key不存在則是新增,如果存在則是修改
127.0.0.1:6379> set name Rose //原來不存在
OK127.0.0.1:6379> get name
"Rose"127.0.0.1:6379> set name Jack //原來存在,就是修改
OK127.0.0.1:6379> get name
"Jack"
MSET和MGET
127.0.0.1:6379> MSET k1 v1 k2 v2 k3 v3
OK127.0.0.1:6379> MGET name age k1 k2 k3
1) "Jack" //之前存在的name
2) "10" //之前存在的age
3) "v1"
4) "v2"
5) "v3"
INCR和INCRBY和DECY
127.0.0.1:6379> get age
"10"127.0.0.1:6379> incr age //增加1
(integer) 11127.0.0.1:6379> get age //獲得age
"11"127.0.0.1:6379> incrby age 2 //一次增加2
(integer) 13 //返回目前的age的值127.0.0.1:6379> incrby age 2
(integer) 15127.0.0.1:6379> incrby age -1 //也可以增加負數,相當于減
(integer) 14127.0.0.1:6379> incrby age -2 //一次減少2個
(integer) 12127.0.0.1:6379> DECR age //相當于 incr 負數,減少正常用法
(integer) 11127.0.0.1:6379> get age
"11"
SETNX
127.0.0.1:6379> help setnxSETNX key valuesummary: Set the value of a key, only if the key does not existsince: 1.0.0group: string127.0.0.1:6379> set name Jack //設置名稱
OK
127.0.0.1:6379> setnx name lisi //如果key不存在,則添加成功
(integer) 0
127.0.0.1:6379> get name //由于name已經存在,所以lisi的操作失敗
"Jack"
127.0.0.1:6379> setnx name2 lisi //name2 不存在,所以操作成功
(integer) 1
127.0.0.1:6379> get name2
"lisi"
SETEX
127.0.0.1:6379> setex name 10 jack
OK127.0.0.1:6379> ttl name
(integer) 8127.0.0.1:6379> ttl name
(integer) 7127.0.0.1:6379> ttl name
(integer) 5
2.3、Key的層級結構
Redis沒有類似MySQL中的Table的概念,我們該如何區分不同類型的key呢?
例如,需要存儲用戶、商品信息到redis,有一個用戶id是1,有一個商品id恰好也是1,此時如果使用id作為key,那就會沖突了,該怎么辦?
我們可以通過給key添加前綴加以區分,不過這個前綴不是隨便加的,有一定的規范:
Redis的key允許有多個單詞形成層級結構,多個單詞之間用':'隔開,格式如下:
項目名:業務名:類型:id
這個格式并非固定,也可以根據自己的需求來刪除或添加詞條。這樣以來,我們就可以把不同類型的數據區分開了。從而避免了key的沖突問題。
例如我們的項目名稱叫 gcxy,有user和product兩種不同類型的數據,我們可以這樣定義key:
- user相關的key:gcxy:user:1
- product相關的key:gcxy:product:1
如果Value是一個Java對象,例如一個User對象,則可以將對象序列化為JSON字符串后存儲:
KEY | VALUE |
gcxy:user:1 | {"id":1, "name": "Jack", "age": 21} |
gcxy:product:1 | {"id":1, "name": "小米11", "price": 4999} |
一旦我們向redis采用這樣的方式存儲,那么在可視化界面中,redis會以層級結構來進行存儲,形成類似于這樣的結構,更加方便Redis獲取數據
2.4、Hash命令
Redis Hash是結構為字段值對集合的記錄類型。可以使用散列來表示基本對象并存儲計數器分組等。
Hash類型,也叫散列,其value是一個無序字典,類似于Java中的HashMap結構。
String結構是將對象序列化為JSON字符串后存儲,當需要修改對象某個字段時很不方便:
Hash結構可以將對象中的每個字段獨立存儲,可以針對單個字段做CRUD:
Hash類型的常見命令
- HSET key field value:添加或者修改hash類型key的field的值
- HGET key field:獲取一個hash類型key的field的值
- HMSET:批量添加多個hash類型key的field的值
- HMGET:批量獲取多個hash類型key的field的值
- HGETALL:獲取一個hash類型的key中的所有的field和value
- HKEYS:獲取一個hash類型的key中的所有的field
- HINCRBY:讓一個hash類型key的字段值自增并指定步長
- HSETNX:添加一個hash類型的key的field值,前提是這個field不存在,否則不執行
案例:
HSET和HGET
127.0.0.1:6379> HSET gcxy:user:3 name Lucy//大key是 gcxy:user:3 小key是name,小value是Lucy
(integer) 1
127.0.0.1:6379> HSET gcxy:user:3 age 21// 如果操作不存在的數據,則是新增
(integer) 1
127.0.0.1:6379> HSET gcxy:user:3 age 17 //如果操作存在的數據,則是修改
(integer) 0
127.0.0.1:6379> HGET gcxy:user:3 name
"Lucy"
127.0.0.1:6379> HGET gcxy:user:3 age
"17"
HMSET和HMGET
127.0.0.1:6379> HMSET gcxy:user:4 name ZhangSan
OK
127.0.0.1:6379> HMSET gcxy:user:4 name LiSi age 20 sex man
OK
127.0.0.1:6379> HMGET gcxy:user:4 name age sex
1) "LiSi"
2) "20"
3) "man"
HGETALL
127.0.0.1:6379> HGETALL gcxy:user:4
1) "name"
2) "LiSi"
3) "age"
4) "20"
5) "sex"
6) "man"
HKEYS和HVALS
127.0.0.1:6379> HKEYS gcxy:user:4
1) "name"
2) "age"
3) "sex"
127.0.0.1:6379> HVALS gcxy:user:4
1) "LiSi"
2) "20"
3) "man"
HINCRBY
127.0.0.1:6379> HINCRBY gcxy:user:4 age 2
(integer) 22
127.0.0.1:6379> HVALS gcxy:user:4
1) "LiSi"
2) "22"
3) "man"
127.0.0.1:6379> HINCRBY gcxy:user:4 age -2
(integer) 20
HSETNX
127.0.0.1:6379> HSETNX gcxy:user4 sex woman
(integer) 1
127.0.0.1:6379> HGETALL gcxy:user:3
1) "name"
2) "Lucy"
3) "age"
4) "17"
127.0.0.1:6379> HSETNX gcxy:user:3 sex woman
(integer) 1
127.0.0.1:6379> HGETALL gcxy:user:3
1) "name"
2) "Lucy"
3) "age"
4) "17"
5) "sex"
6) "woman"
2.5、List命令
Redis中的List類型與Java中的LinkedList類似,可以看做是一個雙向鏈表結構。既可以支持正向檢索和也可以支持反向檢索。
特征也與LinkedList類似:
- 有序
- 元素可以重復
- 插入和刪除快
- 查詢速度一般
常用來存儲一個有序數據,例如:朋友圈點贊列表,評論列表等。
List的常見命令有:
- LPUSH key element ... :向列表左側插入一個或多個元素
- LPOP key:移除并返回列表左側的第一個元素,沒有則返回nil
- RPUSH key element ... :向列表右側插入一個或多個元素
- RPOP key:移除并返回列表右側的第一個元素
- LRANGE key star end:返回一段角標范圍內的所有元素
- BLPOP和BRPOP:與LPOP和RPOP類似,只不過在沒有元素時等待指定時間,而不是直接返回nil
LPUSH和RPUSH
127.0.0.1:6379> LPUSH users 1 2 3
(integer) 3
127.0.0.1:6379> RPUSH users 4 5 6
(integer) 6
LPOP和RPOP
127.0.0.1:6379> LPOP users
"3"
127.0.0.1:6379> RPOP users
"6"
LRANGE
127.0.0.1:6379> LRANGE users 1 2
1) "1"
2) "4"
2.6、Set命令
Redis的Set結構與Java中的HashSet類似,可以看做是一個value為null的HashMap。因為也是一個hash表,因此具備與HashSet類似的特征:
- 無序
- 元素不可重復
- 查找快
- 支持交集、并集、差集等功能
Set的常見命令有:
- SADD key member ... :向set中添加一個或多個元素
- SREM key member ... : 移除set中的指定元素
- SCARD key: 返回set中元素的個數
- SISMEMBER key member:判斷一個元素是否存在于set中
- SMEMBERS:獲取set中的所有元素
- SINTER key1 key2 ... :求key1與key2的交集
例如兩個集合:s1和s2:
求交集:SINTER s1 s2
求s1與s2的不同:SDIFF s1 s2
具體命令
127.0.0.1:6379> sadd s1 a b c
(integer) 3
127.0.0.1:6379> smembers s1
1) "c"
2) "b"
3) "a"
127.0.0.1:6379> srem s1 a
(integer) 1127.0.0.1:6379> SISMEMBER s1 a
(integer) 0127.0.0.1:6379> SISMEMBER s1 b
(integer) 1127.0.0.1:6379> SCARD s1
(integer) 2
案例:
- 將下列數據用Redis的Set集合來存儲:
- 張三的愛好:看書.睡覺.吃飯.打麻將
- 李四的愛好:打麻將.爬山.打籃球
- 利用Set的命令實現下列功能:
- 計算張三的愛好有幾個
- 計算張三和李四有哪些共同愛好
- 查詢哪些人是張三的愛好卻不是李四的愛好
- 查詢張三和李四的愛好總共有哪些
- 判斷看書是否是張三的愛好
- 判斷吃飯是否是李四的愛好
- 將打麻將從張三的愛好列表中移除
127.0.0.1:6379> SADD zs kanshu shuijiao chifan damajiang
(integer) 4127.0.0.1:6379> SADD ls damajiang pashan dalanqiu
(integer) 3127.0.0.1:6379> SCARD zs
(integer) 4127.0.0.1:6379> SINTER zs ls
1) "damajiang"127.0.0.1:6379> SDIFF zs ls
1) "kanshu"
2) "shuijiao"
3) "chifan"127.0.0.1:6379> SUNION zs ls
1) "kanshu"
2) "shuijiao"
3) "chifan"
4) "damajiang"
5) "pashan"
6) "dalanqiu"127.0.0.1:6379> SISMEMBER zs kanshu
(integer) 1127.0.0.1:6379> SISMEMBER ls chifan
(integer) 0127.0.0.1:6379> SREM zs damajiang
(integer) 1127.0.0.1:6379> SMEMBERS zs
1) "kanshu"
2) "shuijiao"
3) "chifan"
2.7、SortedSet類型
Redis的SortedSet是一個可排序的set集合,與Java中的TreeSet有些類似,但底層數據結構卻差別很大。SortedSet中的每一個元素都帶有一個score屬性,可以基于score屬性對元素排序,底層的實現是一個跳表(SkipList)加 hash表。
SortedSet具備下列特性:
- 可排序
- 元素不重復
- 查詢速度快
因為SortedSet的可排序特性,經常被用來實現排行榜這樣的功能。
SortedSet的常見命令有:
- ZADD key score member:添加一個或多個元素到sorted set ,如果已經存在則更新其score值
- ZREM key member:刪除sorted set中的一個指定元素
- ZSCORE key member : 獲取sorted set中的指定元素的score值
- ZRANK key member:獲取sorted set 中的指定元素的排名
- ZCARD key:獲取sorted set中的元素個數
- ZCOUNT key min max:統計score值在給定范圍內的所有元素的個數
- ZINCRBY key increment member:讓sorted set中的指定元素自增,步長為指定的increment值
- ZRANGE key min max:按照score排序后,獲取指定排名范圍內的元素
- ZRANGEBYSCORE key min max:按照score排序后,獲取指定score范圍內的元素
- ZDIFF.ZINTER.ZUNION:求差集.交集.并集
注意:所有的排名默認都是升序,如果要降序則在命令的Z后面添加REV即可,例如:
- 升序獲取sorted set 中的指定元素的排名:ZRANK key member
- 降序獲取sorted set 中的指定元素的排名:ZREVRANK key memeber
感興趣的小伙伴可以點個關注!后續將推出springboot整合redis,謝謝~