1. 程式人生 > >【Redis深度歷險】那些年Redis的資料結構

【Redis深度歷險】那些年Redis的資料結構

Redis埠號6379的來源

Redis的埠號是6379,但這個埠號並不是隨機選擇的,源於"MERZ",這個單詞在手機當中的對應數字就是6379。"MERZ"在Redis作者Antirez的好友圈當中代表愚蠢的意思。

資料結構

Redis的key只能是字串,value可以是String,Hash,List,Sorted Set(Zset)。

String

Redis的字串是動態字串(SDS Simple Dynamic String ),內部結構有點兒類似於java的ArrayList,都是採取預分配來減少記憶體的頻繁擴容。如圖len是實際字串的長度,capacity是預分配的空間(陣列容量)。建立字串時,len和capacity一樣長,使用位元組陣列存放內容。

struct SDS<T> {
    T capacity; // 陣列容量
    T len; // 陣列長度
    byte flags; // 特殊標識位
    byte[] content; // 陣列內容
}

  • 如果在1M以內,都是加倍擴充容量
  • 如果超過1M則,每次擴容1M
  • 字串的最大容量是512M

String的一些基礎操作

  • 普通get set
127.0.0.1:6379> set name amber
OK
127.0.0.1:6379> get name
"amber"
127.0.0.1:6379> exists name
(integer) 1
127.0.0.1:6379> del name
(integer) 1
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> 
  • 批量mset,mget
127.0.0.1:6379> set name amber
OK
127.0.0.1:6379> set name2 nick
OK
127.0.0.1:6379> mget name name2
1) "amber"
2) "nick"
127.0.0.1:6379> mset name3 wade name4 hellen
OK
127.0.0.1:6379> mget name name2 name3 name4
1) "amber"
2) "nick"
3) "wade"
4) "hellen"
127.0.0.1:6379> 
  • 設定過期時間
  1. 第一種 expire
127.0.0.1:6379> set name amber
OK
127.0.0.1:6379> expire name 5
(integer) 1
127.0.0.1:6379> get name
"amber"
//等待5s
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> 
  1. 利用setex
    setex name 時間 value
127.0.0.1:6379> setex name 5 amber
OK
127.0.0.1:6379> get name
"amber"
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> 
  • 自增自減
127.0.0.1:6379> set age 18
OK
127.0.0.1:6379> incr age
(integer) 19
127.0.0.1:6379> incrby age 5
(integer) 24
127.0.0.1:6379> incrby age -5
(integer) 19
127.0.0.1:6379> decr age
(integer) 18
127.0.0.1:6379> 

List

Redis的list結構有點像Java中的LinkedList,但實際上地產不僅僅是簡單的linkedlist,底層是quicklist(太深入了等待作者以後學習...)

特點

list的插入刪除效率很高,時間複雜度為O(1),但是索引的定位就很慢,即O(n)

操作

  • 左進右出(佇列)
127.0.0.1:6379> lpush names amber nick wade
(integer) 3
127.0.0.1:6379> rpop names
"amber"
127.0.0.1:6379> rpop names
"nick"
127.0.0.1:6379> rpop names
"wade"
127.0.0.1:6379> rpop names
(nil)
127.0.0.1:6379> 

當然你也可以左近左出(棧),可以自己實驗一下。

  • 索引操作
  1. lindex相當於java的get(int index)根據索引取值,但是因為要遍歷連結串列,如果資料很大,導致開銷增大
  2. ltrim key index1 index2 保留index1和index2之間的資料
127.0.0.1:6379> lpush names amber nick wade
(integer) 3
127.0.0.1:6379> lindex names 0
"wade"
127.0.0.1:6379> lindex names 1
"nick"
127.0.0.1:6379> lindex names 2
"amber"
127.0.0.1:6379> ltrim names 0 1
127.0.0.1:6379> lindex names 0
"wade"
127.0.0.1:6379> lindex names 1
"nick"
127.0.0.1:6379> lindex names 2
(nil)
127.0.0.1:6379> 

hash(雜湊)

Redis的hash類似java中的HashMap

特點

