Redis API的理解與使用
目錄
一.通用命令
Redis有五種資料結構,它們是鍵值對中的值,對於鍵來說有一些通用的命令.Redis的全域性通用命令有:keys,dbsize,exists key,del key [key …],expire key seconds,type key.
1.keys(檢視所有鍵)
雖然keys *命令比較方便實用,但一般不建議在生產環境使用,是因為生產環境的簡直對比較多,keys命令比較重,它的查詢複雜度為O(n),加入你有幾百萬個鍵,這樣查詢的速度會比較慢,而且Redis是單執行緒的,這樣還會阻塞其它的命令.還有這樣取出的資料意義並不大.但是我們有其它的方法可以解決這樣的問題,例如:熱備從節點,scan命令.這些在後面會仔講解.
127.0.0.1:6379> keys *
1) "_ROUTE_KEY"
2) "mylist"
127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> set java jedis
OK
127.0.0.1:6379> set python redis-py
OK
127.0.0.1:6379> keys *
1) "python"
2) "mylist"
3) "_ROUTE_KEY"
4) "java"
5) "hello"
2.dbsize(鍵總數)
dbsize命令會返回當前資料庫的鍵總數,例如上面我們插入了五條資料,這裡就返回了結果:5. 但是dbsize命令不會遍歷資料庫中所有的鍵,而是直接獲取Redis內建的鍵總數變數,因此他的時間複雜度為O(1),這點個keys命令不同.
127.0.0.1:6379> dbsize
(integer) 5
127.0.0.1:6379>
3.exists key(檢查鍵是否存在)
使用exists 命令,如果鍵存在則返回1,不存在則返回0,如下所示:
127.0.0.1:6379> set a b
OK
127.0.0.1:6379> exists a
(integer) 1
127.0.0.1:6379> del a
(integer) 1
127.0.0.1:6379> exists a
(integer) 0
127.0.0.1:6379>
4.del key [key …](刪除鍵)
del是一個通用的命令,不管何種型別的資料,都可以將其刪除,如果所刪除的鍵存在,則返回 1,不存在則返回 0,如下:
127.0.0.1:6379> del java
(integer) 1
127.0.0.1:6379> del b
(integer) 0
5.expire key seconds(鍵過期)
Redis支援對鍵新增過期時間,當超出所設定的時間,會自動刪除鍵,而且在設定鍵過期時間之後,我們還可以通過ttl命令來檢視key剩餘的過期時間,或者通過persist命令來去掉key的過期時間.當鍵被過期後,用ttl命令檢視,則返回結果:2,具體如下:
127.0.0.1:6379> expire hello 10
(integer) 1
127.0.0.1:6379> ttl hello
(integer) -2
6.type key(鍵的資料結構型別)
如下,python是字串型別,返回結果便為string,鍵mylist 是列表型別,返回結果則是list:
127.0.0.1:6379> type python
string
127.0.0.1:6379> type mylist
list
二.資料結構與內部編碼
type命令所返回的實際上就是當前key的資料結構型別,他們分別是string(字串),hash(雜湊),list(列表),set(集合),zset(有序集合),但這只是Redis對外的資料結構.實際上每種資料結構還有自己底層的內部編碼實現,例如list就包含了linkedlist和ziplist兩種內部編碼,不過我們也可以通過object encoding命令來查詢內部編碼.
圖1:
圖2:
三.單執行緒架構
Redis使用了單執行緒架構和I/O多路複用模型來實現高效能的記憶體資料庫服務.
1.單執行緒模型
首先來看下客戶端與服務端的簡單模型圖,如圖3所示,可以從圖中看出每次客戶端都只是經歷:傳送命令,執行命令和返回結果三個過程.
圖3:
其中,這最主要的還是因為Redis是單執行緒來處理命令的,所以一條命令從客戶端傳送到服務端,不會立馬被執行,所有的命令都會放到一個佇列之中,然後逐個被執行,這就是redis的但執行緒的基本模型.
圖4:
圖5:
2.為什麼單執行緒這麼快?
1)純記憶體訪問,Redis講所有資料放在記憶體中,記憶體的響應時長大約為100納秒,這是Redis達到每秒萬級別訪問的重要基礎.
2)非阻塞I/O,Redis使用epoll作為I/O多路複用技術的實現,再加上Redis的事件處理模型將epoll中的連線,讀寫,關閉都轉換為事件,不在網路I/O上浪費過多的時間,如圖6所示:
3)單執行緒避免了執行緒切換和競態產生的消耗.
圖6:
參考:redis開發與運維
最後語:不積跬步,無以至千里;不積小流,無以成江海。對於知識總要溫故,這樣才能知新!
版權宣告:尊重博主原創文章,轉載請註明出處 https://blog.csdn.net/zfy163520