字串
redis裡使用的字串又叫做簡易動態字串,其實這裡它這裡的設計與 c++ 的 string 類有異曲同工之妙。
sds先看看 sds 的定義。
struct sdshdr
;
這裡要說的是,sds 遵循 c 字串的定義模式,末尾以空字元結尾,儲存空字元的 1 位元組長度並不計算在 len 屬性裡。
擴容與**
當進行一次對 sds 的操作之後,sds 變長之後的sds的長度,即 len 的屬性值小於 1 mb時,程式將分配大小等於 len 的長度的額外空間給 sds,此時 free 的長度等於 len。這時候 buf 的實際長度為 len + free + 1。
如果操作之後變長的 sds 長度大於 1 mb,程式則分配大小為 1 mb 的額外空間給 sds。比如,修改後的 len 長度為 20 mb,那麼此刻分配給 free 長度 1 mb,此時的 buf 陣列長度為 20 mb + 1 mb + 1 byte。
如果對 sds 操作後,sds 變短,此刻不會立即** buf 陣列的長度,而是將空餘長度儲存到 free 屬性裡,留給後面可能的使用。
通過空間預分配的策略,可以減少連續操作字串後,導致空間重分配的次數,進而提公升速率,本質上是空間換時間的方案。
二進位制安全
為了確保 redis 可以適用於不同的場景, sds 的 api 都是二進位制安全的,程式對 sds 處理都是以處理二進位制的方式處理存在 buf 陣列裡的資料,輸入寫入什麼樣讀出來就什麼樣,它使用 len 來判斷字串是否讀到了結束,這樣避免了 c 裡以空字元為結束,導致某些字串截斷的問題。
與 c 字串相比
獲取字串長度的時間複雜度更低,達到了o(1),sds 的 api 都是安全的,不會造成緩衝器溢位等問題。修改字串 n 次,最多執行 n 次空間重分配。相容二進位制資料。
鍊錶定義
鍊錶定義如下:
typedef
struct list list;
鍊錶節點定義如下:
typedef
struct listnode listnode;
可以看到,本質上 reids 裡的鍊錶是乙個雙端鍊錶,並且結構內維護了鍊錶的長度,以及對鍊錶內節點進行複製、釋放、比較的函式指標。 深度學習project歷程(一)
作為乙個機器學習深度學習方面零基礎的人,選修的深度學習課程,老師全程在預設大家都有專案經驗的基礎上上課,還沒入門,就已綜述?沒辦法,只能從入門級別看起。先從把我繞暈的概念寫起。所以,深度學習為什麼這麼難!數學 計算機就是這麼難嗎!人工智慧 ai 是電腦科學的乙個分支,事實上,它不止包含電腦科學,還包...
Amaze UI學習筆記 JS學習歷程一
1.自定義事件 1 一些元件提供了自定義事件,命名方式為.amui,使用者可以檢視元件文件了解。使用這些事件,如 myalert on close.alert.amui function do something 2 data am observe 在元素上新增data am abserve屬性以後...
redis鎖的進化歷程
日常工作中總是會有高併發的場景,需要實現鎖機制來保證序列性,接下來我們一步一步實現乙個 單機redis下基本可靠的redis鎖 ps 如果是redis集群的話,就存在主從切換鎖失效的問題,解決這個問題的話就比較麻煩了,這裡不做討論,現有的解決方案有redlock,大家可以看下它的實現原理 redis...