<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Redis是什么?看這一篇就夠了!

          共 4997字,需瀏覽 10分鐘

           ·

          2020-10-28 05:51

          公眾號(hào)關(guān)注杰哥的IT之旅”,
          選擇“星標(biāo)”,重磅干貨,第一時(shí)間送達(dá)!
          薅起來(lái)!當(dāng)當(dāng)限時(shí) 3 折購(gòu)書!

          來(lái)源:https://www.cnblogs.com/powertoolsteam/p/redis.html

          引言

          在Web應(yīng)用發(fā)展的初期,那時(shí)關(guān)系型數(shù)據(jù)庫(kù)受到了較為廣泛的關(guān)注和應(yīng)用,原因是因?yàn)槟菚r(shí)候Web站點(diǎn)基本上訪問和并發(fā)不高、交互也較少。而在后來(lái),隨著訪問量的提升,使用關(guān)系型數(shù)據(jù)庫(kù)的Web站點(diǎn)多多少少都開始在性能上出現(xiàn)了一些瓶頸,而瓶頸的源頭一般是在磁盤的I/O上。而隨著互聯(lián)網(wǎng)技術(shù)的進(jìn)一步發(fā)展,各種類型的應(yīng)用層出不窮,這導(dǎo)致在當(dāng)今云計(jì)算、大數(shù)據(jù)盛行的時(shí)代,對(duì)性能有了更多的需求,主要體現(xiàn)在以下四個(gè)方面:
          1. 低延遲的讀寫速度:應(yīng)用快速地反應(yīng)能極大地提升用戶的滿意度
          2. 支撐海量的數(shù)據(jù)和流量:對(duì)于搜索這樣大型應(yīng)用而言,需要利用PB級(jí)別的數(shù)據(jù)和能應(yīng)對(duì)百萬(wàn)級(jí)的流量
          3. 大規(guī)模集群的管理:系統(tǒng)管理員希望分布式應(yīng)用能更簡(jiǎn)單的部署和管理
          4. 龐大運(yùn)營(yíng)成本的考量:IT部門希望在硬件成本、軟件成本和人力成本能夠有大幅度地降低
          為了克服這一問題,NoSQL應(yīng)運(yùn)而生,它同時(shí)具備了高性能、可擴(kuò)展性強(qiáng)、高可用等優(yōu)點(diǎn),受到廣泛開發(fā)人員和倉(cāng)庫(kù)管理人員的青睞。

          Redis是什么

          Redis是現(xiàn)在最受歡迎的NoSQL數(shù)據(jù)庫(kù)之一,Redis是一個(gè)使用ANSI C編寫的開源、包含多種數(shù)據(jù)結(jié)構(gòu)、支持網(wǎng)絡(luò)、基于內(nèi)存、可選持久性的鍵值對(duì)存儲(chǔ)數(shù)據(jù)庫(kù),其具備如下特性:
          • 基于內(nèi)存運(yùn)行,性能高效
          • 支持分布式,理論上可以無(wú)限擴(kuò)展
          • key-value存儲(chǔ)系統(tǒng)
          • 開源的使用ANSI C語(yǔ)言編寫、遵守BSD協(xié)議、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫(kù),并提供多種語(yǔ)言的API
          相比于其他數(shù)據(jù)庫(kù)類型,Redis具備的特點(diǎn)是:
          • C/S通訊模型
          • 單進(jìn)程單線程模型
          • 豐富的數(shù)據(jù)類型
          • 操作具有原子性
          • 持久化
          • 高并發(fā)讀寫
          • 支持lua腳本
          哪些大廠在使用Redis?
          • github
          • twitter
          • 微博
          • Stack Overflow
          • 阿里巴巴
          • 百度
          • 美團(tuán)
          • 搜狐

          Redis的應(yīng)用場(chǎng)景有哪些?

          Redis 的應(yīng)用場(chǎng)景包括:緩存系統(tǒng)(“熱點(diǎn)”數(shù)據(jù):高頻讀、低頻寫)、計(jì)數(shù)器、消息隊(duì)列系統(tǒng)、排行榜、社交網(wǎng)絡(luò)和實(shí)時(shí)系統(tǒng)。

          Redis的數(shù)據(jù)類型及主要特性

          Redis提供的數(shù)據(jù)類型主要分為5種自有類型和一種自定義類型,這5種自有類型包括:String類型、哈希類型、列表類型、集合類型和順序集合類型。

          String類型:

          它是一個(gè)二進(jìn)制安全的字符串,意味著它不僅能夠存儲(chǔ)字符串、還能存儲(chǔ)圖片、視頻等多種類型, 最大長(zhǎng)度支持512M。
          對(duì)每種數(shù)據(jù)類型,Redis都提供了豐富的操作命令,如:
          • GET/MGET
          • SET/SETEX/MSET/MSETNX
          • INCR/DECR
          • GETSET
          • DEL

          哈希類型:

          該類型是由field和關(guān)聯(lián)的value組成的map。其中,field和value都是字符串類型的。
          Hash的操作命令如下:
          • HGET/HMGET/HGETALL
          • HSET/HMSET/HSETNX
          • HEXISTS/HLEN
          • HKEYS/HDEL
          • HVALS

          列表類型:

          該類型是一個(gè)插入順序排序的字符串元素集合, 基于雙鏈表實(shí)現(xiàn)。
          List的操作命令如下:
          • LPUSH/LPUSHX/LPOP/RPUSH/RPUSHX/RPOP/LINSERT/LSET
          • LINDEX/LRANGE
          • LLEN/LTRIM

          集合類型:

          Set類型是一種無(wú)順序集合, 它和List類型最大的區(qū)別是:集合中的元素沒有順序, 且元素是唯一的。
          Set類型的底層是通過哈希表實(shí)現(xiàn)的,其操作命令為:
          • SADD/SPOP/SMOVE/SCARD
          • SINTER/SDIFF/SDIFFSTORE/SUNION
          Set類型主要應(yīng)用于:在某些場(chǎng)景,如社交場(chǎng)景中,通過交集、并集和差集運(yùn)算,通過Set類型可以非常方便地查找共同好友、共同關(guān)注和共同偏好等社交關(guān)系。

          順序集合類型:

          ZSet是一種有序集合類型,每個(gè)元素都會(huì)關(guān)聯(lián)一個(gè)double類型的分?jǐn)?shù)權(quán)值,通過這個(gè)權(quán)值來(lái)為集合中的成員進(jìn)行從小到大的排序。與Set類型一樣,其底層也是通過哈希表實(shí)現(xiàn)的。
          ZSet命令:
          • ZADD/ZPOP/ZMOVE/ZCARD/ZCOUNT
          • ZINTER/ZDIFF/ZDIFFSTORE/ZUNION

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

          Redis的數(shù)據(jù)結(jié)構(gòu)如下圖所示:
          關(guān)于上表中的部分釋義:
          1. 壓縮列表是列表鍵和哈希鍵的底層實(shí)現(xiàn)之一。當(dāng)一個(gè)列表鍵只包含少量列表項(xiàng),并且每個(gè)列表項(xiàng)要么就是小整數(shù),要么就是長(zhǎng)度比較短的字符串,Redis就會(huì)使用壓縮列表來(lái)做列表鍵的底層實(shí)現(xiàn)
          2. 整數(shù)集合是集合鍵的底層實(shí)現(xiàn)之一,當(dāng)一個(gè)集合只包含整數(shù)值元素,并且這個(gè)集合的元素?cái)?shù)量不多時(shí),Redis就會(huì)使用整數(shù)集合作為集合鍵的底層實(shí)現(xiàn)
          如下是定義一個(gè)Struct數(shù)據(jù)結(jié)構(gòu)的例子:

          簡(jiǎn)單動(dòng)態(tài)字符串SDS (Simple Dynamic String)

          基于C語(yǔ)言中傳統(tǒng)字符串的缺陷,Redis自己構(gòu)建了一種名為簡(jiǎn)單動(dòng)態(tài)字符串的抽象類型,簡(jiǎn)稱SDS,其結(jié)構(gòu)如下:
          SDS幾乎貫穿了Redis的所有數(shù)據(jù)結(jié)構(gòu),應(yīng)用十分廣泛。

          SDS的特點(diǎn)

          和C字符串相比,SDS的特點(diǎn)如下:
          1. 常數(shù)復(fù)雜度獲取字符串長(zhǎng)度
          Redis中利用SDS字符串的len屬性可以直接獲取到所保存的字符串的長(zhǎng)    度,直接將獲取字符串長(zhǎng)度所需的復(fù)雜度從C字符串的O(N)降低到了O(1)。
          2. 減少修改字符串時(shí)導(dǎo)致的內(nèi)存重新分配次數(shù)
          通過C字符串的特性,我們知道對(duì)于一個(gè)包含了N個(gè)字符的C字符串來(lái)說(shuō),其底層實(shí)現(xiàn)總是N+1個(gè)字符長(zhǎng)的數(shù)組(額外一個(gè)空字符結(jié)尾)
          那么如果這個(gè)時(shí)候需要對(duì)字符串進(jìn)行修改,程序就需要提前對(duì)這個(gè)C字符串?dāng)?shù)組進(jìn)行一次內(nèi)存重分配(可能是擴(kuò)展或者釋放)
          而內(nèi)存重分配就意味著是一個(gè)耗時(shí)的操作。
          Redis巧妙的使用了SDS避免了C字符串的缺陷。在SDS中,buf數(shù)組的長(zhǎng)度不一定就是字符串的字符數(shù)量加一,buf數(shù)組里面可以包含未使用的字節(jié),而這些未使用的字節(jié)由free屬性記錄。
          與此同時(shí),SDS采用了空間預(yù)分配的策略,避免C字符串每一次修改時(shí)都需要進(jìn)行內(nèi)存重分配的耗時(shí)操作,將內(nèi)存重分配從原來(lái)的每修改N次就分配N次——>降低到了修改N次最多分配N次。
          如下是Redis對(duì)SDS的簡(jiǎn)單定義:

          Redis特性1:事務(wù)

          • 命令序列化,按順序執(zhí)行
          • 原子性
          • 三階段: 開始事務(wù) - 命令入隊(duì) - 執(zhí)行事務(wù)
          • 命令:MULTI/EXEC/DISCARD

          Redis特性2:發(fā)布訂閱(Pub/Sub)

          • Pub/sub是一種消息通訊模式
          • Pub發(fā)送消息, Sub接受消息
          • Redis客戶端可以訂閱任意數(shù)量的頻道
          • “fire and forgot”, 發(fā)送即遺忘
          • 命令:Publish/Subscribe/Psubscribe/UnSub

          Redis特性3:Stream

          • Redis 5.0新增
          • 等待消費(fèi)
          • 消費(fèi)組(組內(nèi)競(jìng)爭(zhēng))
          • 消費(fèi)歷史數(shù)據(jù)
          • FIFO
          以上就是Redis的基本概念,下面我們將介紹在開發(fā)過程中可能會(huì)踩到的“坑”。

          Redis常見問題解析:擊穿

          概念:在Redis獲取某一key時(shí), 由于key不存在, 而必須向DB發(fā)起一次請(qǐng)求的行為, 稱為“Redis擊穿”。
          引發(fā)擊穿的原因:
          • 第一次訪問
          • 惡意訪問不存在的key
          • Key過期
          合理的規(guī)避方案:
          • 服務(wù)器啟動(dòng)時(shí), 提前寫入
          • 規(guī)范key的命名, 通過中間件攔截
          • 對(duì)某些高頻訪問的Key,設(shè)置合理的TTL或永不過期

          Redis常見問題解析:雪崩

          概念:Redis緩存層由于某種原因宕機(jī)后,所有的請(qǐng)求會(huì)涌向存儲(chǔ)層,短時(shí)間內(nèi)的高并發(fā)請(qǐng)求可能會(huì)導(dǎo)致存儲(chǔ)層掛機(jī),稱之為“Redis雪崩”。
          合理的規(guī)避方案:
          • 使用Redis集群
          • 限流

          Redis在產(chǎn)品開發(fā)中的應(yīng)用實(shí)踐

          為此,我很高興的為大家介紹,葡萄城架構(gòu)師Jim將在2019-11-27 14:00 為大家?guī)?lái)一場(chǎng)公開課,其中 Jim除了為大家講解Redis的基礎(chǔ),同時(shí)也會(huì)實(shí)際演示他所在的項(xiàng)目組使用Redis時(shí)碰到的問題以及解決方案,對(duì)于剛接觸Redis的同學(xué)來(lái)說(shuō),更具參考意義和學(xué)習(xí)價(jià)值,歡迎大家屆時(shí)參加,公開課地址:https://live.vhall.com/661463644。
          • 后端采用nodeJS
          • 使用Azure的Redis服務(wù)
          • Redis的使用場(chǎng)景
          - ?token緩存, 用于令牌驗(yàn)證
          - ?IP白名單
          碰到的問題
          • “網(wǎng)絡(luò)抖動(dòng)”或者Redis服務(wù)異常導(dǎo)致Redis訪問超時(shí)
          • Redis客戶端驅(qū)動(dòng)穩(wěn)定性問題
          - ?連接池 “Broken connection” 問題
          - ?JS的Promise引出的Redis重置問題
          下面我們來(lái)簡(jiǎn)單了解一下Redis的進(jìn)階知識(shí)。

          進(jìn)階之Redis協(xié)議簡(jiǎn)介

          Redis客戶端通訊協(xié)議:RESP(Redis Serialization Protocol),其特點(diǎn)是:
          • 簡(jiǎn)單
          • 解析速度快
          • 可讀性好
          Redis集群內(nèi)部通訊協(xié)議:RECP(Redis Cluster Protocol ) ,其特點(diǎn)是:
          • 每一個(gè)node兩個(gè)tcp 連接
          • 一個(gè)負(fù)責(zé)client-server通訊(P: 6379)
          • 一個(gè)負(fù)責(zé)node之間通訊(P: 10000 + 6379)
          Redis協(xié)議支持的數(shù)據(jù)類型:
          • 簡(jiǎn)單字符(首字節(jié): “+”)

            “+OK\r\n”

          • 錯(cuò)誤(首字節(jié): “-”)

            “-error msg\r\n”

          • 數(shù)字(首字節(jié): “:”)

            “:123\r\n”

          • 批量字符(首字節(jié): “$”)

            “&hello\r\nWhoa re you\r\n”

          • 數(shù)組(首字節(jié): “*”)

            “*0\r\n”

            “*-1\r\n”

          除了Redis,還有什么NoSQL型數(shù)據(jù)庫(kù)

          市面上類似于Redis,同樣是NoSQL型的數(shù)據(jù)庫(kù)有很多,如下圖所示,除了Redis,還有MemCache、Cassadra和Mongo。下面,我們就分別對(duì)這幾個(gè)數(shù)據(jù)庫(kù)做一下簡(jiǎn)要的介紹:
          **Memcache:**這是一個(gè)和Redis非常相似的數(shù)據(jù)庫(kù),但是它的數(shù)據(jù)類型沒有Redis豐富。Memcache由LiveJournal的Brad Fitzpatrick開發(fā),作為一套分布式的高速緩存系統(tǒng),被許多網(wǎng)站使用以提升網(wǎng)站的訪問速度,對(duì)于一些大型的、需要頻繁訪問數(shù)據(jù)庫(kù)的網(wǎng)站訪問速度的提升效果十分顯著。
          Apache Cassandra:(社區(qū)內(nèi)一般簡(jiǎn)稱為C*)這是一套開源分布式NoSQL數(shù)據(jù)庫(kù)系統(tǒng)。它最初由Facebook開發(fā),用于儲(chǔ)存收件箱等簡(jiǎn)單格式數(shù)據(jù),集Google BigTable的數(shù)據(jù)模型與Amazon Dynamo的完全分布式架構(gòu)于一身。Facebook于2008將 Cassandra 開源,由于其良好的可擴(kuò)展性和性能,被 Apple、Comcast、Instagram、Spotify、eBay、Rackspace、Netflix等知名網(wǎng)站所采用,成為了一種流行的分布式結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)方案。
          MongoDB:是一個(gè)基于分布式文件存儲(chǔ)、面向文檔的NoSQL數(shù)據(jù)庫(kù),由C++編寫,旨在為WEB應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案。MongoDB是一個(gè)介于關(guān)系數(shù)據(jù)庫(kù)和非關(guān)系數(shù)據(jù)庫(kù)之間的產(chǎn)品,是非關(guān)系數(shù)據(jù)庫(kù)當(dāng)中功能最豐富,最像關(guān)系型數(shù)據(jù)庫(kù)的,它支持的數(shù)據(jù)結(jié)構(gòu)非常松散,是一種類似json的BSON格式。

          總結(jié)

          以上就是Redis入門介紹教程,如果各位還想了解更多,歡迎通過評(píng)論和私信的方式告訴我。

          如果您覺得這篇文章對(duì)您有點(diǎn)用的話,麻煩您為本文來(lái)個(gè)四連:轉(zhuǎn)發(fā)分享、點(diǎn)贊、點(diǎn)在看、留言,因?yàn)檫@將是我寫作與分享更多優(yōu)質(zhì)文章的最強(qiáng)動(dòng)力!


          本公眾號(hào)全部博文已整理成一個(gè)目錄,請(qǐng)?jiān)诠娞?hào)后臺(tái)回復(fù)「m」獲取!

          推薦閱讀:

          1、史上最全 Redis 總結(jié),你想知道的都在這里啦!
          2、學(xué) Redis,至少要看看這篇!7000 字小結(jié)
          3、Redis 使用的 10 個(gè)小技巧!
          4、請(qǐng)收好這一份詳細(xì) & 清晰的計(jì)算機(jī)網(wǎng)絡(luò)基礎(chǔ)學(xué)習(xí)指南!
          5、打造一款高逼格的 Vim 神器!
          6、超清晰的 DNS 原理入門指南!
          關(guān)注微信公眾號(hào)「杰哥的IT之旅」,后臺(tái)回復(fù)「1024」查看更多內(nèi)容,回復(fù)「加群備注:地區(qū)-職業(yè)方向-昵稱?即可加入讀者交流群。


          點(diǎn)個(gè)[在看],是對(duì)杰哥最大的支持!


          瀏覽 69
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  看黄在线网站 | 黑人大鸡 | 亚洲成人在线观看视频 | 青草网址| 丁香色婷婷五月激情综合深爱 |