向内存中连续存入数据_内存节省到极致!Redis中这个数据结构,值得每个程序员了解...
在之前我們介紹了,Redis有五種基礎數據類型,分別是String,Set,List,Hash與SortSet。
今天我們又學習了一個命令,我們可以使用DEBUG OBJECT key查詢Redis中,存儲數據的一些關鍵信息,如下所示:
我們發現了ziplist跟intset這兩種不在上述基礎類型的數據結構,這又是什么呢?
Redis為了節省內存空間,當Hash與Zset元素個數較少的時候,會使用ziplist進行存儲,也就是壓縮表。在壓縮表中,元素緊密排列,更加節省內存。今天,我們一起來探討ziplist的內部,看一看ziplist的實現。
- 數據結構Zlist是有上述元素構成:zlbytes 記錄著整一個壓縮表的長度
- zltail 記錄著最后一個元素的偏移量,這是為了倒序遍歷整個zlist
- zlen 用來記錄壓縮表中節點的數量
- entryX 列表中的節點,節點用來存儲具體的數據,廠部補丁。
- zlend 一個特殊值0XFF,用來標記壓縮列表已經結束了。
我們注意到,在Redis中,數據結構壓縮表是緊湊排列的,所以,我們每次查詢都需要遍歷整一個列表,才能查詢到相關數據,因為ziplist存放的個數非常有限,所以性能的開銷并不大。
接下來,我們來看一看Redis的壓縮表中,節點的構成。
- prevlen 用來記錄上一個節點的長度,因為壓縮表可能需要倒序遍歷,所以需要記錄prevlen才能夠定位出上一個entry的位置。
- encoding 在Redis的壓縮表中,設計精髓都在這里,為了節省壓縮表占用的內存,Redis對Encoding進行了極致的設計。一般都是讀取前8個字節,用來判斷存儲的數據是什么。舉個簡單的例子,如果前8個字節是00xxxxxx,這里的00開頭,表示的是這是個非常短的字符串,后面的6個x表示字符串的長度,2^6-1等于63,所以,這個數據就encoding就表示,content是一個非常短的字符串,長度最多為63位。另一個例子,如果前8個字節是11111110,那么這個表示是int8,后面跟一個字節用來表示整數。
- content 用來存放具體的數據,前面已經提到了,是用來存放具體的數據。
根據上述規則,假如我們存放的數據是"hello world",那么Redis用來保存這個數據Entry如下所示,prevlen用來保存上一個Entry的長度,跟本數據無關,因為是小字符串,所以encoding為00001011,1011表示長度為11,content則為長度為11的字符串helloworld。
最后,我們再來了解下連鎖更新,如同數據結構中數組插入元素時間復雜度為O(N)一樣,在Redis的數據結構壓縮表中,插入數據也會一樣,并且插入數據還可能會引起連鎖更新,因為每個Entry都會記錄上一個Entry的長度,所以,在插入一定數量的Entry之后,Redis就會使用其他數據結構進行數據的存儲。
好了,有關Redis壓縮表我們就介紹到這里。歡迎大家關注我,近期還準備了一些AI相關的知識,整理后會和大家繼續分享。大家的支持是我繼續嘮嗑的動力。同名公眾號(沙茶敏碎碎念)
總結
以上是生活随笔為你收集整理的向内存中连续存入数据_内存节省到极致!Redis中这个数据结构,值得每个程序员了解...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 270 扩展固态硬盘_游戏人的扩展坞应该
- 下一篇: java执行查询postgresql得到