Redis 常用五種數據類型編碼

来源:https://www.cnblogs.com/zjdxr-up/archive/2022/05/25/16307774.html
-Advertisement-
Play Games

轉載請註明出處: 目錄 Redis 的五種數據結構 Redis 數據結構的內部編碼 1.String 1.1 常用命令 1.2 內部編碼 1.3 典型使用場景 2. Hash 2.1 常用命令及時間複雜度 2.2 內部編碼 3.列表 3.1 常用命令及時間複雜度 3.2 內部編碼 3.3 使用場景 ...


轉載請註明出處:

目錄   Redis 的五種數據結構   Redis 數據結構的內部編碼   1.String     1.1 常用命令  1.2 內部編碼  1.3 典型使用場景   2. Hash     2.1 常用命令及時間複雜度  2.2 內部編碼   3.列表     3.1 常用命令及時間複雜度  3.2 內部編碼  3.3 使用場景   4.集合     4.1 常用命令及時間複雜度  4.2 內部編碼   5.有序集合     5.1 常用命令  5.2 內部編碼  5.3 使用場景

 

Redis 的五種數據結構

                                                         

 

Redis 數據結構的內部編碼

                                                                   

 

  Redis這樣設計有兩個好處:

    第一,可以改進內部編碼,而對外的數據結構和命令沒有影響,這樣一旦開發出更優秀的內部編碼,無需改動外部數據結構和命令。

    第二,多種內部編碼實現可以在不同場景下發揮各自的優勢,例如ziplist比較節省記憶體,但是在列表元素比較多的情況下,性能會有所下降,這時候Redis會根據配置選項將列表類型的內部實現轉換為linkedlist。

 

1.String

1.1 常用命令

  (1)設置值

set key value [ex seconds] [px milliseconds] [nx|xx]

  set命令有幾個選項:

  • ex seconds:為鍵設置秒級過期時間。

  • px milliseconds:為鍵設置毫秒級過期時間。

  • nx:鍵必須不存在,才可以設置成功,用於添加。

  • xx:與nx相反,鍵必須存在,才可以設置成功,用於更新。

  除了set選項,Redis還提供了setex和setnx兩個命令

  (2)獲取值

get key

  (3)批量設置值

mset key value [key value ...]

  (4)批量獲取值

mget key [key ...]

  (5)計數

incr key

  incr命令用於對值做自增操作,返回結果分為三種情況:

  • 值不是整數,返回錯誤。

  • 值是整數,返回自增後的結果。

  • 鍵不存在,按照值為0自增,返回結果為1。

  除了incr命令,Redis提供了decr(自減)、incrby(自增指定數字)、decrby(自減指定數字)、incrbyfloat(自增浮點數);

  (6)字元串長度

strlen key

                           

1.2 內部編碼

  字元串類型的內部編碼有3種:

  • int:8個位元組的長整型。

  • embstr:小於等於39個位元組的字元串。

  • raw:大於39個位元組的字元串。

  Redis會根據當前值的類型和長度決定使用哪種內部編碼實現。

# 小於等於39個位元組的字元串:embstr
127.0.0.1:6379> set key "hello,world"
OK
127.0.0.1:6379> object encoding key
"embstr"

1.3 典型使用場景

  1.緩存功能

    Redis作為緩存層,MySQL作為存儲層,絕大部分請求的數據都是從Redis中獲取。由於Redis具有支撐高併發的特性,所以緩存通常能起到加速讀寫和降低後端壓力的作用

  2.計數

  3.共用Session

    用Redis將用戶的Session進行集中管理,只要保證Redis是高可用和擴展性的,每次用戶更新或者查詢登錄信息都直接從Redis中集中獲取。

  4.限速

    限制介面不被頻繁訪問

2. Hash

2.1 常用命令及時間複雜度

                                   

2.2 內部編碼

  哈希類型的內部編碼有兩種:

  • ziplist(壓縮列表):當哈希類型元素個數小於hash-max-ziplist-entries配置(預設512個)、同時所有值都小於hash-max-ziplist-value配置(預設64位元組)時,Redis會使用ziplist作為哈希的內部實現,ziplist使用更加緊湊的結構實現多個元素的連續存儲,所以在節省記憶體方面比hashtable更加優秀。

  • hashtable(哈希表):當哈希類型無法滿足ziplist的條件時,Redis會使用hashtable作為哈希的內部實現,因為此時ziplist的讀寫效率會下降,而hashtable的讀寫時間複雜度為O(1)。

