大家好,我是白晨,一個不是很能熬夜,但是也想日更的人。如果喜歡這篇文章,點個贊👍,關注一下👀白晨吧!你的支持就是我最大的動力!💪💪💪
文章目錄
- Redis鍵值概述
- 一、Redis數據類型概述
- 常用數據類型
- String
- List
- Hash
- Set
- Zset
- 擴展數據類型
- BitMap
- HyperLogLog
- GEO
- BitField
- Stream
- 二、Redis鍵(key)操作
- 常用操作及示例
- keys *
- exists key
- type key
- del key
- unlink key
- ttl key
- expire key seconds
- move key dbindex
- select dbindex
- dbsize
- flushdb
- flushall
- 常用操作匯總
- 總結
Redis鍵值概述
一、Redis數據類型概述
首先要強調一點:Redis是key value
類型的數據庫,Redis所說的數據類型都是key value
中的value
的數據結構, 而key
都是字符串。
常用數據類型
Redis中有經常使用的有五大數據類型,分別是——String(字符串),Hash(哈希),List(列表),Set(集合)、Zset(有序集合)。

String
String是redis最基本的類型,一個key對應一個value。
String類型是二進制安全的,意思是Redis的String可以包含任何數據,比如jpg圖片或者序列化的對象 。
String類型是Redis最基本的數據類型,一個Redis中字符串value最多可以是512M。
List
Redis列表是簡單的字符串列表,按照插入順序排序。你可以添加一個元素到列表的頭部(左邊)或者尾部(右邊)。
List中最多可以最多可以包含 2 32 ? 1 2^{32} - 1 232?1 個元素 (4294967295, 每個列表超過40億個元素)。
Hash
Redis Hash 是一個 String 類型的 field(字段) 和 value(值) 的映射表,Hash 特別適合用于存儲對象。
Redis 中每個 Hash 可以存儲 2 32 ? 1 2^{32} - 1 232?1 鍵值對 (4294967295, 每個哈希結構可存儲40多億個元素)。
Set
Redis 的 Set 是 String 類型的無序集合。集合成員是唯一的,這就意味著集合中不能出現重復的數據。
Redis 中Set集合是通過哈希表實現的(這里先這樣認為),所以添加,刪除,查找的復雜度都是 O(1)。
集合中最大的成員數為 2 32 ? 1 2^{32} - 1 232?1? (4294967295, 每個集合可存儲40多億個成員)。
Zset
Redis Zset 和 Set 一樣也是String類型元素的集合,且不允許重復的成員。
不同的是每個元素都會關聯一個double類型的分數,redis正是通過分數來為集合中的成員進行從小到大的排序。
Zset的成員是唯一的,但分數(score)卻可以重復。
Zset集合是通過哈希表實現的,所以添加,刪除,查找的復雜度都是 O(1)。 集合中最大的成員數為 2 32 ? 1 2^{32} - 1 232?1。
擴展數據類型
隨著 Redis 版本的更新,后面又支持了五種數據類型: BitMap(2.2 版新增)、HyperLogLog(2.8.9 版本新增)、GEO(3.2 版新增)、BitField(3.2 版新增)、Stream(5.0 版新增)。
BitMap
Redis中的BitMap不是一個獨立的數據類型,而是基于String類型實現的一種特殊的數據結構。BitMap主要用于存儲大量二進制位(0或1)的數據,這些位可以代表不同的狀態或標志。
BitMap,即位圖,是一串連續的二進制數組(0和1),可以通過偏移量(offset)定位元素。BitMap通過最小的單位bit來進行 0|1 的設置,表示某個元素的值或者狀態,時間復雜度為O (1)。由于bit是計算機中最小的單位,使用它進行儲存將非常節省空間,特別適合一些數據量大且使用二值統計的場景。
示例如下圖:
Redis的BitMap實際上是利用String類型的最大容量(512 MB)存儲一個連續的二進制序列,其中每個字節的8位可以分別代表8個獨立的狀態。這意味著你可以用一個BitMap來跟蹤多達數百萬甚至數十億的狀態,只要狀態總數不超過,即大約 2 32 2^{32} 232。
HyperLogLog
HyperLogLog 是用來做基數統計的算法,HyperLogLog 的優點是,在輸入元素的數量或者體積非常非常大時,計算基數所需的空間總是固定且是很小的。
在 Redis 里面,每個 HyperLogLog 鍵只需要花費 12 KB 內存,就可以計算接近 2 64 2^{64} 264 個不同元素的基數。這和計算基數時,元素越多耗費內存就越多的集合形成鮮明對比。
但是,因為 HyperLogLog 只會根據輸入元素來計算基數,而不會儲存輸入元素本身,所以 HyperLogLog 不能像集合那樣,返回輸入的各個元素。
GEO
Redis的GEO類型主要用于存儲地理位置信息,并對存儲的信息進行操作。GEO實際上是一種有序集合(zset),它的每個元素都包含三個屬性:經度(longitude)、緯度(latitude)和位置名稱(member)。通過這些屬性,我們可以在Redis中存儲地理位置的坐標,并對它們進行一些有用的操作。
BitField
Redis的BITFIELD命令可以將一個Redis字符串看作是一個由二進制位組成的數組,并對這個數組中任意偏移進行訪問。BITFIELD命令的作用在于它能夠將很多小的整數儲存到一個長度較大的位圖中,又或者將一個非常龐大的鍵分割為多個較小的鍵來進行儲存,從而非常高效地使用內存,使得Redis能夠得到更多不同的應用,特別是在實時分析領域。
說白了就是通過BITFIELD命令我們可以一次性對多個比特位域進行操作。
Stream
Redis Stream 主要用于消息隊列(MQ,Message Queue),Redis 本身是有一個 Redis 發布訂閱 (pub/sub) 來實現消息隊列的功能,但它有個缺點就是消息無法持久化,如果出現網絡斷開、Redis 宕機等,消息就會被丟棄。
簡單來說發布訂閱 (pub/sub) 可以分發消息,但無法記錄歷史消息。
而 Redis Stream 提供了消息的持久化和主備復制功能,可以讓任何客戶端訪問任何時刻的數據,并且能記住每一個客戶端的訪問位置,還能保證消息不丟失
二、Redis鍵(key)操作
常用操作及示例
keys *
查看當前庫的所有key
示例如下:
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> set k2 v2
OK
127.0.0.1:6379> keys *
1) "k2"
2) "k1"
exists key
檢查key是否存在,存在返回1,不存在返回0
示例如下:
127.0.0.1:6379> keys *
1) "k2"
2) "k1"
127.0.0.1:6379> EXISTS k1
(integer) 1
127.0.0.1:6379> EXISTS k3
(integer) 0
type key
返回key的類型
示例如下:
127.0.0.1:6379> type k1
string
del key
刪除一個或多個key
示例如下:
127.0.0.1:6379> keys *
1) "k2"
2) "k1"
127.0.0.1:6379> del k1
(integer) 1
127.0.0.1:6379> keys *
1) "k2"
unlink key
非阻塞刪除一個或多個key,并異步釋放和key相關的內存;返回1表示刪除成功,返回0表示刪除失敗
示例如下:
127.0.0.1:6379> keys *
1) "k1"
2) "k2"
127.0.0.1:6379> unlink k1
(integer) 1
127.0.0.1:6379> keys *
1) "k2"
ttl key
獲取key的剩余過期時間,單位為秒;-1表示永不過期,-2表示已過期
示例如下:
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> ttl k1
(integer) -1
127.0.0.1:6379> expire k1 10 # 設置過期時間為10s
(integer) 1
127.0.0.1:6379> ttl k1
(integer) 5
127.0.0.1:6379> ttl k1
(integer) -2
expire key seconds
設置key的過期時間,單位為秒;返回1表示設置成功,返回0表示設置失敗
自Redis 7.0,
expire
支持如下參數:
- NX:只有當key沒有設置過期時間,才會執行命令(已經設置過的,不能再設置)
- XX :只有當key有過期時間,才會執行命令設置(沒有設置過的,不能設置)
- GT :只有當新的過期時間大于當前過期時間時,才會設置(只會增加過期時間)
- LT :只有當新的過期時間大于當前過期時間時,才會設置(只會減少過期時間)
可選參數這里先不做演示,有興趣的小伙伴可以自己去嘗試。
示例如下:
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> ttl k1
(integer) -1
127.0.0.1:6379> expire k1 10 # 設置過期時間為10s
(integer) 1 # 1表示成功,0表示失敗
127.0.0.1:6379> ttl k1
(integer) 5
127.0.0.1:6379> ttl k1
(integer) -2
Redis 的過期時間設置有四種形式:
-
EXPIRE 秒——設置指定的過期時間(秒),表示的是時間間隔。
-
PEXPIRE 毫秒——設置指定的過期時間,以毫秒為單位,表示的是時間間隔。
-
EXPIREAT 時間戳-秒——設置指定的 Key 過期的 Unix 時間,單位為秒,表示的是時間/時刻。
-
PEXPIREAT 時間戳-毫秒——設置指定的 Key 到期的 Unix 時間,以毫秒為單位,表示的是時間/時刻。
move key dbindex
將當前數據庫的key移動到給定的數據庫dbindex(0~15)。
Redis支持多個數據庫,每個數據庫都是一個獨立的鍵值空間,這意味著同一個Redis實例中的不同數據庫可以擁有相同的key。在某些情況下,我們可能需要將一個key從一個數據庫移動到另一個數據庫。
示例如下:
127.0.0.1:6379> keys *
1) "k1"
2) "k2"
127.0.0.1:6379> move k1 13
(integer) 1
select dbindex
切換到指定的數據庫dbindex(0~15),默認為0。
示例如下:
127.0.0.1:6379> select 13
OK
127.0.0.1:6379[13]> keys *
1) "k1"
127.0.0.1:6379[13]> select 0
OK
127.0.0.1:6379> keys *
1) "k2"
dbsize
返回當前數據庫的key的總數
示例如下:
127.0.0.1:6379> keys *
1) "k1"
2) "k2"
127.0.0.1:6379> dbsize
(integer) 2
127.0.0.1:6379> select 13
OK
127.0.0.1:6379[13]> keys *
1) "k1"
127.0.0.1:6379[13]> dbsize
(integer) 1
flushdb
刪除當前數據庫中的所有Key,不會影響其他庫
示例如下:
127.0.0.1:6379[13]> keys *
1) "k1"
127.0.0.1:6379[13]> flushdb
OK
127.0.0.1:6379[13]> keys *
(empty array)
127.0.0.1:6379[13]> select 0 # 不影響其他庫
OK
127.0.0.1:6379> keys *
1) "k1"
2) "k2"
flushall
刪除所有數據庫中的所有Key
示例如下:
127.0.0.1:6379[13]> select 0
OK
127.0.0.1:6379> keys *
1) "k1"
2) "k2"
127.0.0.1:6379> select 13
OK
127.0.0.1:6379[13]> keys *
1) "k3"
2) "k4"
127.0.0.1:6379[13]> flushall
OK
127.0.0.1:6379[13]> keys *
(empty array)
127.0.0.1:6379[13]> select 0 # 0和13號數據庫中的數據都被清除了
OK
127.0.0.1:6379> keys *
(empty array)
常用操作匯總
命令 | 描述 |
---|---|
keys * | 查看當前庫的所有key |
exists key | 檢查key是否存在,存在返回1,不存在返回0 |
type key | 返回key的類型 |
del key | 刪除一個或多個key |
unlink key | 刪除一個或多個key,并異步釋放和key相關的內存 |
ttl key | 獲取key的剩余過期時間,單位為秒;-1表示永不過期,-2表示已過期。 |
expire key seconds | 設置key的過期時間,單位為秒 |
move key dbindex | 將當前數據庫的key移動到給定的數據庫dbindex |
select dbindex | 切換到指定的數據庫dbindex |
dbsize | 返回當前數據庫的key的總數 |
flushdb | 刪除當前數據庫中的所有Key |
flushall | 刪除所有數據庫中的所有Key |
這里補充一點,Redis中的操作一般是1
代表操作執行成功,0
代表操作執行失敗。
總結
在本文中,我們對Redis的鍵值存儲進行了全面的概述和介紹。首先,我們了解了Redis的五大基本數據類型:String(字符串)、Hash(哈希)、List(列表)、Set(集合)和Zset(有序集合),并探討了它們各自的特點和用法。隨后,我們介紹了五種擴展數據類型:BitMap、HyperLogLog、GEO、BitField和Stream,以及它們在實際應用中的用途和優勢。
在鍵(key)操作方面,我們涵蓋了常用的操作,包括查看、檢查、刪除、移動、切換數據庫以及設置過期時間等。這些操作豐富了我們對Redis數據管理的理解,使我們能夠更有效地管理和操作Redis中的數據。
通過本文的學習,讀者可以更加深入地了解Redis的鍵值存儲特性,為其在實際應用中的使用提供了更多的參考和指導。Redis作為一款高性能的鍵值存儲數據庫,在各種場景下都具有廣泛的應用前景,希望本文能為讀者在Redis的學習和應用上提供一些幫助和啟發。
如果講解有不對之處還請指正,我會盡快修改,多謝大家的包容。
如果大家喜歡這個系列,還請大家多多支持啦😋!
如果這篇文章有幫到你,還請給我一個大拇指
👍和小星星
??支持一下白晨吧!喜歡白晨【Redis】系列的話,不如關注
👀白晨,以便看到最新更新喲!!!