robj *createobject(int type, void *ptr)
傳入我們要建立的物件的型別,和資料結構的引用,返回乙個建立的物件
createrawstringobject:建立乙個raw編碼格式的字串物件
robj *createrawstringobject(char *ptr, size_t len)
createembeddedstringobject:建立乙個embstr編碼格式的字串物件
從這裡我們就可以看出embstr編碼格式的字串物件在申請空間的時候同時將sds的空間一起申請了robj *createembeddedstringobject(char *ptr, size_t len) else
return o;
}
createstringobject:建立乙個字串物件
robj *createstringobject(char *ptr, size_t len)
在建立按字串物件的時候會根據字串的長度建立不同編碼方式的物件
createstringobjectfromlonglong:根據傳入的整數值建立乙個字串物件
首先會判斷這個整數是否在共享物件的範圍內,如果在直接返回這個共享物件,否則判斷這個整數能否被long型別儲存,能儲存就建立編碼格式為int的字串物件,否則建立乙個raw型別的物件。robj *createstringobjectfromlonglong(long long value) else else
}return o;
}
createstringobjectfromlongdouble:根據long double型別建立乙個字元傳物件
dupstringobject:複製乙個字串物件robj *createstringobjectfromlongdouble(long double value)
// 如果不需要小數點,那麼移除它
if (*p == '.') len--;
}// 建立物件
return createstringobject(buf,len);
}
createlistobject:建立建立乙個 linkedlist 編碼的列表物件robj *dupstringobject(robj *o)
}
robj *createlistobject(void)
createziplistobject:建立乙個 ziplist 編碼的列表物件
robj *createziplistobject(void)
createsetobject:建立乙個set編碼的集合物件
robj *createsetobject(void)
/*
* 建立乙個 intset 編碼的集合物件
*/robj *createintsetobject(void)
我們發現skiplist 編碼的有序集合同時使用了跳躍表和字典兩種資料結構來實現/*
* 建立乙個 ziplist 編碼的雜湊物件
*/robj *createhashobject(void)
/* * 建立乙個 skiplist 編碼的有序集合
*/robj *createzsetobject(void)
/*
* 建立乙個 ziplist 編碼的有序集合
*/robj *createzsetziplistobject(void)
/*
* 為物件的引用計數增一
*/void incrrefcount(robj *o)
/* * 為物件的引用計數減一
* * 當物件的引用計數降為 0 時,釋放物件。
*/void decrrefcount(robj *o)
zfree(o);
// 減少計數
} else
}
Object 原始碼分析
equals 方法實際判斷引用位址 public boolean equals object obj 這就是用hashcode 方法判斷的。hashcode 是object類的方法 equals 方法也是 所有類都間接或直接繼承了object類,因此都繼承了hashcode 方法。object類的h...
Object類原始碼解析
object類是乙個特殊的類,是所有類的父類,如果乙個類沒有用extends明確指出繼承於某個類,那麼它預設繼承object類。這裡總結object類中的幾個方法 wait notify notifyall wait long timeout hashcode 和equals 1.wait publ...
redis原始碼之dict
大家都知道redis預設是16個db,但是這些db底層的設計結構是什麼樣的呢?我們來簡單的看一下原始碼,重要的字段都有所注釋 typedef struct redisdb redisdb redis中的所有kv都是存放在dict中的,dict型別在redis中非常重要。字典disc的資料結構如下 t...