127.0.0.1:6379> hmset hashkey f1 v1 f2 v2
OK
127.0.0.1:6379> object encoding hashkey
"ziplist"

 

3.列表

3.1 常用命令及時間複雜度

                                                           

                                      

3.2 內部編碼

  列表類型的內部編碼有兩種。

  • ziplist(壓縮列表):當列表的元素個數小於list-max-ziplist-entries配置(預設512個),同時列表中每個元素的值都小於list-max-ziplist-value配置時(預設64位元組),Redis會選用ziplist來作為列表的內部實現來減少記憶體的使用。

  • linkedlist(鏈表):當列表類型無法滿足ziplist的條件時,Redis會使用linkedlist作為列表的內部實現。

127.0.0.1:6379> rpush listkey e1 e2 e3
(integer) 3
127.0.0.1:6379> object encoding listkey
"ziplist"

 

3.3 使用場景

  1.消息隊列

     Redis的lpush+brpop命令組合即可實現阻塞隊列,生產者客戶端使用lrpush從列表左側插入元素,多個消費者客戶端使用brpop命令阻塞式的“搶”列表尾部的元素,多個客戶端保證了消費的負載均衡和高可用性。

                           

  2.文章列表

  每個用戶有屬於自己的文章列表,現需要分頁展示文章列表。此時可以考慮使用列表,因為列表不但是有序的,同時支持按照索引範圍獲取元素。

 

4.集合

4.1 常用命令及時間複雜度

  集合(set)類型也是用來保存多個的字元串元素,但和列表類型不一樣的是,集合中不允許有重覆元素,並且集合中的元素是無序的,不能通過索引下標獲取元素。

   Redis除了支持集合內的增刪改查,同時還支持多個集合取交集、並集、差集,合理地使用好集合類型,能在實際開發中解決很多實際問題。

SADD  key  member  [member ...]        //往集合key中存入元素,元素存在則忽略,若key不存在則新建
SREM  key  member  [member ...]            //從集合key中刪除元素
SMEMBERS  key                    //獲取集合key中所有元素
SCARD  key  //獲取集合key的元素個數,scard的時間複雜度為O(1),它不會遍歷集合所有元素,而是直接用Redis內部的變數
SISMEMBER  key  member            //判斷member元素是否存在於集合key中
SRANDMEMBER  key  [count]            //從集合key中選出count個元素,元素不從key中刪除
SPOP  key  [count]                //從集合key中選出count個元素,元素從key中刪除

  Set 運算命令

SINTER  key  [key ...]                       //交集運算
SINTERSTORE  destination  key  [key ..]         //將交集結果存入新集合destination中
SUNION  key  [key ..]                       //並集運算
SUNIONSTORE  destination  key  [key ...]        //將並集結果存入新集合destination中
SDIFF  key  [key ...]                       //差集運算
SDIFFSTORE  destination  key  [key ...]         //將差集結果存入新集合destination中

                                

 

4.2 內部編碼

  集合類型的內部編碼有兩種:

  • intset(整數集合):當集合中的元素都是整數且元素個數小於set-max-intset-entries配置(預設512個)時,Redis會選用intset來作為集合的內部實現,從而減少記憶體的使用。

  • hashtable(哈希表):當集合類型無法滿足intset的條件時,Redis會使用hashtable作為集合的內部實現。

127.0.0.1:6379> sadd setkey 1 2 3 4
(integer) 4
127.0.0.1:6379> object encoding setkey
"intset"

4.3 使用場景

   1. 微博點贊,收藏,標簽(給用戶添加標簽,給標簽添加用戶),計算用戶共同感興趣的標簽

   2. 微博或微信中可能認識的人,共同好友,共同關註的話題等。

 

5.有序集合

5.1 常用命令

  它保留了集合不能有重覆成員的特性,但不同的是,有序集合中的元素可以排序。但是它和列表使用索引下標作為 排序依據不同的是,它給每個元素設置一個分數(score)作為排序的依據。有序集合中的元素不能重覆,但是score可以重覆;有序集合提供了獲取指定分數和元素範圍查詢、計算成員排名等功能

                                                 

