redis五種基本數據類型

29bc12ff749c44f2bb9cc576eb7710cf.jpgredis存儲任何類型的數據都是以key-value形式保存,并且所有的key都是字符串,所以討論基礎數據結構都是基于value的數據類型

?

?

常見的5種數據類型是:String、List、Set、Zset、Hash

?

?

?

?

?

一) 字符串(String)

String是redis最基本的類型,value最大是512M,String類型是二進制安全的,可以包含任何數據,如jpg圖片或者序列化的對象

?

1 使用場景

1) 緩存:redis作為緩存層,mysql做持久化層,降低mysql的讀寫壓力

?

2) 計數器:redis是單線程模型,一個命令執行完才會執行下一個,同時數據可以一步落地到其他的數據源

?

3) 分布式session

?

4) 分布式鎖

?

5) 限流

?

?

?

2 編碼

String類型的編碼包括:

?

1) int編碼:保存用 long 類型的整數值

?

2) embstr編碼:長度小于44Byte的短字符串(redis3.2版本之前是39Byte,之后是44Byte),對其進行修改后變成raw編碼,無論是否達到44字節

?

3) raw編碼: 長度大于44Byte的長字符串(redis3.2版本之前是39Byte,之后是44Byte)

?

?

?

3 編碼轉換

1) int 編碼的值不再是整數,或大小超過了long類型的時,自動轉化為raw

2) 由于redis沒有對embstr編碼的值提供修改方法(embstr編碼是只讀的),在修改embstr編碼的值時,都會先轉化為raw編碼再進行修改,修改后的對象一定是raw編碼的,無論是否達到了44Byte

?

?

?

?

?

二) List(列表)

redis中的List其實就是雙端鏈表

?

?

使用List的技巧

lpush+lpop=Stack(棧)

lpush+rpop=Queue(隊列)

lpush+ltrim=Capped Collection(有限集合)

lpush+brpop=Message Queue(消息隊列)

?

?

?

1 使用場景

1) 簡單隊列:發布微博,用lpush加入時間軸,最新消息排行,展示新的列表信息

?

2) 消息隊列:PUSH 操作將任務存放在List中,然后工作線程再用 POP操作將任務取出進行執行

?

?

?

2 編碼

1) linkedlist:雙向鏈表,當列表元素個數比較多或者某個元素占用空間比較大的時使用,redis3 .2版本之前使用

?

2) ziplist:壓縮列表,當列表元素個數比較少并且每個元素占用空間比較小時使用,redis3 .2版本之前使用

?

3) quicklist:快速列表,結合了ziplist和linkedlist各自的優點,redis3 .2版本開始使用

?

?

?

三) Set(無序集合)

redis中的Set類型是無序集合,集合中成員是不可重復的

?

添加,刪除,查找元素的復雜度都是 O(1)

?

?

?

1 使用場景

1) 標簽:有同一標簽或者類似標簽的可以給推薦關注的事或者關注的人

?

2) 點贊,點踩,收藏

?

?

?

2 編碼

1) hashtable:數據全部存儲于dict的鍵中,值字段閑置不用

?

2) intset:集合中存儲的只能是數值數據,且必須是整數

?

?

?

3 編碼轉換

同時滿足以下兩個條件時,使用intset編碼,否則使用hashtable編碼

?

1) Set中所有元素都是整數

?

2) Set中所有元素數量不超過512M(配置文件的set-max-intset-entries參數)

?

?

?

四) ZSet(有序集合)

Zset類型和Set類型基本一樣,區別在于Zset類型是有序集合

?

Zset集合中的每個元素都會關聯一個 double 類型的權重參數(score),使得集合中的元素能夠按score進行有序排列

?

添加,刪除,查找元素的復雜度都是 O(1)

?

?

?

1 使用場景

1) 排行榜:如網站需要對用戶點贊數從高到低進行排行

2) 權重分配:帶權重的隊列,如普通消息的score為1,重要消息的score為2,工作線程根據權重倒序獲取,保證重要的任務優先執行

?

?

2 編碼

1) ziplist:需要基于ziplist數據結構的基礎做排序與去重

?

2) skiplist:底層使用了dict與skiplist兩種數據結構

     單獨使用dict,雖然能以 O(1) 的時間復雜度查找成員,但dict是無序的,所以進行范圍操作的時候都要進行排序;

?

     單獨使用skiplist,雖然能執行范圍操作,但是查找操作為O(logN)

?

     因此redis使用了dict與skiplist兩種數據結構來共同實現Zset,既可以以O(1) 的時間復雜度查找成員,又可以實現范圍操作

?

?

?

3 編碼轉換

當Zset對象同時滿足以下兩個條件時,使用 ziplist 編碼,否者使用 skiplist 編碼

?

1) 保存的元素數量小于128(配置文件的zset-max-ziplist-entries參數)

?

2) 保存的所有元素長度都小于64Byte(配置文件的zset-max-ziplist-value參數)

?

?

五) Hash

Hash是一個key(字段) 和 value(屬性) 的映射表,hash 特別適合用于存儲對象

?

一個Hash可以存多個key-value

?

?

?

1 使用場景

1) 緩存:用戶信息,視頻信息等

?

2) 用戶信息

?

3) 用戶主頁訪問量

?

4) 組合查詢

?

?

?

2 編碼

1) ziplist

?

2) hashtable

?

?

?

3 編碼轉換

當同時滿足下面兩個條件時,使用ziplist編碼,否則使用hashtable 編碼

?

1) 列表保存元素個數小于512(配置文件的set-max-intset-entries參數)

?

2) 每個元素長度小于64Byte

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

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

相關文章

linux日志不循環問題診斷

有一臺Linux虛擬機的messages日志文件自2023年7月下旬開始沒有按周為周期重新生成新的日志,一直累積在同一個messages文件中,如下所示: [root logrotate.d]# ls -l /var/log|grep me -rw-r--r-- 1 root root 107170 Nov 15 1…

地圖導航測試用例,你get了嗎?

地圖導航是我們經常使用的工具,能幫助我們指引前進的方向。 接下來,會從功能測試、UI測試、兼容測試、安全測試、網絡測試、性能測試、易用性測試、文檔和國際化語言測試8個方面來編寫地圖導航測試用例。 一 功能測試 輸入起點和終點,驗證…

python3.7升級為更高版本并遷移庫

創建虛擬環境 # 在進入當前的虛擬環境【py3.7的環境】使用pip導出全部包txt文件 pip freeze > all_package.txt# 創建虛擬環境 conda create -n py39 python3.9# 激活新創建的虛擬環境 conda activate py39# 用 pip 一鍵文件安裝 # pip install --help 查看-r命令的作用 # …

LeetCode48旋轉圖像