Redis中的Hash進行rehash時區別於java中的HashMap。
在redis進行rehash時會同時保留新舊兩個結構,並在後續的定時任務當中慢慢把舊的資料移動到新資料。

操作

127.0.0.1:6379> hmset person name amber age 18
OK
127.0.0.1:6379> hgetall person
1) "name"
2) "amber"
3) "age"
4) "18"
127.0.0.1:6379> hget person name
"amber"
127.0.0.1:6379> hset person gender 1
(integer) 1
127.0.0.1:6379> hgetall person
1) "name"
2) "amber"
3) "age"
4) "18"
5) "gender"
6) "1"

set

Redis中的set相當於java中的HashSet,內部相當於實現了一個字典

特點

value唯一

操作

127.0.0.1:6379> sadd names amber
(integer) 1
127.0.0.1:6379> sadd names amber
(integer) 0
127.0.0.1:6379> sadd names nick wade
(integer) 2
127.0.0.1:6379> smembers names
1) "amber"
2) "wade"
3) "nick"

zset(sorted set)

Redis中的zset相當於java中sorted set和HashMap的結合。在set的基礎上還可以給value賦予score(排序的權重)

特點

zset因為有score需要排序,但是採用普通的連結串列查詢銷量過低。因此zst採用層級制度。有點類似於國家->省級->市->xxx。最底層的鄉鎮肯帝就是我們的L0層級了,所有的元素都串聯在一起,每個幾個元素就選出市位於L2,同樣的道理每隔幾個L2層級的元素就選出省位於L3層級。當我們插入新的節點的時候,只需要從最頂層開始進行查詢定位到相應位置就行了。是不是有點兒像陣列的二分查詢。

操作

其實還有一些操作,不過這裡就不展示了

127.0.0.1:6379> zadd names 2 amber
(integer) 1
127.0.0.1:6379> zadd names 3 wade
(integer) 1
127.0.0.1:6379> zadd names 1 nick
(integer) 1
127.0.0.1:6379> zrange names 0 2
1) "nick"
2) "amber"
3) "wade"
127.0.0.1:6379> 

資料結構知識點拓展

  • redis的所有資料結構都可以設定時間
1. 設定時間
expire key 時間
2. 檢視時間
ttl key

相關推薦

Redis深度歷險那些Redis資料結構

Redis埠號6379的來源 Redis的埠號是6379,但這個埠號並不是隨機選擇的,源於"MERZ",這個單詞在手機當中的對應數字就是6379。"MERZ"在Redis作者Antirez的好友圈當中代表愚蠢的意思。 資料結構 Redis的key只能是字串,value可以是String,Hash,List,S

Bugly乾貨分享那些我們用過的顯示效能指標

注:Google 在自己文章中用了 Display Performance 來描述我們常說的流暢度,為了顯得有文化,本文主要用“顯示效能”一詞來代指“流暢度”(雖然兩者在概念上有細微差別)。 從 Android 誕生的那一刻起,流暢度就為眾人所關注。一

wuzhekai的專欄演算法分析_資料結構_解題筆記

專欄達人 授予成功建立個人部落格專欄

舊文章搬運Windows核心常見資料結構(程序相關)

原文發表於百度空間,2008-7-24========================================================================== 程序的相關結構非常重要,重點學習~有一些內容參考自:http://dev.csdn.net/article/20/202

舊文章搬運Windows核心常見資料結構(驅動相關)

原文發表於百度空間,2008-7-24========================================================================== 這些是驅動中相關的資料結構. 驅動物件,由I/O管理器建立,用於管理裝置(Device):lkd> dt _DR

舊文章搬運Windows核心常見資料結構(執行緒相關)

原文發表於百度空間,2008-7-24========================================================================== 執行緒是程序的實際存在,每個程序中至少會有一個執行緒.執行緒相關的資料結構比較多,一個一個看.首先是ETHREAD:lk

Java筆試題定義棧的資料結構

1、題目 定義棧的資料結構,請在該型別中實現一個能夠得到棧最小元素的min函式,在該棧中,呼叫min、push和pop的時間複雜度都是O(1)。 2、Java程式碼 public class

