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://www.cnblogs.com/hsdy


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM