最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Redis高效率原因及數(shù)據(jù)結(jié)構(gòu)分析

 更新時(shí)間:2021年09月27日 11:41:09   作者:不會(huì)編程的派大星  
這篇文章主要為大家詳細(xì)的介紹了Redis高效的原因以及分析了Redis高效的數(shù)據(jù)結(jié)構(gòu),有需要的朋友可以借鑒參考下,希望能夠有所幫助

1、什么是redis?它主要用來干什么的?

Redis,英文全稱是Remote Dictionary Server(遠(yuǎn)程字典服務(wù)),是一個(gè)開源的使用ANSI C語言編寫、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫,并提供多種語言的API。

與MySQL數(shù)據(jù)庫不同的是,Redis的數(shù)據(jù)是存在內(nèi)存中的。它的讀寫速度非??欤棵肟梢蕴幚沓^10萬次讀寫操作。因此redis被廣泛應(yīng)用于緩存,另外,Redis也經(jīng)常用來做分布式鎖。除此之外,Redis支持事務(wù)、持久化、LUA 腳本、LRU 驅(qū)動(dòng)事件、多種集群方案。

知道redis是什么后,接下來我們來說一說redis為什么這么快。

2、redis為什么這么快?

在這里插入圖片描述

我們來一個(gè)一個(gè)說明!

基于內(nèi)存存儲(chǔ)實(shí)現(xiàn)

計(jì)算機(jī)專業(yè)的同學(xué)我們都知道內(nèi)存讀寫是要比磁盤快很多的,Redis是基于內(nèi)存實(shí)現(xiàn)的數(shù)據(jù)庫,相對(duì)于數(shù)據(jù)存在磁盤的mysql等數(shù)據(jù)庫,省去了磁盤I/O的消耗。

高效的數(shù)據(jù)結(jié)構(gòu)

我們都知道,mysql索引為了提高效率,選擇了B+樹的數(shù)據(jù)結(jié)構(gòu),對(duì)于一個(gè)應(yīng)用場(chǎng)景來說合理的數(shù)據(jù)結(jié)構(gòu)可以讓你的應(yīng)用或者程序更快。我們來看看Redis的數(shù)據(jù)結(jié)構(gòu)–內(nèi)部編碼圖:

在這里插入圖片描述

String : 動(dòng)態(tài)字符串SDS
List: 雙端鏈表LinkedList+壓縮鏈表ziplist
Hash: 壓縮鏈表ziplist+字典哈希表hashtable
Set: hashtable(+inset)
Zset: 壓縮鏈表ziplist+跳表skiplist

我們來說一說這幾種內(nèi)部編碼:

1、SDS簡(jiǎn)單動(dòng)態(tài)字符串

在這里插入圖片描述
我們來和C語言中的char[ ]對(duì)比下

字符串長(zhǎng)度處理: Redis獲取字符串長(zhǎng)度,時(shí)間復(fù)雜度為O(1),而C語言中,需要從頭遍歷,復(fù)雜度為O(N)。

空間預(yù)分配: 字符串修改越頻繁的話,內(nèi)存分配就越頻繁,就會(huì)很消費(fèi)性能,而SDS修改和空間擴(kuò)充,會(huì)額外分配未使用的空間,減少性能損耗。

惰性空間釋放: SDS縮短時(shí),不是回收多余的內(nèi)存空間,而是free記錄下多余的空間,后續(xù)有變更,直接使用free中記錄的空間,減少分配。

二進(jìn)制安全: Redis可以存儲(chǔ)一些二進(jìn)制數(shù)據(jù),在C語言中字符串遇到'/0'會(huì)結(jié)束,而SDS中標(biāo)志字符串結(jié)束的是len屬性。

2、字典

Redis 作為 K-V 型內(nèi)存數(shù)據(jù)庫,所有的鍵值就是用字典來存儲(chǔ)。字典就是哈希表,比如HashMap,通過key就可以直接獲取到對(duì)應(yīng)的value。而哈希表的特性,在O(1)時(shí)間復(fù)雜度就可以獲得對(duì)應(yīng)的值。

3、跳表

在這里插入圖片描述

跳表是Redis特有的數(shù)據(jù)結(jié)構(gòu),就是在鏈表的基礎(chǔ)上,增加多級(jí)索引提升查找效率。
跳表支持平均O(logN),最壞O(N)復(fù)雜度的節(jié)點(diǎn)查找,還可以通過順序性操作。

合理的數(shù)據(jù)編碼

Redis 支持多種數(shù)據(jù)數(shù)據(jù)類型,每種基本類型,可能對(duì)多種數(shù)據(jù)結(jié)構(gòu)。什么時(shí)候,使用什么樣數(shù)據(jù)結(jié)構(gòu),使用什么樣編碼,是redis設(shè)計(jì)者總結(jié)優(yōu)化的結(jié)果。

String: 如果存儲(chǔ)數(shù)字的話,是用int類型的編碼;如果存儲(chǔ)非數(shù)字,小于等于39字節(jié)的字符串,是embstr;大于39個(gè)字節(jié),則是raw編碼。
List: 如果列表的元素個(gè)數(shù)小于512個(gè),列表每個(gè)元素的值都小于64字節(jié)(默認(rèn)),使用ziplist編碼,否則使用linkedlist編碼
Hash: 哈希類型元素個(gè)數(shù)小于512個(gè),所有值小于64字節(jié)的話,使用ziplist編碼,否則使用hashtable編碼。
Set: 如果集合中的元素都是整數(shù)且元素個(gè)數(shù)小于512個(gè),使用intset編碼,否則使用hashtable編碼。
Zset: 當(dāng)有序集合的元素個(gè)數(shù)小于128個(gè),每個(gè)元素的值小于64字節(jié)時(shí),使用ziplist編碼,否則使用skiplist(跳躍表)編碼。

合理的線程模型

1、I/O多路復(fù)用

在這里插入圖片描述
多路I/O復(fù)用技術(shù)可以讓單個(gè)線程高效的處理多個(gè)連接請(qǐng)求,而Redis使用用epoll作為I/O多路復(fù)用技術(shù)的實(shí)現(xiàn)。并且,Redis自身的事件處理模型將epoll中的連接、讀寫、關(guān)閉都轉(zhuǎn)換為事件,不在網(wǎng)絡(luò)I/O上浪費(fèi)過多的時(shí)間。

2、什么是I/O多路復(fù)用?

I/O : 網(wǎng)絡(luò) I/O
多路 : 多個(gè)網(wǎng)絡(luò)連接
復(fù)用: 復(fù)用同一個(gè)線程。
IO多路復(fù)用其實(shí)就是一種同步IO模型,它實(shí)現(xiàn)了一個(gè)線程可以監(jiān)視多個(gè)文件句柄;一旦某個(gè)文件句柄就緒,就能夠通知應(yīng)用程序進(jìn)行相應(yīng)的讀寫操作;而沒有文件句柄就緒時(shí),就會(huì)阻塞應(yīng)用程序,交出cpu。

3、單線程模型

Redis是單線程模型的,而單線程避免了CPU不必要的上下文切換和競(jìng)爭(zhēng)鎖的消耗。也正因?yàn)槭菃尉€程,如果某個(gè)命令執(zhí)行過長(zhǎng)(如hgetall命令),會(huì)造成阻塞。Redis是面向快速執(zhí)行場(chǎng)景的數(shù)據(jù)庫。,所以要慎用如smembers和lrange、hgetall等命令。

Redis 6.0 引入了多線程提速,它的執(zhí)行命令操作內(nèi)存的仍然是個(gè)單線程。

虛擬內(nèi)存機(jī)制

redis直接自己構(gòu)建了VM機(jī)制,不會(huì)像一般的系統(tǒng)會(huì)調(diào)用系統(tǒng)函數(shù)處理,會(huì)浪費(fèi)一定的時(shí)間去移動(dòng)和請(qǐng)求。

Redis的虛擬內(nèi)存機(jī)制是啥呢?

虛擬內(nèi)存機(jī)制就是暫時(shí)把不經(jīng)常訪問的數(shù)據(jù)(冷數(shù)據(jù))從內(nèi)存交換到磁盤中,從而騰出寶貴的內(nèi)存空間用于其它需要訪問的數(shù)據(jù)(熱數(shù)據(jù))。通過VM功能可以實(shí)現(xiàn)冷熱數(shù)據(jù)分離,使熱數(shù)據(jù)仍在內(nèi)存中、冷數(shù)據(jù)保存到磁盤。這樣就可以避免因?yàn)閮?nèi)存不足而造成訪問速度下降的問題。

以上就是Redis高效原因及數(shù)據(jù)結(jié)構(gòu)分析的詳細(xì)內(nèi)容,更多關(guān)于Redis的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Redis 的各項(xiàng)功能主要解決了什么問題

    Redis 的各項(xiàng)功能主要解決了什么問題

    Redis是一個(gè)基于BSD開源的項(xiàng)目,是一個(gè)把結(jié)構(gòu)化的數(shù)據(jù)放在內(nèi)存中的一個(gè)存儲(chǔ)系統(tǒng),你可以把它作為數(shù)據(jù)庫,緩存和消息中間件來使用。這篇文章主要介紹了Redis 的各項(xiàng)功能主要解決了什么問題,需要的朋友可以參考下
    2018-10-10
  • 高并發(fā)下Redis如何保持?jǐn)?shù)據(jù)一致性(避免讀后寫)

    高并發(fā)下Redis如何保持?jǐn)?shù)據(jù)一致性(避免讀后寫)

    本文主要介紹了高并發(fā)下Redis如何保持?jǐn)?shù)據(jù)一致性(避免讀后寫),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Redis中List類型的常用命令

    Redis中List類型的常用命令

    本文主要介紹了Redis中List類型的常用命令,包含12種常用命令,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-06-06
  • Win10下通過Ubuntu安裝Redis的過程

    Win10下通過Ubuntu安裝Redis的過程

    這篇文章主要介紹了Win10下通過Ubuntu安裝Redis,在安裝Ubuntu需要先打開Windows功能,接著創(chuàng)建一個(gè)用戶及密碼,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-04-04
  • 詳解redis是如何實(shí)現(xiàn)隊(duì)列消息的ack

    詳解redis是如何實(shí)現(xiàn)隊(duì)列消息的ack

    這篇文章主要介紹了關(guān)于redis是如何實(shí)現(xiàn)隊(duì)列消息的ack的相關(guān)資料,文中介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-04-04
  • redis通過6379端口無法連接服務(wù)器(redis-server.exe閃退)

    redis通過6379端口無法連接服務(wù)器(redis-server.exe閃退)

    這篇文章主要介紹了redis通過6379端口無法連接服務(wù)器(redis-server.exe閃退),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • Redis源碼環(huán)境構(gòu)建過程詳解

    Redis源碼環(huán)境構(gòu)建過程詳解

    這篇文章主要介紹了Redis源碼環(huán)境構(gòu)建過程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-07-07
  • Redis分片集群的實(shí)現(xiàn)

    Redis分片集群的實(shí)現(xiàn)

    Redis 分片集群是一種將 Redis數(shù)據(jù)庫分散到多個(gè)節(jié)點(diǎn)上的方式,以提供更高的性能和可伸縮性,本文主要介紹了Redis分片集群的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-04-04
  • redis部署及各種數(shù)據(jù)類型使用命令詳解

    redis部署及各種數(shù)據(jù)類型使用命令詳解

    這篇文章主要介紹了redis部署及各種數(shù)據(jù)類型使用命令,編譯安裝redis及部署過程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • 關(guān)于Redis庫存超賣問題的分析

    關(guān)于Redis庫存超賣問題的分析

    在高并發(fā)場(chǎng)景下進(jìn)行優(yōu)惠券秒殺測(cè)試時(shí),發(fā)現(xiàn)由于并發(fā)操作導(dǎo)致了超賣問題,即理論上只能賣出100個(gè)優(yōu)惠券,實(shí)際賣出了102個(gè),分析原因,是因?yàn)樵诟卟l(fā)環(huán)境下,多個(gè)線程同時(shí)操作庫存,導(dǎo)致數(shù)據(jù)不一致,提出了兩種解決方案:悲觀鎖和樂觀鎖
    2024-11-11

最新評(píng)論

乐都县| 开远市| 凤山市| 建平县| 海城市| 汕头市| 余干县| 佛学| 孝感市| 会昌县| 南城县| 屏东市| 永善县| 广饶县| 朔州市| 原平市| 罗江县| 和硕县| 巴塘县| 获嘉县| 京山县| 朝阳区| 夏津县| 綦江县| 东乡县| 舟山市| 云和县| 广宁县| 福贡县| 通城县| 通海县| 新巴尔虎左旗| 泾阳县| 漠河县| 台北县| 科技| 蒲城县| 胶州市| 肥乡县| 淮安市| 余庆县|