Redis命令
1.Redis資料結構介紹
Redis是一個key-value的資料庫,key一般是String型別,value的型別多種多樣,value常見的八種型別:
Redis支持五種基本的資料型別:string(字串),hash(哈希),list(串列),set(集合)及zset(sorted set,有序集合),
- 各個資料型別應用場景:
| 型別 | 簡介 | 特性 | 場景 |
|---|---|---|---|
| String(字串) | 二進制安全 | 可以包含任何資料,比如jpg圖片或者序列化的物件,一個鍵最大能存盤512M | --- |
| Hash(字典) | 鍵值對集合,即編程語言中的Map型別 | 適合存盤物件,并且可以像資料庫中update一個屬性一樣只修改某一項屬性值(Memcached中需要取出整個字串反序列化成物件修改完再序列化存回去) | 存盤、讀取、修改用戶屬性 |
| List(串列) | 鏈表(雙向鏈表) | 增刪快,提供了操作某一段元素的API | 1,最新訊息排行等功能(比如朋友圈的時間線) 2,訊息佇列 |
| Set(集合) | 哈希表實作,元素不重復 | 1、添加、洗掉,查找的復雜度都是O(1) 2、為集合提供了求交集、并集、差集等操作 | 1、共同好友 2、利用唯一性,統計訪問網站的所有獨立ip 3、好友推薦時,根據tag求交集,大于某個閾值就可以推薦 |
| Sorted Set(有序集合) | 將Set中的元素增加一個權重引數score,元素按score有序排列 | 資料插入集合時,已經進行天然排序 | 1、排行榜 2、帶權重的訊息佇列 |
不同的資料型別的操作會對應不同的命令,Redis為了方便我們學習,將操作不同資料型別的命令做了不同分組分組,在官網可以查看,也可以通過命令列查看:
2.Redis通用命令
通用指令是部分資料型別都可以使用的指令,常見的可以通過官方檔案選擇Generic分組查看:
或者使用命令列查看:help @generic
127.0.0.1:6379> help @generic
DEL key [key ...]
summary: Delete a key
since: 1.0.0
DUMP key
summary: Return a serialized version of the value stored at the specified key.
since: 2.6.0
EXISTS key [key ...]
summary: Determine if a key exists
since: 1.0.0
....
這里介紹一些常見的通用命令:
-
keys在本庫中,查看符合輸入模板的所有key的值:(不建議在生產環境上使用)#命令解釋 127.0.0.1:6379> help keys #通過help [command] 可以查看一個命令的具體用法 KEYS pattern summary: Find all keys matching the given pattern since: 1.0.0 group: generic #例子 127.0.0.1:6379> keys * 1) "marry" 2) "jack" 127.0.0.1:6379> keys j* 1) "jack" -
del洗掉一個或者多個key#命令解釋 127.0.0.1:6379> help del DEL key [key ...] summary: Delete a key since: 1.0.0 group: generic #例子 127.0.0.1:6379> keys * 1) "foo" 2) "marry" 3) "jack" 4) "tom" 127.0.0.1:6379> del tom marry #一次可以洗掉多個key,回傳的值是洗掉key的數量 (integer) 2 127.0.0.1:6379> keys * 1) "foo" 2) "jack" -
exists判斷一個或多個key是否存在#命令解釋 127.0.0.1:6379> help exists EXISTS key [key ...] summary: Determine if a key exists since: 1.0.0 group: generic #例子 127.0.0.1:6379> exists jack foo tom mary #回傳值是查詢的key存在的個數 (integer) 2 -
expire給一個key設定有效期,到期時該key自動洗掉#命令解釋 127.0.0.1:6379> help expire EXPIRE key seconds summary: Set a key's time to live in seconds since: 1.0.0 group: generic #例子 127.0.0.1:6379> expire k1 5 #設定k1的過期時間為5秒 (integer) 1 127.0.0.1:6379> get k1 #5秒后查看,發現已經給被洗掉了 (nil) -
ttl查看一個key的剩余有效期#命令解釋 127.0.0.1:6379> help ttl TTL key summary: Get the time to live for a key since: 1.0.0 group: generic #例子 127.0.0.1:6379> ttl foo (integer) -1 #-1 代表該key為永久有效 127.0.0.1:6379> expire foo 5 (integer) 1 127.0.0.1:6379> ttl foo (integer) 2 #其他數字代表該key剩余時間(秒) 127.0.0.1:6379> ttl foo (integer) -2 #-2 代表該key已經過期
3.String型別
string 是 redis 最基本的型別,你可以理解成與 Memcached 一模一樣的型別,一個 key 對應一個 value,string 型別是二進制安全的,意思是 redis 的 string 可以包含任何資料,比如jpg圖片或者序列化的物件,string 型別是 Redis 最基本的資料型別,string 型別的值最大能存盤 512MB,
根據字串的格式不同,又可以分為3類:
-
String:普通字串
-
int:整數型別,可以做自增、自減操作
-
float:浮點型別,可以做自增、自減操作
不管是哪種格式,底層都是位元組陣列形式存盤,只不過是編碼形式不同
- String型別常見命令
- set 添加或者修改已經存在的一個String型別的鍵值對
- get 根據key獲取String型別的value
- mset 批量添加多個String型別的鍵值對
- mget 根據多個key獲取多個String型別的value
- incr 讓一個整型的value自增1
- incrby 讓一個整型的value自增并指定步長,例如 incrby num 2 #讓key為num對應的value自增2
- incrbyfloat 讓一個浮點型別的數字自增并指定步長
- setnx 添加一個String型別的鍵值對,前提是這個key不存在,否則不執行
- setex 添加一個String型別的鍵值對,并且指定有效期
3.1key的層級格式
Redis沒有類似MySQL的Table的概念,我們該如何區分不同型別的key呢?例如,需要存盤用戶、商品資訊到redis,有一個用戶id為1,有一個商品的id也恰好是1,
Redis的key允許有多個單詞形成層級結構,多個單詞之間用:隔開,例如:專案名:業務名:型別:id,由此我們可以根據層級關系來解決上面的問題:
user相關的key:專案名:user:1
product相關的key:專案名:product:1
如果value是一個Java物件,例如一個User物件,則可以將物件序列化為JSON字串后存盤,例如:
127.0.0.1:6379> set olien:user:1 '{"id":1, "name":"Jack", "age": 21}'
OK
127.0.0.1:6379> set olien:user:2 '{"id":2, "name":"Rose", "age": 18}'
OK
127.0.0.1:6379> set olien:product:1 '{"id":1, "name":"小米11", "price": 4999}'
OK
127.0.0.1:6379> set olien:product:2 '{"id":2, "name":"榮耀6", "price": 2999}'
OK
127.0.0.1:6379> keys olien*
1) "olien:product:1"
2) "olien:product:2"
3) "olien:user:1"
4) "olien:user:2"
127.0.0.1:6379>
我們在可視化軟體查看,可以看到使用冒號隔開時,資料自然形成了不同的層級結構,這就可以避免id相同時的沖突,實作分層存盤,
4.Hash型別
Hash 型別,也叫散列,其 value 是一個無需字典,類似 Java 中的 hashmap 結構,
Redis hash 是一個鍵值(key=>value)對集合,Redis hash 是一個 string 型別的 field 和 value 的映射表,hash 特別適合用于存盤物件,每個 hash 可以存盤 2^32 -1 鍵值對(40多億),
String結構是將物件序列化為json字串后存盤,但當需要修改物件的某個欄位時很不方便:
而Hash結構可以將物件中的每個欄位獨立存盤,可以針對單個欄位做CRUD操作:
-
Hash常見的命令
這里的哈希表指的是一個hash型別(key-value[field-value])
-
HSET key field value[field2 value2...]將哈希表 key 中的欄位 field 的值設為 value127.0.0.1:6379> HSET lucy id 2 age 10 (integer) 2 -
HGET key field獲取存盤在哈希表中指定欄位的值 -
HDEL key field [field2...]洗掉一個或者多個哈希表key的欄位127.0.0.1:6379> HDEL lucy addr age (integer) 2 -
HMSET key field1 [field2...]同時將多個field-value(域-值)對設定到哈希表key中127.0.0.1:6379> hmset lucy name lucy id 5 age 18 OK -
HMGET key field1 [field2...]獲哈希表中給定欄位的值127.0.0.1:6379> HMGET lucy id age name 1) "5" 2) "18" 3) "lucy" -
HGETALL key獲取一個hash型別的key中的所有field和所有value127.0.0.1:6379> HGETALL lucy 1) "name" 2) "lucy" 3) "id" 4) "5" 5) "age" 6) "18" -
HKEYS key獲取哈希表key中的所有field127.0.0.1:6379> hkeys lucy 1) "name" 2) "id" 3) "age" -
HLEN key獲取哈希表key中所有欄位的數量127.0.0.1:6379> HLEN lucy (integer) 4 -
HVALS key獲取哈希表key中的所有value127.0.0.1:6379> hvals lucy 1) "lucy" 2) "5" 3) "18" -
HINCRBY key field increment為哈希表key中的指定欄位的整數值加上增量increment127.0.0.1:6379> HINCRBY lucy age 100 (integer) 118 -
HINCRBYFLOAT key field increment為哈希表key中的指定欄位的浮點數值加上增量increment127.0.0.1:6379> HINCRBYFLOAT lucy score 30 "90" -
HSETNX key field value只有在欄位不存在時,設定哈希表key中欄位的值127.0.0.1:6379> HSETNX lucy age 10086 (integer) 0 127.0.0.1:6379> HSETNX lucy addr beijing (integer) 1 -
HEXISTS key field查看哈希表key中,指定的欄位是否存在127.0.0.1:6379> HEXISTS lucy age #回傳值1表示存在,0表示不存在 (integer) 1 127.0.0.1:6379> HEXISTS lucy foo (integer) 0 -
HSCAN key cursor [MATCH pattern] [COUNT count]迭代哈希表中的鍵值對
-
5.List型別
List 是簡單的字串串列,按照插入順序排序,你可以添加一個元素到串列的頭部(左邊)或者尾部(右邊),一個串列最多可以包含 2^32 - 1 個元素 (4294967295, 每個串列超過40億個元素),
Redis 的 List型別與 Java 的LinkedList 類似,可以看做是一個雙向鏈表結構,可以同時支持正向檢索和反向檢索,
特征也和 LinkedList 類似:
- 有序
- 元素可以重復
- 插入和洗掉速度快
- 查詢速度一般
常用來存盤一個有序資料,例如朋友圈點贊串列,評論串列等,
下表列出了串列相關的基本命令:
命令首字符:R代表串列右側(Right),L代表串列左側(Left)
| 命令及描述 |
|---|
| BLPOP key1 [key2 ] timeout 移出并獲取串列的第一個元素, 如果串列沒有元素會阻塞串列直到等待超時或發現可彈出元素為止, |
| BRPOP key1 [key2] timeout 移出并獲取串列的最后一個元素, 如果串列沒有元素會阻塞串列直到等待超時或發現可彈出元素為止, |
| BRPOPLPUSH source destination timeout 從串列中彈出一個值,將彈出的元素插入到另外一個串列中并回傳它; 如果串列沒有元素會阻塞串列直到等待超時或發現可彈出元素為止, |
| LINDEX key index 通過索引獲取串列中的元素 |
| LINSERT key BEFORE|AFTER pivot value 在串列的元素前或者后插入元素 |
| LLEN key 獲取串列長度 |
| LPOP key 移出并獲取串列的第一個元素 |
| LPUSH key value1 [value2] 將一個或多個值插入到串列頭部 |
| LPUSHX key value 將一個值插入到已存在的串列頭部 |
| LRANGE key start stop 獲取串列指定范圍內的元素 |
| LREM key count value 移除串列元素 |
| LSET key index value 通過索引設定串列元素的值 |
| LTRIM key start stop 對一個串列進行修剪(trim),就是說,讓串列只保留指定區間內的元素,不在指定區間之內的元素都將被洗掉, |
| RPOP key 移除串列的最后一個元素,回傳值為移除的元素, |
| RPOPLPUSH source destination 移除串列的最后一個元素,并將該元素添加到另一個串列并回傳 |
| RPUSH key value1 [value2] 在串列中添加一個或多個值到串列尾部 |
| RPUSHX key value 為已存在的串列添加值 |
- 思考:使用List型別模擬 堆疊 / 佇列 / 阻塞佇列
根據上面的命令,我們就可以使用List型別模擬堆疊、佇列、阻塞佇列:
-
模擬堆疊:只需要入口和出口在同一邊
-
模擬佇列:入口和出口在不同邊
-
模擬阻塞佇列:入口和出口在不同邊,出隊時采用 BLPOP 或 BRPOP
6.Set型別
Redis 的 Set 是 string 型別的無序集合,集合是通過哈希表實作的,所以添加,洗掉,查找的復雜度都是 O(1)
注意:如果在無序集合中的同一個元素被添加了兩次,根據集合內元素的唯一性,第二次插入的元素將被忽略,集合中最大的成員數為 2^32 - 1(4294967295, 每個集合可存盤40多億個成員),
Redis 的 Set 結構與 Java 中的 HashSet 類似,可以看做是一個 value為 null 的 HashMap,因為也是一個哈希表,因此具備與 HashSet 類似的特征:
- 無序
- 元素不可重復
- 查找快
- 支持交集、并集、差集等功能
下表列出了 Redis 集合基本命令:
| 序號 | 命令及描述 |
|---|---|
| 1 | SADD key member1 [member2] 向集合添加一個或多個成員 |
| 2 | SCARD key 獲取集合的成員數 |
| 3 | SDIFF key1 [key2] 回傳第一個集合與其他集合之間的差異, |
| 4 | SDIFFSTORE destination key1 [key2] 回傳給定所有集合的差集并存盤在 destination 中 |
| 5 | SINTER key1 [key2] 回傳給定所有集合的交集 |
| 6 | SINTERSTORE destination key1 [key2] 回傳給定所有集合的交集并存盤在 destination 中 |
| 7 | SISMEMBER key member 判斷 member 元素是否是集合 key 的成員 |
| 8 | SMEMBERS key 回傳集合中的所有成員 |
| 9 | SMOVE source destination member 將 member 元素從 source 集合移動到 destination 集合 |
| 10 | SPOP key 移除并回傳集合中的一個隨機元素 |
| 11 | SRANDMEMBER key [count] 回傳集合中一個或多個亂數 |
| 12 | SREM key member1 [member2] 移除集合中一個或多個成員 |
| 13 | SUNION key1 [key2] 回傳所有給定集合的并集 |
| 14 | SUNIONSTORE destination key1 [key2] 所有給定集合的并集存盤在 destination 集合中 |
| 15 | SSCAN key cursor [MATCH pattern] [COUNT count] 迭代集合中的元素 |
Set命令練習:
-
將下列資料用redis的set集合來存盤:
- 張三的好友有:李四,王五,趙六
- 李四的好友有:王五,麻子,二狗
127.0.0.1:6379> sadd zs ls wu zl (integer) 3 127.0.0.1:6379> sadd ls wu mz eg (integer) 3 -
利用Set命令來實作下列功能:
-
計算張三的好友有多少人
127.0.0.1:6379> SCARD zs (integer) 3 -
計算張三和李四有哪些共同好友
127.0.0.1:6379> SINTER zs ls #交集 1) "wu" -
查詢哪些人是張三的好友卻不是李四的好友
127.0.0.1:6379> SDIFF zs ls #差集 1) "zl" 2) "ls" -
查詢張三和李四的好友總共有哪些人
127.0.0.1:6379> SUNION zs ls #并集 1) "wu" 2) "zl" 3) "eg" 4) "ls" 5) "mz" -
判斷李四是否是張三的好友
127.0.0.1:6379> SISMEMBER zs ls (integer) 1 -
判斷張三是否是李四的好友
127.0.0.1:6379> SISMEMBER ls zs (integer) 0 -
將李四從張三的好友串列中洗掉
127.0.0.1:6379> SREM zs ls (integer) 1
-
7.zset(SortedSet)型別
Redis 的 Sorted Set 是一個可排序的 Set集合,與 Java 中的 TreeSet 有些類似,但底層資料結構卻差別很大,SortedSet 中的每一個元素都帶有一個 score 屬性(double型別),redis正是通過score來為集合中的成員進行從小到大的排序,底層的實作是一個跳表(SkipList)加哈希表,zset的成員是唯一的,但分數(score)卻可以重復,
集合是通過哈希表實作的,所以添加,洗掉,查找的復雜度都是 O(1),
SortedSet具備下列特性:
- 可排序
- 元素不重復
- 查詢速度快
SortedSet常用于實作排行榜或者帶權重的訊息佇列這樣的功能,
下表列出了 redis 有序集合的基本命令:
注意:所有排名默認是升序,如果要降序則在命令的Z后面添加REV即可
| 序號 | 命令及描述 |
|---|---|
| 1 | ZADD key score1 member1 [score2 member2] 向有序集合添加一個或多個成員,或者更新已存在成員的分數 |
| 2 | ZCARD key 獲取有序集合的成員數 |
| 3 | ZCOUNT key min max 計算在有序集合中指定區間分數的成員數 |
| 4 | ZINCRBY key increment member 有序集合中對指定成員的分數加上增量 increment |
| 5 | ZINTERSTORE destination numkeys key [key ...] 計算給定的一個或多個有序集的交集并將結果集存盤在新的有序集合 destination 中 |
| 6 | ZLEXCOUNT key min max 在有序集合中計算指定字典區間內成員數量 |
| 7 | ZRANGE key start stop [WITHSCORES] 通過索引區間回傳有序集合指定區間內的成員 |
| 8 | ZRANGEBYLEX key min max [LIMIT offset count] 通過字典區間回傳有序集合的成員 |
| 9 | ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] 通過分數回傳有序集合指定區間內的成員 |
| 10 | ZRANK key member 回傳有序集合中指定成員的索引 |
| 11 | ZREM key member [member ...] 移除有序集合中的一個或多個成員 |
| 12 | ZREMRANGEBYLEX key min max 移除有序集合中給定的字典區間的所有成員 |
| 13 | ZREMRANGEBYRANK key start stop 移除有序集合中給定的排名區間的所有成員 |
| 14 | ZREMRANGEBYSCORE key min max 移除有序集合中給定的分數區間的所有成員 |
| 15 | ZREVRANGE key start stop [WITHSCORES] 回傳有序集中指定區間內的成員,通過索引,分數從高到低 |
| 16 | ZREVRANGEBYSCORE key max min [WITHSCORES] 回傳有序集中指定分數區間內的成員,分數從高到低排序 |
| 17 | ZREVRANK key member 回傳有序集合中指定成員的排名,有序集成員按分數值遞減(從大到小)排序 |
| 18 | ZSCORE key member 回傳有序集中,成員的分數值 |
| 19 | ZUNIONSTORE destination numkeys key [key ...] 計算給定的一個或多個有序集的并集,并存盤在新的 key 中 |
| 20 | ZSCAN key cursor [MATCH pattern] [COUNT count] 迭代有序集合中的元素(包括元素成員和元素分值) |
SortedSet命令練習:
將班級的下列學生得分存入Redis的SortedSet中:
Jack 85,Lucy 89,Rose 82,Tom 95,Jerry 78,Amy 92,Miles 76
127.0.0.1:6379> ZADD student 85 jack 89 lucy 82 rose 95 tom 78 jerry 92 amy 76 miles
(integer) 7
并實作如下功能:
-
洗掉Tom
127.0.0.1:6379> ZREM student tom (integer) 1 -
獲取Amy的分數
127.0.0.1:6379> ZSCORE student amy "92" -
獲取Rose的排名
127.0.0.1:6379> ZREVRANK student rose (integer) 3 #降序,從0開始,實際排名為4 -
查詢80分以下有幾個學生
127.0.0.1:6379> ZCOUNT student 0 80 (integer) 2 -
給Amy加2分
127.0.0.1:6379> ZINCRBY student 2 amy "94" -
查詢成績前3名的同學
127.0.0.1:6379> ZREVRANGE student 0 2 1) "amy" 2) "lucy" 3) "jack" -
查出80分以下的所有學生
127.0.0.1:6379> ZREVRANGEBYSCORE student 80 0 1) "jerry" 2) "miles"
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/550279.html
標籤:NoSQL
上一篇:特性介紹 | MySQL 測驗框架 MTR 系列教程(一):入門篇
下一篇:MySQL表設計與優化
