1. 程式人生 > >Redis API的理解與使用

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