原創那些用過的Redis集群架構(含面試解析)

alived redis事務 空間 孤獨 不生效 strong 推出 tin 試用 引言 今天是2019年2月12號,也就是大年初八,我接到了高中同學劉有碼面試失利的消息。 他面試的時候,身份是某知名公司的小碼農一枚,卻因為不懂自己生產上Redis是如何部署的,導致面試失敗

redis,1java操作redis: 將string、list、map、自己定義的對象保存到redis

n) spa 存儲 div ber sys mil 操作 write 一、操作string 、list 、map 對象 1、引入jar: jedis-2.1.0.jar 2、代碼 /

SpringBoot系列2SpringBoot整合Redis

並且 nds key值 數據 配置數據源 eth ren core 成功 前言: 真的越來越喜歡SpringBoot了,這是SpringBoot學習系列之一。 正文: 1:首先在pom文件中添加依賴,記得是spring-boot-starter-data-redis,不是s

分散式Redis深度歷險-複製

Redis深度歷險分為兩個部分,單機Redis和分散式Redis。 本文為分散式Redis深度歷險系列的第一篇,主要內容為Redis的複製功能。 Redis的複製功能的作用和大多數分散式儲存系統一樣,就是為了支援主從設計,主從設計的好處有以下幾點: 讀寫分離,提高讀

一本《Redis 深度歷險》,我能掙多少錢?

最近,掘金銷量最高的小冊《Redis 深度歷險》紙質版終於上線了,這是第一本成功紙質化的掘金小冊。全書為了保留 掘金小冊 高質量的閱讀效果,不惜成本採用了全綵印刷,閱讀體驗非常之好,遠超出了我的期望。 有人問我,你之前的小冊才賣 19.9 元,而一本紙書居然要定價 79 元,你是不是膨脹了

Redis深度歷險

Redis深度歷險--核心原理與應用實踐:   Redis是網際網路技術領域應用非常廣泛的儲存中介軟體,它是remote dictionary service的簡稱,遠端字典服務。   Redis 可以做什麼? Redis的業務應用範圍非常廣泛,讓我們以掘金技

Redis 深度歷險:核心原理與應用實踐

小冊介紹Redis 是網際網路技術架構在儲存系統中使用最為廣泛的中介軟體,它也是中高階後端工程師

redis,1java操作redis: 將string、list、map、自定義的物件儲存到redis

一、操作string 、list 、map 物件 1、引入jar: jedis-2.1.0.jar 2、程式碼 /**      * @param args      */     pub

分散式Redis深度歷險-Cluster

本文為分散式Redis深度歷險系列的第三篇,主要內容為Redis的Cluster,也就是Redis叢集功能。 Redis叢集是R

分散式Redis深度歷險-Sentinel

上一篇介紹了Redis的主從伺服器之間是如何同步資料的。試想下,在一主一從或一主多從的結構下,如果主伺服器掛了,整個叢集就不可用了

Redis面試題如何使用Redis實現微信步數排行榜?

## 1. 前言 之前寫過一篇部落格,講解的是Redis的5種資料結構及其常用命令,當時有讀者評論,說希望瞭解下這5種資料結構各自的使用場景,不過一直也沒來得及寫。 碰巧,在3月份找工作面試時,有個面試官先問了我Redis有哪幾種資料結構,在我講完後,面試官又問了我以下問題: > 如何用Redis實現微

老男孩教育2018最新版大數據開發課程表

企業 style linu zookeepe family pan storm 大數據分析 zook 老男孩教育大數據開發課程適合所有對大數據開發有興趣的人員,從JavaSE 到大數據生態圈高端課程的開發。課程內容量很大,有一定的難度和深度,認真學習,,技術會有很大程度的提

MATLAB深度學習單層神經網絡

avg plot poc 定義 方差 esc 技術 mat 函數 單層神經網絡   在神經網絡中,當隱藏節點具有線性激活函數時,隱含層將無效化。監督學習的訓練,正是一個修正模型以減少模型輸出與標準輸出之間的誤差的過程。神經網絡以權重形式存儲信息。   根據給定信息修改權重