Redis開發與運維學習筆記---(1)
- 2020 年 3 月 31 日
- 筆記
今天主要看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的可能性。

