成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Redis中Set底層跟Java一樣嗎?

開發 前端
當集合的元素發生變化時,Redis 會自動轉換數據結構以適應新的需求。例如,如果一個原本使用 intset? 的集合添加了非整數元素,Redis 會將數據結構從 intset? 轉換為 hashtable。

Redis 幾種常見的數據類型底層原理,前面跟小伙伴們已經扒了 String 和 List 了,今天我們再來看看 Set。

一、Java 里的 Set

從體驗上來說,Redis 里邊的 Set 有點像 Java 里的 Set,使用感覺差不多也是這個樣子。

都是唯一,都是無序。

不過小伙伴們知道,我們 Java 里邊的 Set,幾種不同類型的 Set 底層都不約而同的指向了 Map。

HashSet

底層使用的是HashMap(實際上是一個專門的 IdentityHashMap),其中元素作為 key,對應的 value 通常是一個固定的對象(例如,PRESENT 對象),以此來實現元素的去重。

HashSet 提供了非常快的插入、刪除和查找操作,平均時間復雜度為 O(1),但不保證元素的順序。

TreeSet

  • 底層使用的是 TreeMap,它是一個紅黑樹實現的有序映射。TreeSet 中的元素會被排序,排序依據可以是自然順序(通過實現 Comparable 接口),也可以是用戶提供的 Comparator。
  • TreeSet 保證了元素的排序,同時也提供了有序集合的操作,如 headSet(), tailSet(), subSet() 等,時間復雜度通常為O(logn)。

LinkedHashSet

  • 底層使用的是 LinkedHashMap,它結合了 HashMap 的快速查找特性和 LinkedHashMap 的有序性。
  • LinkedHashSet 維護了元素的插入順序,同時提供了快速的插入、刪除和查找操作。時間復雜度通常為O(1)。

EnumSet

  • 專為枚舉類型的元素設計,底層使用位向量(bit vector)來存儲元素,非常適合枚舉類型的集合,提供了非常高效的存儲和操作。
  • EnumSet 在枚舉類型元素的數量較少時非常高效,時間復雜度通常為O(1)。

當然這是 Java 里的,Redis 中和這個并不相同。

二、Redis 的 Set

Redis 中 Set 的底層要分情況來看。

整體上來說有兩種:

  • intset
  • hashtable

具體使用哪種取決于集合中元素的數量和類型。

2.1 intset

當集合中的所有元素都是整數,并且集合的大小不超過 512 個元素時,Redis 會使用 intset 數據結構來存儲集合。

intset 是一個無序的整數數組,它使用緊湊的方式存儲整數元素,以節省內存。intset 的特點包括:

  • 使用緊湊的存儲方式,每個整數根據其大小占用最少的字節數(1 字節、2 字節、4 字節或 8 字節)。
  • 支持快速的插入和刪除操作。
  • 不保證元素的順序。

這里的 512 是咋來的呢?這個參數我們可以在 redis.conf 中進行配置,不配置的話默認是 512:

圖片圖片

來看個簡單的例子。

所有元素都是整數,且元素個數不超過 512:

圖片圖片

有元素不是整數:

圖片圖片

可以看到,此時就是另外一種 hashtable 類型了。

具體到 intset 內部,又分為不同的編碼格式。

  • int16:這個是每兩個字節表示一個整數,兩個字節就是 16 位,表示的整數范圍就是 (-2^15)~(2^15-1)
  • int32:這個是每四個字節表示一個整數,四個字節就是 32 位,表示的整數范圍就是 (-2^31)~(2^31-1)
  • int64:這個是每八個字節表示一個整數,八個字節就是 64 位,表示的整數范圍就是 (-2^63)~(2^63-1)

如果一開始使用的是 int16,后來存儲的數據大小超了,那么 Redis 會自動將編碼格式升級為 int32,并且將舊數據復制過來。

不過需要注意的是,編碼格式可以從 int16 升級為 int32,但是并不會從 int32 降級為 int16,即使數據已經變為 1 了。

2.2 hashtable

當集合中的元素不是整數或者集合的大小超過了 512 時,Redis 會使用 hashtable(散列表)來存儲集合。hashtable 是一種散列表實現,它可以高效地存儲任意類型的數據,并提供快速的查找操作。hashtable 的特點包括:

  • 支持任意類型的數據。
  • 提供快速的插入、查找和刪除操作。
  • 不保證元素的順序。

當集合的元素發生變化時,Redis 會自動轉換數據結構以適應新的需求。例如,如果一個原本使用 intset 的集合添加了非整數元素,Redis 會將數據結構從 intset 轉換為 hashtable。

Redis 如此煞費苦心,其實就一個目的,高效率的使用內存。

責任編輯:武曉燕 來源: 江南一點雨
相關推薦

2023-04-05 14:19:07

FlinkRedisNoSQL

2011-09-09 09:15:32

Java 8

2020-05-09 09:30:22

代碼產品業務

2025-02-21 08:48:16

Typescript內置聯合類型

2021-12-22 07:31:18

RedisNoSQL數據庫

2020-11-12 08:30:38

Java微服務Go

2021-04-12 10:20:20

Java微服務Go

2023-03-13 09:12:21

SSD機械硬盤

2020-03-02 10:56:41

辦公電腦疫情

2021-04-22 22:29:40

Python開發算法

2025-01-15 12:20:41

2020-02-14 14:36:23

DevOps落地認知

2020-11-17 15:31:23

Java微服務Go

2011-02-28 10:38:13

Windows 8

2012-03-07 17:24:10

戴爾咨詢

2012-12-20 10:17:32

IT運維

2009-06-12 15:26:02

2020-01-09 17:03:29

人工智能技術算法

2022-07-28 14:46:01

人工智能機器人計算機科學

2021-01-14 16:00:52

VRVR電影3D電影
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 99国产欧美| 日韩有码一区 | 久久久人成影片一区二区三区 | 国产在线观看网站 | 成人福利视频网站 | 91福利网 | 国产精品久久国产愉拍 | 午夜三级在线观看 | 久久免费视频2 | 欧美日韩一区二区三区不卡视频 | 欧美5区| 一区二区三区视频在线免费观看 | 色婷婷激情 | 精品视频一区二区 | 欧美自拍一区 | 国产激情片在线观看 | 久久精品在线播放 | 欧美成人a∨高清免费观看 老司机午夜性大片 | 欧美一级电影免费观看 | 亚洲国产精品精华素 | 精品一区二区在线观看 | 日韩成人在线电影 | 亚洲国产日韩欧美 | 日韩成人国产 | 免费视频一区 | 亚洲国内精品 | 日韩一区二区三区在线 | 看片地址| 亚洲欧美自拍偷拍视频 | 韩国久久| 婷婷久久五月 | 91一区二区三区 | 91免费视频 | 国内自拍偷拍视频 | 日本久久精 | 国产九九九九 | 中文字幕综合在线 | 欧美亚洲国产一区二区三区 | 欧美激情一区二区三级高清视频 | 一区二区中文字幕 | 99re在线视频观看 |