ZADD key score member [[score member]…]    //往有序集合key中加入帶分值元素
ZREM key member [member …]        //從有序集合key中刪除元素
ZSCORE key member             //返回有序集合key中元素member的分值
ZINCRBY key increment member        //為有序集合key中元素member的分值加上increment 
ZCARD key                //返回有序集合key中元素個數
ZRANGE key start stop [WITHSCORES]    //正序獲取有序集合key從start下標到stop下標的元素
ZREVRANGE key start stop [WITHSCORES]    //倒序獲取有序集合key從start下標到stop下標的元素


ZUNIONSTORE destkey numkeys key [key ...]     //並集計算
ZINTERSTORE destkey numkeys key [key …]    //交集計算

 

5.2 內部編碼

  有序集合類型的內部編碼有兩種:

  • ziplist(壓縮列表):當有序集合的元素個數小於zset-max-ziplist-entries配置(預設128個),同時每個元素的值都小於zset-max-ziplist-value配置(預設64位元組)時,Redis會用ziplist來作為有序集合的內部實現,ziplist 可以有效減少記憶體的使用。

  • skiplist(跳躍表):當ziplist條件不滿足時,有序集合會使用skiplist作為內部實現,因為此時ziplist的讀寫效率會下降。

127.0.0.1:6379> zadd zsetkey 50 e1 60 e2 30 e3
(integer) 3
127.0.0.1:6379> object encoding zsetkey
"ziplist"

5.3 使用場景

    榜單排名,熱點排名

 

 

 

   

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 思路: 1、執行df -h 找到 帶mnt的行。將結果存入一個文件中。 system("df -h |grep mnt >./extendevinfo.txt"); 也可以直接popen用管道打開,感覺效率可能會更高一些。 2、解析文件中最後/mnt/XXX部分即為掛載路徑。(具體看自己內核掛載路徑 ...
  • 為什麼要使用Nuxt.js Nuxt 基於一個強大的模塊化架構。你可以從 50 多個模塊中進行選擇,讓你的開發變得更快、更簡單。對 PWA 的支持、添加谷歌分析到你的網頁或生成網站地圖,這些功能都無需重新發明輪子來獲得。 Nuxt.js 預設會優化你的應用程式。我們儘可能地利用 Vue.js 和 N ...
  • 一、概述 EFAK(Eagle For Apache Kafka,以前稱為 Kafka Eagle)是一款由國內公司開源的Kafka集群監控系統,可以用來監視kafka集群的broker狀態、Topic信息、IO、記憶體、consumer線程、偏移量等信息,併進行可視化圖表展示。獨特的KQL還可以通過 ...
  • 導讀: 在電商推薦中,除了推送商品的圖片和價格信息外,文案也是商品非常重要的維度。基於編碼器解碼器範式的序列文本生成模型是文案挖掘的核心,但該種方法面臨著兩大技術挑戰:一是文案生成結果不可靠和生成質量不可控,無法滿足業務對電商商品文案內容可靠性的嚴格要求;二是序列文本生成模型經常面臨數據坍塌,比較容 ...
  • DR實驗存在的隱患 DR可能會掛,單點故障 RS可能會掛 解決方案: 解決單點故障 主備:準備多個DR備用機,做好配置,主機掛掉備用機頂上 主主 解決RS會掛的問題 給RS發送請求,如果收到200 ok回覆則說明RS正常 keepalived keepalived就是實現了上述解決方法的工具,檢測w ...
  • 本文介紹資料庫的結構和基本理論,以及資料庫的實際應用。同時還介紹關係資料庫專用的 SQL 語句的書寫方法和規則。 一、資料庫是什麼 本節重點 資料庫是將大量數據保存起來,通過電腦加工而成的可以進行高效訪問的數據集合。 用來管理資料庫的電腦系統稱為資料庫管理系統(DBMS)。 通過使用 DBMS, ...
  • 語句優化 即優化器利用自身的優化器來對我們寫的SQL進行優化,然後再將其放入InnoDB引擎中執行。 條件簡化 移除不必要的括弧 select * from x where ((a = 5)); 上面的括弧很沒必要,優化器就會直接去掉。 select * from x where a = 5; 等值 ...
  • 本文介紹開源資料庫 PostgreSQL(版本 9.5.3 1)在 Windows 10 環境下的安裝方法。 PostgreSQL 是 1980 年以加利福尼亞大學為中心開發出來的 DBMS,與 MySQL 一樣,都是世界上廣泛應用的開源資料庫(DB)。它嚴格遵守標準 SQL 規則,是初學者的最佳選 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...