前言:
在《Redis 第二講》中,我們完成了 Redis 的安裝與環境配置,為實際操作奠定了基礎。本講將正式進入 Redis 的核心領域——指令操作。我們將從最基礎的鍵值操作開始,逐步掌握數據讀寫、鍵管理及生產環境注意事項,為后續深入學習打下堅實根基。
一、學會使用文檔
這是我們學習Redis的第一步,我們想作為一個合格的程序員必須要學會閱讀文檔。
通過redis-cli客戶端和 redis 服務器交互.
redis 的命令非常非常多!!
任何一個工具軟件,去找相關資料,一定是官方網站!!!
1. 掌握常用命令(多操作多練習)
2. 學會使用redis 的文檔
雖然redis這種知名軟件,都是有中文文檔的.
但是還是建議大家看英文的,
(英語這一關,必須要過,也一定能過!!》
后面工作中可能會用到一些不太知名的軟件/庫,很可能沒有中文文檔.但是一定有英文官方文檔。
對于如何閱讀文檔,主要是閱讀官方網站,這里就不再重復了。
-
官方文檔(詳細命令、配置指南)→?Docs
-
下載 Redis(源碼、穩定版、開發版)→?Downloads - Redis
-
Redis 博客(最新動態、技術文章)→?Redis Blog - Read about what’s happening at Redis
-
Redis 命令參考?→?Commands | Docs
下面我們就介紹一下,我們在Redis當中會遇到的幾個高頻全局命令,有的小伙伴可能會問,什么是全局命令呢?
我們下面來解釋一下,首先我們知道Redis是一個鍵值對的數據庫,簡單來說就是“key-value”,但是在Redis這里不想我們之前在語言階段學習的鍵值對,Redis的vaule是各種數據結構,而不是數據類型,所以Redis為了方便操作相關的數據結構,就提出了針對響應結構的指令,但是也有一些指令是不必關心數據庫的value是啥結構也可以發揮作用的,這些指令就被稱為全局指令。
二、get/set
我們介紹一下,Redis最核心的兩條指令,get/set。
我們已經知道redis是按照鍵值對的方式存儲數據的,而get 根據 key 來取 value,set 把 key 和 value 存儲進去
使用簡單,學習成本很低
但是使用也是有注意的點的,我們前面說的value是有數據結構的區分的,實際上key也是有的,并且就是字符串類型,我們使用key設置鍵值對關系的時候,無論寫的是啥,都會被Redis當成字符串來進行存儲。
2.1 set
下面我們來演示一下:
????????
我們發現Redis對于每一次的語句的執行結果是有反映的,這里我們就成功設置了一對鍵值對。
2.2 get?
?功能就如它的名字一樣,通過輸入key值得到value值。
注:
1、對于上述這里的key-value,不需要加上引號,就是表示字符串的類型當然,如果要是給key和value加上引號,也是可以的(單引號或者雙引號都行)
2、redis中的命令不區分大小寫.
但是在上面get最后一個查詢當中我們看到一個新奇的單詞 ”nil“,這又是啥意思呢?這就是我們下面的問題了。
2.3 null 與nil
關于這個單詞在官方文檔當中是這樣寫的。
nil
?和?null
?都表示?“無值”或“空值”?的概念,但它們的命名和使用場景因編程語言而異。
在Redis當中開發者選擇使用nil表示空值,而在其他語言當中比如C/C++當中就是使用NULL表示空值,大家關于這個概念有個了解就好。
三、keys,exists
Redis 有 5 種數據結構,但它們都是鍵值對種的值,對于鍵來說有?些通?的命令。
3.1 KEYS
返回所有滿?樣式(pattern)的 key。那樣式又是什么呢?
pattern樣式包含特殊符號的字符串,有的地方翻譯成"樣式"或者"模式”。
存在的意義,是去描述特定的字符串長啥樣的
?持如下統配樣式。
? h?llo 匹配 hello , hallo 和 hxllo
? h*llo 匹配 hllo 和 heeeello
? h[ae]llo 匹配 hello 和 hallo 但不匹配 hillo
? h[^e]llo 匹配 hallo , hbllo , ... 但不匹配 hello
? h[a-b]llo 匹配 hallo 和 hbllo
當然我們也不口頭說,我們下面實機演示一遍。
keys,支持的樣式主要是有如下的幾種:【?,*,[],^ ,-】
- ?:匹配任意一個字符
- []:[字符串]只能匹配到方括號內的字符串,別的不行.相當于給出固定的選項了,
- ^:排除某個特定的字符,只有該字符匹配不了.其他的都能匹配
- -:匹配某個范圍內的字符.包含兩側邊界
實際演示:
?現在我們的Redis上有這些鍵值,我們可以開始演示了。
1)?:匹配一個字符
2)*:匹配0個或者多個任意字符
3)[]:[字符串]只能匹配到方括號內的字符串,別的不行.相當于給出固定的選項了,
4)^:排除某個特定的字符,只有該字符匹配不了.其他的都能匹配
5)-:匹配某個范圍內的字符.包含兩側邊界
注意:我們在使用這個指令查詢相關的key的時候,本質上是對key值進行一次遍歷,所以我們的時間復雜度就是O(N),談到這個我們就得談到另外的一個問題了,那就是我們的keys *。
3.2 KEYS *
keys 命令的時間復雜度是O(N),所以,在生產環境上,一般都會禁止使用keys命令.尤其是大殺器keys*,為什么呢?還記得我們前面在談到為啥Redis要更快一些嗎?其中有一條原因是因為它是單線程,但是在keys *的情況下,一臺的Redis服務器就得全力完成該條指令,查詢 redis 中所有的 key !!那就沒辦法對用戶的請求做出反映,沒關系,負責用戶服務的服務器發現沒有響應,就會直接找mysql服務器發出請求,這樣的后果可能是災難性的,我們知道Redis服務器上一般存放的是我們服務的熱點數據,那么基本上Redis服務器被阻塞了,那就是所有的用戶請求就打到了MySQL服務器上,這很容易就讓MySQL服務器掛掉,進而導致整個服務的掛掉。
3.3 exists
判斷某個 key 是否存在。
語法:
1 EXISTS key [key ...]
時間復雜度:O(1)
返回值:key 存在的個數。?
當我們查詢的key不存在的時候,就是直接返回0.
那我們下面再來看一種使用exists的方法。
大家說,這以紅線劃分的兩種寫法有什么不同嗎?
要想討論這個問題,我們應該先對網絡的兩個概念有所了解。
封裝和分用
進行網絡通信的時候,發送方發送一個數據,這個數據就要從應用層,到物理層,層層封裝,
(每一層協議都要加上報頭或者尾)=>發一個快遞,要包裝一下,要包裝好幾層
接收方收到一個數據,這個數據就要從物理層,到應用層層層分用
((把每一層協議中的報頭或者尾給拆掉)=>收到一個快遞,要拆快遞,要拆很多層
而網卡 是 IO 設備,更何況,你的客戶端和服務器不一定在一個主機上,中間可能隔著很遠。
這就導致了其實每一次的網絡IO的消耗是很大的,所有分開的寫法,會產生更多輪次的網絡通信,效率比較低,成本比較高。
redis自身也非常清楚上述問題.redis的很多命令都是支持一次就能操作多個key的操作?
四、生產環境
1.辦公環境(入職公司之后,公司給你發個電腦)
筆記本(windows, mac)/臺式機,現在辦公電腦,一般8C16G512G
?
2.開發環境
有的時候,開發環境和辦公環境是一個
有的時候,開發環境是單獨的服務器,配置為28C128G4T,這兩種情況主要是看崗位和公司規模
做前端/做客戶端,一般來說,開發環境就是辦公環境了,后端來說,很可能是單獨的服務器。
主要是有的后端程序,會比較復雜
1. 編譯一次時間特別久(C++) =>C++ 23 才會引入module
要使用高性能的服務器,進行編譯
2. 有的程序一啟動要消耗很多的cpu和內存資源.
辦公電腦難以支撐
3.有的程序比較依賴linux,在windows環境搭不起來
3. 測試環境(測試工程師使用的)? ?
配置比較好的就是28C128G4T
4.線上環境/生產環境
(辦公環境,開發環境,測試環境,也統稱為線下環境,外界用戶無法
訪問到的)
線上環境則是外界用戶能夠訪問到的,
一旦生產環境上出問題,一定會對于用戶的使用產生影響!!直接的影響到公司營收!
很多公司的營收都是靠廣告,廣告一般是按照展示/點擊次數來計費的~~
未來我們去操作線上環境的任何一個設備/程序都要懷著12分的謹慎!!
哪有的小伙伴說我以后不操作生產環境了行不行?
不行!!把一個程序“上線”才算是把活干完了。
上線也可以認為是正式程序猿的一個重要考核指標,也是衡量一個實習生能不能轉正留用的重要標準。
想要看自己是否可能留用,就看上線次數,一兩個月才上線一次,基本涼涼;如果一周能上線兩三次,基本穩。
總結:
本講初步探索了 Redis 的核心操作指令,包括鍵值讀寫(get/set
)、鍵管理(keys/exists
)等基礎命令,并強調了生產環境的操作規范。通過實踐這些指令,我們已邁出 Redis 實戰的第一步。在下一講《通用命令(二)》中,我們將深入?del
、expire
、type
?等進階指令,進一步解鎖 Redis 的高效數據管理能力。請持續關注!