redis有著非常豐富的資料結構,這些資料結構可以滿足非常多的應用場景, 如果對這些資料結構有乙個比較清晰的認知,使用redis也會更加得心應手。
redis主要支援以下資料結構:
string(字串)
list(雙端鍊錶)
hash(hash字典)
set(無序集合)
sorted set(有序集合)
資料結構
描述實現
string
可以儲存字串,整型和浮點型等型別的資料。適合於簡單的k-v資料場景。
對整數和浮點數執行自增或者自減操作
redis並沒有使用字元陣列來實現這一資料型別,而是自己定義了簡單動態字串(sds: ****** dynamic string)型別來實現這一資料結構。
list
既可以儲存操作有序的資料,還可以當做棧來使用,它適合儲存列表性質的資料。從兩端壓入或者彈出元素
對單個或者多個元素進行修剪,
只保留乙個範圍內的元素
list在redis中使用的是雙端鍊錶和壓縮列表實現的,這就解釋了它為什麼能在頭尾操作元素。 c語言並沒有雙端鍊錶的實現,所以redis自定義了這一資料結構。
hash
hash字典,也是關聯陣列,陣列的每個元素都是key到value的對映,它適合儲存物件這樣的結構化資料。
hash在redis中是使用hash字典和壓縮列表實現的。
setset無序集合,它適合儲存需要去重的元素,且有並集,交集,差集等功能在多個set之間進行比較計算。
整數集合是set的底層實現之一,當集合只有整型元素且元素數量不多的時候,redis就會使用整數集合來實現set。當新新增元素的時候,整數集合會根據新元素的型別自動擴容,並將所有元素的型別都轉為與新元素一樣的型別,在這個過程中,還需要保持原來的順序不變,最後才新增新元素。
sorted set
sorted set有序集合,可以看做加強版的set。sorted set 與 set不同的是,sorted set可以根據元素的score分數進行排序。它適合儲存需要排序的不重複的元素。
sorted set在redis中使用的是跳表實現的,跳表是一種有序且查詢速度很快的資料結構。跳表每個節點都維持指向其他節點的指標,從而達到快速訪問的目的。
可以對 string 進行自增自減運算,從而實現計數器功能。
redis 這種記憶體型資料庫的讀寫效能非常高,很適合儲存頻繁讀寫的計數量。
將熱點資料放到記憶體中,設定記憶體的最大使用量以及淘汰策略來保證快取的命中率。
例如 dns 記錄就很適合使用 redis 進行儲存。
查詢表和快取類似,也是利用了 redis 快速的查詢特性。但是查詢表的內容不能失效,而快取的內容可以失效,因為快取不作為可靠的資料**。
list 是乙個雙向鍊錶,可以通過 lpush 和 rpop 寫入和讀取訊息
不過最好使用 kafka、rabbitmq 等訊息中介軟體。
可以使用 redis 來統一儲存多台應用伺服器的會話資訊。
當應用伺服器不再儲存使用者的會話資訊,也就不再具有狀態,乙個使用者可以請求任意乙個應用伺服器,從而更容易實現高可用性以及可伸縮性。
在分布式場景下,無法使用單機環境下的鎖來對多個節點上的程序進行同步。
可以使用 redis 自帶的 setnx 命令實現分布式鎖,除此之外,還可以使用官方提供的 redlock 分布式鎖實現。
set 可以實現交集、並集等操作,從而實現共同好友等功能。
zset 可以實現有序性操作,從而實現排行榜等功能。
重拾 堅持 沉澱
大約有將近1年左右沒有更新部落格,期間有考慮過每個月或每週花些時間來分享最近所學 所得 但總由於一些原因導致時間被占用 久而久之就漸漸淡忘了寫部落格這件事。現在回想起來感覺還是有一些後悔。其實,時間擠擠總是有的,哪怕每週一小時,乙個月下來,也能梳理出幾篇部落格。再或許是工作一定年限後,那股勁淡去了,...
重拾青藏夢
事隔一年許,才有機會靜下心來,慢慢回憶當年的青藏騎行,並記錄成文。遲遲不願動筆,一是文筆不好,有些回憶是值得留藏心裡,細細品嚐,怕寫出來會變了味,不知所謂 二是工作繁忙,著實沒那份閒情。但我又想寫點什麼,有些成長,不應該只是在記憶中埋藏。青藏線上,充滿了太多的不確定因素,嚴寒,冰雹,缺氧,高原狼,無...
重拾JSP JSP入門
1 當 input 的 type 為 hidden 時,稱其為隱藏域,隱藏域在頁面中對於使用者是不可見的,在表單中插入隱藏域的目的在於收集或傳送資訊,以利於被處理表單的程式所使用。瀏覽者單擊傳送按鈕傳送表單的時候,隱藏域的資訊也被一起傳送到伺服器。2 jsp 在處理提交過來的表單資訊前,使用 req...