思路是沿對角線交換元素,之后沿矩陣中線交換元素 參考鏈接 🔗:【LeetCode 每日一題】48. 旋轉圖像 | 手寫圖解版思路 代碼講解-嗶哩嗶哩】 class Solution {public void rotate(int[][] matrix) {int i0,j0;if(matrixnull){return;}int n matrix.length;// int[]…

優先級隊列(priority_queue)

文章目錄 優先級隊列的定義定義:接口頭文件優先隊列和堆的關系使用:排序的規則容器 仿函數應用 隊列存指針問題: 優先級隊列的定義 定義: 黃色部分是仿函數 接口 頭文件 這里不需要包含其他的頭文件只需要使用隊列的頭文件就可以…

mysql 與 Oracle 的區別,oracle 與 mysql分頁查詢的區別

文章目錄 mysql 與 Oracle 的區別1、并發性2、一致性3、事務4、數據持久性5、提交方式6、邏輯備份7、熱備份8、sql語句的擴展和靈活性9、復制10、性能診斷11、權限與安全12、分區表和分區索引13、管理工具 oracle 與 mysql分頁查詢1.Oracle分頁查詢中提供了一個偽列&#xff1a…

LeetCode算法題解(動態規劃)|LeetCode343. 整數拆分、LeetCode96. 不同的二叉搜索樹

一、LeetCode343. 整數拆分 題目鏈接:343. 整數拆分 題目描述: 給定一個正整數 n ,將其拆分為 k 個 正整數 的和( k > 2 ),并使這些整數的乘積最大化。 返回 你可以獲得的最大乘積 。 示例 1: 輸入…

?極氪,中國傳統汽車品牌電動化的樣板間

這篇文章早就想寫了,因為太忙的原因就一直跳票,正好最近兩件事的出現,又觸發了想寫這篇文章的沖動。 兩件事主要是: 一,10 月份各家陸續公布了單月銷量以及累計銷量; 二,極氪在北京正式發布了 …

LeetCode100131. Make Three Strings Equal

文章目錄 一、題目二、題解 一、題目 You are given three strings s1, s2, and s3. You have to perform the following operation on these three strings as many times as you want. In one operation you can choose one of these three strings such that its length i…

PTA 7-2 簡單計算器

7-2 簡單計算器 分數 20 全屏瀏覽題目 作者 張彤彧 單位 浙江大學 模擬簡單運算器的工作。假設計算器只能進行加減乘除運算,運算數和結果都是整數,四種運算符的優先級相同,按從左到右的順序計算。 輸入格式: 輸入在一行中給出一個四則運…

【GUI】-- 10 貪吃蛇小游戲之靜態面板繪制

GUI編程 04 貪吃蛇小游戲 4.1 第一步:先繪制一個靜態的面板 首先,需要新建兩個類,一個StartGame類作為游戲的主啟動類;一個GamePanel類作為游戲的面板類。此外,再新建一個Data類作為數據中心(存放了小蛇各部分圖像的…

微信朋友圈全新玩法,輕松互動,引爆你的社交圈

隨著社交媒體的普及,越來越多的人開始利用朋友圈來展示自己的生活和與朋友互動。而在這個數字時代,定時發圈、跟圈和朋友圈互動已經成為了一種社交習慣。本文將介紹這些功能的概念和一鍵轉發朋友圈的實現方法。 什么是定時發圈、跟圈、朋友圈互動和一鍵轉…

Embedding技術與應用(4): Embedding應用工程探析

編者按:隨著互聯網內容數量的急劇增長,個性化推薦已成為各大科技公司的核心競爭力之一。那么,如何構建一個可靠、高效的基于嵌入技術的推薦系統,使其能夠在實際生產環境中正常運行呢?這是所有從業者都關心的問題。 本文…

git的實驗:cherry-pick,github對比代碼的兩種方式

某個commit,比如 c1,,最早是在a分支做的,當被cherry-pick到b分之后,還是一樣的revision嗎? 實驗1:c1被cherry-pick到別的分支后,revision不變對嗎?(答案是變…

druid keepAlive 導致數據庫連接數飆升

一.背景 應用在執行完某個復雜業務,主要包含20幾個查詢SQL的操作后,會導致數據庫連接池一直升高 druid版本:1.2.11 druid配置文件: spring.datasource.druid.maxActive100 spring.datasource.druid.initialSize20 spring.datas…

python解決登錄圖形驗證碼

摘要:測試過程中經常遇到圖片驗證碼,以下主要是調用百度OCR圖片識別獲取驗證碼,實現登錄 1、百度云申請創建應用

【自動駕駛】一些業內自動駕駛專業術語釋義

Trajectory 軌跡信息,一般都會發布未來5-10秒的trajactory信息。 Trajectory flicker 軌跡抖動 Nudge 道內避障。在維持車道不變的情況下,橫向偏離車道中心以繞開obstacle/agent。 Xlane Nudge 借道避障。借用對向車道或自行車道以繞開obstacle/a…

VMware Workstation 與 Device/Credential Guard 不兼容 解決辦法

問題描述 問題描述: VMware 啟動虛擬機會報錯。無法運行。 錯誤信息:VMware Workstation 與 Device/Credential Guard 不兼容。在禁用 Device/Credential Guard 原因分析: 通常原因是 Window 系統開啟了 內置的Hyper-V 虛擬機。 解決方案&…

氣死了,過五關,斬六將,結果被 HR 捅了一刀!!

Hello,大家好,我是 Sunday。 大家有沒有遇到過這樣的事情:“過五關,斬六將。通過了兩輪、甚至是三輪的技術面,最后 HR 面被“捅死”了” 這樣的事情,最近在一位同學身上連續出現了兩次,弄得人…

【資深硬件工程師總結-千兆以太網設計指南】

文章目錄 01通用PCB布線指南02標志焊盤中的接地過孔區示例03EMI注意事項04ESD注意事項 資深硬件工程師總結-千兆以太網設計指南 本應用筆記旨在幫助客戶使用Microchip的10/100/1000 Mbps以太網器件系列設計PCB。本文檔提供有關PCB布線的建 議, PCB 布線是保持信號完…