目錄
一.通用命令
二.資料結構與內部編碼
三.單執行緒架構
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 *2.dbsize(鍵總數)dbsize命令會返回當前資料庫的鍵總數,例如上面我們插入了五條資料,這裡就返回了結果:5. 但是dbsize命令不會遍歷資料庫中所有的鍵,而是直接獲取redis內建的鍵總數變數,因此他的時間複雜度為o(1),這點個keys命令不同.1) "
_route_key
"2) "
mylist
"127.0.0.1:6379>set hello world
ok127.0.0.1:6379>set j**a jedis
ok127.0.0.1:6379> set python redis-py
ok127.0.0.1:6379> keys *
1) "
python
"2) "
mylist
"3) "
_route_key
"4) "
j**a
"5) "
hello
"
127.0.0.1:6379>dbsize3.exists key(檢查鍵是否存在)使用exists 命令,如果鍵存在則返回1,不存在則返回0,如下所示:(integer)
5127.0.0.1:6379>
127.0.0.1:6379>set a b4.del key [key …](刪除鍵)del是乙個通用的命令,不管何種型別的資料,都可以將其刪除,如果所刪除的鍵存在,則返回 1,不存在則返回 0,如下:ok127.0.0.1:6379>exists a
(integer)
1127.0.0.1:6379>del a
(integer)
1127.0.0.1:6379>exists a
(integer)
0127.0.0.1:6379>
127.0.0.1:6379>del j**a5.expire key seconds(鍵過期)redis支援對鍵新增過期時間,當超出所設定的時間,會自動刪除鍵,而且在設定鍵過期時間之後,我們還可以通過ttl命令來檢視key剩餘的過期時間,或者通過persist命令來去掉key的過期時間.當鍵被過期後,用ttl命令檢視,則返回結果:2,具體如下:(integer)
1127.0.0.1:6379>del b
(integer)
0
127.0.0.1:6379> expire hello 106.type key(鍵的資料結構型別)如下,python是字串型別,返回結果便為string,鍵mylist 是列表型別,返回結果則是list:(integer)
1127.0.0.1:6379>ttl hello
(integer) -2
127.0.0.1:6379>type pythontype命令所返回的實際上就是當前key的資料結構型別,他們分別是string(字串),hash(雜湊),list(列表),set(集合),zset(有序集合),但這只是redis對外的資料結構.實際上每種資料結構還有自己底層的內部編碼實現,例如list就包含了linkedlist和ziplist兩種內部編碼,不過我們也可以通過object encoding命令來查詢內部編碼.string
127.0.0.1:6379>type mylist
list
圖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開發與運維
最後語:不積跬步,無以至千里;不積小流,無以成江海。對於知識總要溫故,這樣才能知新!
Redis API的理解和使用
2.雜湊hash 3.列表list 4.集合set 5.有序集合zset 以上除了keys的時間複雜度為o n 其餘時間複雜度都是o 1 redis是單執行緒的,同一時間只能執行乙個命令。那為什麼單執行緒還能這麼快?純記憶體非阻塞io,使用io多路復用 避免執行緒切換和競態消耗 所以在使用的時候,要...
IOS SEL的理解與使用
有很多人,認為block的推廣可取代 設計模式,其實block並不能取代 的模式可以讓 邏輯性更強,更整潔,也會有更高的可讀性和可擴充套件性。相比之下,我覺得block更多的是取代了選擇器 selector。selector是什麼?我們要首先明白sel,sel並不是一種物件型別,我們通過xcode的...
v model的理解與使用
步驟 1 了解v model的本質 2 了解v model的使用方法 如下 本質上是,其中 input是對輸入事件的乙個監聽 value test 是將監聽事件中的資料放入到input,並且,v model不僅可以給input賦值還可以獲取input中的資料,而且資料的獲取是實時的,因為語法糖中是用...