Redis 的基礎數據結構與使用

在這裏插入圖片描述

Redis 的基礎數據結構與使用

Redis系列介紹:

Redis的基礎介紹與安裝使用步驟:https://blog.csdn.net/qq_34002221/article/details/84963588
Redis的基礎數據結構與使用: https://blog.csdn.net/qq_34002221/article/details/84981299
Redis核心原理:https://blog.csdn.net/qq_34002221/article/details/84996919
Redis 5 之後版本的高可用集羣搭建:https://blog.csdn.net/qq_34002221/article/details/85011041
Redis 5 版本的高可用集羣的水平擴展:https://blog.csdn.net/qq_34002221/article/details/85019752
Redis 5 集羣選舉原理分析:https://blog.csdn.net/qq_34002221/article/details/85042536


一、基礎數據結構

Redis 有 5 種基礎數據結構,分別爲:string (字符串)、list (列表)、set (集合)、hash (哈希) 和 zset (有序集合)。

string (字符串)

字符串 string 是 Redis 最簡單的數據結構。Redis 所有的數據結構都是以唯一的 key 字符串作爲名稱,然後通過這個唯一 key 值來獲取相應的 value 數據。不同類型的數據結構的差異就在於 value 的結構不一樣。字符串結構使用非常廣泛,一個常見的用途就是緩存用戶信息。我們將用戶信息結構體使用 JSON 序列化成字符串,然後將序列化後的字符串塞進 Redis 來緩存。同樣,取用戶信息會經過一次反序列化的過程。

鍵值對:

1.png

批量鍵值對:可以批量對多個字符串進行讀寫,節省網絡耗時開銷

2.png

過期和 set 命令擴展,
可以對 key 設置過期時間,到點自動刪除,這個功能常用來控制緩存的失效時間

set key 5秒後失效

3.png

等同於

4.png

setnx:key不存在時,才進行set,否則不成功

5.png

原子計數:如果 value 值是一個整數,還可以對它進行自增操作。自增是有範圍的,它的範圍是 signed long 的最大最小值,超過了這個值,Redis 會報錯,++可以用來完成冪等的功能++

incr、incrby、設置爲Long.maxValue

6.png

list (列表)

Redis 的列表相當於 Java 語言裏面的 LinkedList,注意它是鏈表而不是數組。這意味着 list 的插入和刪除操作非常快,時間複雜度爲 O(1),但是索引定位很慢,時間複雜度爲 O(n),這點讓人非常意外。 當列表彈出了最後一個元素之後,該數據結構自動被刪除,內存被回收。

Redis 的列表結構常用來做異步隊列使用。將需要延後處理的任務結構體序列化成字符串塞進 Redis 的列表,另一個線程從這個列表中輪詢數據進行處理。

rpush、rpop、lpush、lpop (右進左出:隊列 右進右出:棧)

7.png

hash (字典)

Redis 的字典相當於 Java 語言裏面的 HashMap,它是無序字典。內部實現結構上同 Java 的 HashMap 也是一致的,同樣的++數組 + 鏈表二維結構++。第一維 hash 的數組位置碰撞時,就會將碰撞的元素使用鏈表串接起來。

hash 結構也可以用來存儲用戶信息,不同於字符串一次性需要全部序列化整個對象,hash 可以對 用戶結構中的每個字段單獨存儲。這樣當我們需要獲取用戶信息時可以進行部分獲取。而以整個字符串的形式去保存用戶信息的話就只能一次性全部讀取,這樣就會比較浪費網絡流量。 hash 也有缺點,hash 結構的存儲消耗要高於單個字符串,到底該使用 hash 還是字符串,需要根據實際情況再三權衡。

hset key field value 、hgetall key

8.png

hlen

9.png

hget key field、hmset key field value [field value …]

10.png

set (集合)

Redis 的集合相當於 Java 語言裏面的 HashSet,它內部的鍵值對是無序的唯一的。它的內部實現相當於一個特殊的字典,字典中所有的 value 都是一個值NULL。 當集合中最後一個元素移除之後,數據結構自動刪除,內存被回收。

sadd、sismember、scard、spop

11.png

zset (有序集合)

zset 似於 Java 的 SortedSet 和 HashMap 的結合體,一方面它是一個 set,保證了內部 value 的唯一性,另一方面它可以給每個 value 賦予一個 score,代表這個 value 的排序權重。

zadd、zrange、zrevrange、zcard、zscore、zrank、zrankbyscore、zrem

12.png
13.png

keys(全量遍歷鍵)

keys用來列出所有滿足特定正則字符串規則的key,當redis數據量比較大時,性能比較差,要避免使用
14.png

scan(漸進式遍歷鍵)

scan 參數提供了三個參數,第一個是 cursor 整數值,第二個是 key 的正則模式,第三個是遍歷的 limit hint。第一次遍歷時,cursor 值爲 0,然後將返回結果中第一個整數值作爲下一次遍歷的 cursor。一直遍歷到返回的 cursor 值爲 0 時結束。

15.png

看上圖,從0開始,每次遍歷 count:2個,正則模式:name* 的key,第一行輸出的“6”,代表了下一個遊標從6開始,本次遍歷出來2個key,而第二次遍歷時,下一個遊標從9開始,此時出現了3個key,這是爲啥呢?實際上redis的存儲的鍵值對使用的hashtable存儲的,6是數組那一欄的值,而出現3個key則很有可能是因爲hash碰撞了,以鏈表的形式,加到了同一個數組欄上。(個人理解,如果錯誤,歡迎指正)

個人認爲是下圖這種情況:
16.png

info(查看redis服務運行信息)

分爲 9 大塊,每個塊都有非常多的參數,這 9 個塊分別是:
Server : 服務器運行的環境參數
Clients : 客戶端相關信息
Memory : 服務器運行內存統計數據
Persistence : 持久化信息
Stats : 通用統計數據
Replication : 主從複製相關信息
CPU: CPU 使用情況
Cluster : 集羣信息

17.png


如果問題歡迎留言:)。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章