Redis開發與運維學習筆記---(1)

  • 2020 年 3 月 31 日
  • 筆記

最近準備開始拓寬視野,看看redis的東西,之前就了解過redis的部署方法和5種基本的數據結構,現在準備稍微深入的了解下redis,先寫篇文章立個flag,這樣以後就用動力寫系列文章了。

今天主要看Redis中的資料庫管理部分。

redis中的數據是通過key-value的方法存儲的,類似C++中的map,我們通過key就可以獲取value的值。redis提供了幾個面向redis資料庫的操作,分別是keys、exists、del、expire、type、dbsize、select、flushdb、flushall命令。今天來看這幾個命令:

keys

我們使用keys *能夠獲得所有的redis鍵,但是該命令複雜度比較高,為O(n),不建議在線上環境直接使用。

127.0.0.1:7393> set hello world  OK  127.0.0.1:7393> keys *  1) "hello"  

exist keys

這個命令是判斷鍵是否存在的,如果存在,返回1,如果不存在,返回0

127.0.0.1:7393[14]> exists hello  (integer) 1  127.0.0.1:7393[14]> exists yyz  (integer) 0  

del

del命令用來刪除某個鍵

del key

舉例如下:

127.0.0.1:7393[14]> del hello  (integer) 1  127.0.0.1:7393[14]> exists hello  (integer) 0  

del返回1表示有一個鍵刪除成功,exists返回0表示不存在hello

expire key seconds

expire命令用來設置鍵的超時時間,一旦超過這個時間,則鍵會被自動刪除。

127.0.0.1:7393[14]> set hello world  OK  127.0.0.1:7393[14]> expire hello 5  (integer) 1  127.0.0.1:7393[14]> exists hello  (integer) 1  127.0.0.1:7393[14]> exists hello  (integer) 0  

在這個過程中,我們可以使用ttl命令來查看鍵的剩餘時間,如下:

127.0.0.1:7393[14]> set hello world  OK  127.0.0.1:7393[14]> expire hello 10  (integer) 1  127.0.0.1:7393[14]> ttl hello  (integer) 8  127.0.0.1:7393[14]> ttl hello  (integer) 5  127.0.0.1:7393[14]> ttl hello  (integer) -2  127.0.0.1:7393[14]> exists hello  (integer) 0  

當ttl返回大於0的整數時,該整數表示鍵的過期時間,單位為s,如果返回-1,則說明該鍵沒有設置過期時間,如果返回-2,則說明鍵不存在。

type

type命令用來查看當前鍵的數據結構類型,結果可能有5中,string,hash,list,set,zset

127.0.0.1:7393[15]> set hello world  OK  127.0.0.1:7393[15]> type hello  string  

dbsize

這個命令是獲取redis中鍵的個數,該命令在執行的時候,不會遍歷所有的鍵,而是會直接獲取redis內置的鍵總數變數,所以該命令的複雜度是O(1),而keys * 命令的複雜度是O(n),當redis保存了大量的鍵時,keys * 在線上環境中是需要禁用的。

select

和MySQL不同,redis中的資料庫只是用數字來作為多個資料庫的實現,redis默認配置中有16個資料庫,每個資料庫使用數字來區分。

127.0.0.1:7393> set hello world  OK  127.0.0.1:7393> get hello  "world"  127.0.0.1:7393> select 15  OK  127.0.0.1:7393[15]> get hello  (nil)  

上面的例子中,默認的hello,world都是進入到0號資料庫的,當我們使用select 15語法,會切換到15號資料庫,再去get hello的時候,就會得到空值nil

當我們使用redis-cli -h {ip} -p {port}的方法連接Redis的時候,默認使用的就是0號資料庫,當選擇其他資料庫時,會有[index]標識,index就是資料庫的下表。例如上面的例子中,我們可以看到,shell中有[15]字樣,這意味著我們進入到了15號資料庫中。

建議:

單機多庫這種方法雖然類似MySQL中的資料庫一樣,可以讓我們自由切換,但是由於redis是單執行緒的,如果使用多個資料庫,那麼這些資料庫仍然使用同一個CPU,彼此之間還是會受到影響。

因此,redis中,如果我們想要實現多個redis資料庫,最好的辦法是起其他實例,用單機多實例的方法來彌補,這種方法的好處是可以最大程度使用CPU資源,而且使得運維和調試功能更加簡便。

flushdb和flushall命令

這兩個命令都是用於清理資料庫的,二者的區別是flushdb只清楚當前資料庫,而flushall會清楚所有資料庫,如果某個redis實例中只有1個資料庫有數據,那麼這兩個操作是等效的。

另外,如果redis的鍵值數量比較多,flushdb和flushall存在阻塞redis的可能性。

Tags: