list取值_Redis中List及quicklist實現-2

4a2a7cfdf47c947dfbcfbe697043f02c.png

上一篇中看了List的使用方式、quicklist中的各個結構體,這一篇來看看quicklist里面的幾個核心函數,quicklistCreate函數、quicklistCreateNode函數、quicklistPush函數、quicklistPop函數。

接下來我們通過源碼看一下quicklist中是如何借鑒STL中deque的這種實現思想來完成對于sdlist及ziplist有點的結合的,并且在時間和空間是如何做的均衡,來達到“quick”的效果。

我們打開quicklist.c文件,找到第94行。

首先完成了對于一個quicklist結構體的指針,然后對quicklist進行內存分配操作,之后再設置首尾指針,再指定quicklist的長度、數據項總和、壓縮深度、ziplist的的大小限定(這個值可以有五個取值,-1:每個節點的ziplist字節數不能超過4kb,-2:每個節點的ziplist字節數不能超過8kb,-3:每個節點的ziplist字節數不能超過16kb,-4:每個節點的字節數不能超過32kb,-5:每個節點的字節數不能超過64kb, 默認是不能超過4kb的)

7fe71a919177bf27b4b96aae774fb45e.png

創建完quicklist之后,下一步就是創建quicklist節點了,看一下quicklist的第138行

這個過程和創建quicklist基本上是一致的,聲明指針、申請內存、初始化ziplist指針、初始化數據項、ziplist的大小、初始化prev、next指針、初始化節點編碼方式默認是QUICK_NODE_ENCODING_RAW、初始化數據的存放方式默認是QUICKLIST_NODE_CONTAINER_ZIPLIST,最后初始完壓縮標示然后結束。

e994e9c0d8d1e5292afd56f30ad4ed2e.png

看完初始化操作之后,接下來是PUSH操作:

不管是LPUSH還是RPUSH都包含兩個步驟,如果插入節點的ziplist大小沒有超過限制直接用ziplistPush函數壓入,如果ziplist的大小超過了限制,則新創建一個quicklist來進行壓入。

331f375fd038533a81e69e3434ef2579.png

然后來看一下這兩個函數:

likely是linux提供的可選擇的編譯優化方法,可以講分支專一的信息提供給編譯器,然后減少指令跳轉帶來的性能下降(likely是編譯器級別的優化)。

首先判斷首/尾是否允許插入(首部節點的大小和fill參數做比較)然后如果允許插入世界調用ziplistpush插入,然后更新首部大小即可以了,如果節點滿了,看一些else里面的內容,就需要重新創建一個節點,將新節點壓入心創建的ziplist中,并且與新創建的quicklist節點關聯起來,同時更新大小,然后創建一個新的ziplist節點,完成壓入,更新數據項等。如果反悔的quicklist指針沒變,則返回0,否則返回1。

adc682016b061b6c5fa71860ec4b1af3.png

接下來看一下quicklistPop函數,然后具體的邏輯其實是在quicklistPopCustom中實現的。

就是進行Pop操作,執行成功返回1,失敗返回0,如果彈出的節點是字符串,那么data、sz存放彈出字符串值,如果彈出節點是整型,slong存放彈出節點的整型值。

29264dc432d5a793094695234be66e21.png

然后具體看一下quicklistPopCustom函數,執行成功返回1,失敗返回0,如果彈出的節點是字符串,那么data、sz存放彈出字符串值,如果彈出節點是整型,slong存放彈出節點的整型值。

首先判斷彈出位置首部或者尾部,如果沒有數據直接return 0,然后獲取quicklist的節點(ziplist),再獲取ziplist的節點,然后獲取節點的值,如果是字符串值,通過_quicklistSaver深拷貝取出返回值,如果是整型的則字符串設置為NULL,彈出節點的整型值,刪除該節點。

f3546358fd86e035d596f16d0a4e4c5f.png

這里_quicklistSaver 深拷貝取值的原因是避免二次釋放。

d1909f740a6c62bdf53e1a18df5f46a6.png

quicklist核心的API就這幾個,但Redis實際上是實現了好多的,比如說:

1、比較兩個quicklist結構數據的:quicklistCount

2、從節點node中取出LZF壓縮編碼后的數據:quicklistGetLzf

3、翻轉quicklist:quicklistRotate

4、刪除ziplist節點entry:quicklistDelEntry

5、在node節點前添加一個value:quicklistInsertBefore

6、在node節點后添加一個value:quicklistInsertAfter

7、將ziplist轉換為quicklist:*quicklistCreateFromZiplist

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374102.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374102.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374102.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

通過示例休眠–第1部分(刪除孤兒)

所以我想做一系列的冬眠例子,展示冬眠的各種特征。 在第一部分中,我想展示有關刪除孤兒功能及其在故事情節中的使用方法。 因此,讓我們開始:) 先決條件 : 為了嘗試以下示例,您將需要以下提到的JAR文件: …

站長工具--IP地址庫

中國最全的IP地址庫 轉載于:https://www.cnblogs.com/weloveshare/p/5783438.html

String使用注意一

public class StringNote{ public static void main(String[] args){ char[] c{h,e,l,l,o}; String str1new String(c); String str2new String(c); String str3"hello"; //常量池中有 “hello” 字符串,str3和str4分別指向他 String str4"…

Win10手記-IIS部署網站問題解決

最近在自己的Win10電腦上嘗試部署ASP.NET網站時出現了問題,經過多方查找定位到IIS為問題來源。 開始之前 先描述下技術環境: 1.Windows 10 PC 2.Windows 自帶的IIS 7 3.ASP.NET Web API項目網站 4.VS 2015 問題描述 首先我們為PC安裝IIS,按照…

python隨機數生成的方法_python生成隨機數的方法

一、概述python可以通過random包來產生隨機數或者執行一些隨機操作。1. random.seed()給定一個數據作為隨機數種子,和大多數語言一樣,python也可以使用時間來作為隨機數種子。import timetime.seed(time.time())12importtimetime.seed(time.time())2. ra…

Java模塊化方法–模塊,模塊,模塊

我認為每個人都會同意,編寫模塊化應用程序和模塊化通常是一件好事。 但是,從Java和Scala語言以及各種Java / Scala框架來看,對模塊化的支持是怎樣的呢? 有很多不同的方法! 讓我們看看其中的一些。 “保護”以下是指模塊…

CentOS 7 安裝記錄

由于centos6.4版本有點老,所以換到centos7。 1.安裝 CentOS 7.0系統安裝配置圖解教程 2.linux設置網卡開機啟動 實質linux是看一個網卡文件的配置,就是/etc/sysconfig/network-scripts/ifcfg-eth0 (這個文件名看你網卡名稱而異,具體你到該目錄…

String使用注意二

public class StringNote_1{ public void fun(){ for(int i1;i<100;i){ System.out.print(i""); //此語句很耗時間影響性能 } System.out.println("100"); } public void fun1(){ String text""; for(int i1;i<100;i){ …

python2clock_控制fps的時鐘Clock類源碼

"""控制fps的時鐘Clock類&#xff0c;本程序用來在循環中控制fps。如何在海龜畫圖中控制fps&#xff1f;這是一個比較重要的問題&#xff0c;否則程序可能有時候快有時候慢。"""import timeimport colorsysfrom turtle import *from random impo…

將mysql的data目錄移走方法

如移動到"/home/mysql/data"&#xff0c;我的mysql是裝在/usr/local/mysql下的 1. 將/usr/local/mysql/data移動到/home/mysql/data mv /usr/local/mysql/data /home/mysql/data 2. 修改啟動文件 vi /usr/local/mysql/support-files/mysql.server 修改如下行&#xf…

Integer注意_享元設計模式

public class IntegerNote{ public static void main(String[] args){ Integer d1100; Integer d2100; System.out.println(d1d2); //true Integer d3129; Integer d4129; System.out.println(d3d4); //false } } /* 究其原因則涉及到java設計中的一個設計模式&am…

使用Spring 3引導Web應用程序

1.概述 這是關于使用Spring 3.1和基于Java的配置來建立RESTfull Web應用程序的系列教程的第一篇。 本文將重點介紹如何引導Web應用程序 &#xff0c;討論如何從XML過渡到Java&#xff0c;而不必完全遷移整個XML配置。 2. Maven <project xmlns"http://maven.apache.o…

通知欄發送消息Notification(可以使用自定義的布局)

一個簡單的應用場景&#xff1a;假如用戶打開Activity以后&#xff0c;按Home鍵&#xff0c;此時Activity 進入-> onPause() -> onStop() 不可見。代碼在此時機發送一個Notification到通知欄。當用戶點擊通知欄的Notification后&#xff0c;又重新onRestart() -> onSt…

退出頁面刪除cookie_Cookie 機制

歡迎關注公眾號 學習資料不會少01「HTTP 協議是無狀態的」對于瀏覽器的每一次請求&#xff0c;服務器都會獨立處理&#xff0c;不與之前或之后的請求發生關聯。這個過程如圖 11-1 所示&#xff0c;3次“請求&#xff0f;響應”之間沒有任何關系。即使是同一個瀏覽器發送了3個請…

【程序員感悟系列】 由一點業務說開去

最近的工作不是很忙&#xff0c;我也趁著這個機會多讀了一些技術的書籍。比如剛讀完的《大話設計模式》&#xff0c;以將故事的形式講述了設計模式的方方面面&#xff0c;感覺還是不錯的。現在看的一本是英國人寫的《企業應用架構模式》。對于web的企業級應用&#xff0c;還是挺…

浮點數使用注意

public class DoubleNote{ public static void main(String[] args){ System.out.println((1.0-0.8)); //結果&#xff1a; 0.19999999999999996 //浮點數“”要慎用 System.out.println((1.0-0.8)0.2)); // false } } /* Java 浮點數表示采用IEE765表示法 */

Oracle WebLogic Java云服務–幕后花絮。

在開放世界方面&#xff0c;發生的一件大事可能是出乎意料的消息&#xff0c;那就是Oracle最終支持云計算發展并提供自己的公共云服務 。 除了官方公告之外&#xff0c;Aquarium上&#xff08; 此處和此處 &#xff09;的內容或多或少都沒有多少內容&#xff0c;您找不到很多信…

QT子窗口及停靠實現

Demo的效果 頭文件中的變量聲明 //退出動作QAction* exit;//菜單欄菜單QMenu* filemenu;QMenu* actiona;//在狀態欄的標簽控件QLabel* label;//兩個停靠窗口QDockWidget *dockwidget;QDockWidget *dockwidget_textbox; CPP源文件中的對象定義 //創建初始化按鈕,將要放到第一個窗…

python關鍵字驅動框架搭建_python webdriver混合驅動測試框架(數據驅動+關鍵字驅動)...

混合驅動&#xff1a;把數據驅動、關鍵字驅動結合起來一起使用testdata.txthttp://www.126.comhttp://www.sohu.comteststep.txtopen||chromevisit||${url}sleep||3主程序腳本hybrid.py#encodingutf-8import refrom selenium import webdriverimport timewith open("tests…

iOS-cocoapods使用方法

1.CocoaPods的安裝及使用:http://code4app.com/article/cocoapods-install-usagehttp://objccn.io/issue-6-4/http://www.jianshu.com/p/5fc15906c53a查看當前的源gem sources -lgem sources --remove https://rubygems.org///等有反應之后再敲入以下命令&#xff0c;添加淘寶鏡…