溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發(fā)布時間:2020-06-13 20:59:11 來源:網(wǎng)絡 閱讀:371 作者:powertoolsteam 欄目:關系型數(shù)據(jù)庫

本文由葡萄城技術團隊編撰并首發(fā)

轉載請注明出處:葡萄城官網(wǎng),葡萄城為開發(fā)者提供專業(yè)的開發(fā)工具、解決方案和服務,賦能開發(fā)者。

引言

在Web應用發(fā)展的初期,那時關系型數(shù)據(jù)庫受到了較為廣泛的關注和應用,原因是因為那時候Web站點基本上訪問和并發(fā)不高、交互也較少。而在后來,隨著訪問量的提升,使用關系型數(shù)據(jù)庫的Web站點多多少少都開始在性能上出現(xiàn)了一些瓶頸,而瓶頸的源頭一般是在磁盤的I/O上。而隨著互聯(lián)網(wǎng)技術的進一步發(fā)展,各種類型的應用層出不窮,這導致在當今云計算、大數(shù)據(jù)盛行的時代,對性能有了更多的需求,主要體現(xiàn)在以下四個方面:

  1. 低延遲的讀寫速度:應用快速地反應能極大地提升用戶的滿意度

  2. 支撐海量的數(shù)據(jù)和流量:對于搜索這樣大型應用而言,需要利用PB級別的數(shù)據(jù)和能應對百萬級的流量

  3. 大規(guī)模集群的管理:系統(tǒng)管理員希望分布式應用能更簡單的部署和管理

  4. 龐大運營成本的考量:IT部門希望在硬件成本、軟件成本和人力成本能夠有大幅度地降低

為了克服這一問題,NoSQL應運而生,它同時具備了高性能、可擴展性強、高可用等優(yōu)點,受到廣泛開發(fā)人員和倉庫管理人員的青睞。

Redis是什么

Redis是現(xiàn)在最受歡迎的NoSQL數(shù)據(jù)庫之一,Redis是一個使用ANSI C編寫的開源、包含多種數(shù)據(jù)結構、支持網(wǎng)絡、基于內存、可選持久性的鍵值對存儲數(shù)據(jù)庫,其具備如下特性:

  • 基于內存運行,性能高效

  • 支持分布式,理論上可以無限擴展

  • key-value存儲系統(tǒng)

  • 開源的使用ANSI C語言編寫、遵守BSD協(xié)議、支持網(wǎng)絡、可基于內存亦可持久化的日志型、Key-Value數(shù)據(jù)庫,并提供多種語言的API

相比于其他數(shù)據(jù)庫類型,Redis具備的特點是:

  • C/S通訊模型

  • 單進程單線程模型

  • 豐富的數(shù)據(jù)類型

  • 操作具有原子性

  • 持久化

  • 高并發(fā)讀寫

  • 支持lua腳本

哪些大廠在使用Redis?

  • github

  • twitter

  • 微博

  • Stack Overflow

  • 阿里巴巴

  • 百度

  • 美團

  • 搜狐

Redis的應用場景有哪些?

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

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

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

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

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

String類型:

它是一個二進制安全的字符串,意味著它不僅能夠存儲字符串、還能存儲圖片、視頻等多種類型, 最大長度支持512M。

對每種數(shù)據(jù)類型,Redis都提供了豐富的操作命令,如:

  • GET/MGET

  • SET/SETEX/MSET/MSETNX

  • INCR/DECR

  • GETSET

  • DEL

哈希類型:

該類型是由field和關聯(lián)的value組成的map。其中,field和value都是字符串類型的。

Hash的操作命令如下:

  • HGET/HMGET/HGETALL

  • HSET/HMSET/HSETNX

  • HEXISTS/HLEN

  • HKEYS/HDEL

  • HVALS

列表類型:

該類型是一個插入順序排序的字符串元素集合, 基于雙鏈表實現(xiàn)。

List的操作命令如下:

  • LPUSH/LPUSHX/LPOP/RPUSH/RPUSHX/RPOP/LINSERT/LSET

  • LINDEX/LRANGE

  • LLEN/LTRIM

集合類型:

Set類型是一種無順序集合, 它和List類型最大的區(qū)別是:集合中的元素沒有順序, 且元素是唯一的。

Set類型的底層是通過哈希表實現(xiàn)的,其操作命令為:

  • SADD/SPOP/SMOVE/SCARD

  • SINTER/SDIFF/SDIFFSTORE/SUNION

Set類型主要應用于:在某些場景,如社交場景中,通過交集、并集和差集運算,通過Set類型可以非常方便地查找共同好友、共同關注和共同偏好等社交關系。

順序集合類型:

ZSet是一種有序集合類型,每個元素都會關聯(lián)一個double類型的分數(shù)權值,通過這個權值來為集合中的成員進行從小到大的排序。與Set類型一樣,其底層也是通過哈希表實現(xiàn)的。

ZSet命令:

  • ZADD/ZPOP/ZMOVE/ZCARD/ZCOUNT

  • ZINTER/ZDIFF/ZDIFFSTORE/ZUNION

Redis的數(shù)據(jù)結構

Redis的數(shù)據(jù)結構如下圖所示:

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

關于上表中的部分釋義:

  1. 壓縮列表是列表鍵和哈希鍵的底層實現(xiàn)之一。當一個列表鍵只包含少量列表項,并且每個列表項要么就是小整數(shù),要么就是長度比較短的字符串,Redis就會使用壓縮列表來做列表鍵的底層實現(xiàn)

  2. 整數(shù)集合是集合鍵的底層實現(xiàn)之一,當一個集合只包含整數(shù)值元素,并且這個集合的元素數(shù)量不多時,Redis就會使用整數(shù)集合作為集合鍵的底層實現(xiàn)

如下是定義一個Struct數(shù)據(jù)結構的例子:

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

?

簡單動態(tài)字符串SDS (Simple Dynamic String)

基于C語言中傳統(tǒng)字符串的缺陷,Redis自己構建了一種名為簡單動態(tài)字符串的抽象類型,簡稱SDS,其結構如下:

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

SDS幾乎貫穿了Redis的所有數(shù)據(jù)結構,應用十分廣泛。

SDS的特點

和C字符串相比,SDS的特點如下:

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

  1. 常數(shù)復雜度獲取字符串長度

    Redis中利用SDS字符串的len屬性可以直接獲取到所保存的字符串的長
    度,直接將獲取字符串長度所需的復雜度從C字符串的O(N)降低到了O(1)。

  2. 減少修改字符串時導致的內存重新分配次數(shù)

    通過C字符串的特性,我們知道對于一個包含了N個字符的C字符串來說,其底層實現(xiàn)總是N+1個字符長的數(shù)組(額外一個空字符結尾)

    那么如果這個時候需要對字符串進行修改,程序就需要提前對這個C字符串數(shù)組進行一次內存重分配(可能是擴展或者釋放) 

    而內存重分配就意味著是一個耗時的操作。

Redis巧妙的使用了SDS避免了C字符串的缺陷。在SDS中,buf數(shù)組的長度不一定就是字符串的字符數(shù)量加一,buf數(shù)組里面可以包含未使用的字節(jié),而這些未使用的字節(jié)由free屬性記錄。

與此同時,SDS采用了空間預分配的策略,避免C字符串每一次修改時都需要進行內存重分配的耗時操作,將內存重分配從原來的每修改N次就分配N次——>降低到了修改N次最多分配N次。

如下是Redis對SDS的簡單定義:

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

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

Redis特性1:事務

  • 命令序列化,按順序執(zhí)行

  • 原子性

  • 三階段: 開始事務 - 命令入隊 - 執(zhí)行事務

  • 命令:MULTI/EXEC/DISCARD

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

  • Pub/sub是一種消息通訊模式

  • Pub發(fā)送消息, Sub接受消息

  • Redis客戶端可以訂閱任意數(shù)量的頻道

  • “fire and forgot”, 發(fā)送即遺忘

  • 命令:Publish/Subscribe/Psubscribe/UnSub

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

Redis特性3:Stream

  • Redis 5.0新增

  • 等待消費

  • 消費組(組內競爭)

  • 消費歷史數(shù)據(jù)

  • FIFO

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

?

?

?

以上就是Redis的基本概念,下面我們將介紹在開發(fā)過程中可能會踩到的“坑”。

Redis常見問題解析:擊穿

概念:在Redis獲取某一key時, 由于key不存在, 而必須向DB發(fā)起一次請求的行為, 稱為“Redis擊穿”。

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

引發(fā)擊穿的原因:

  • 第一次訪問

  • 惡意訪問不存在的key

  • Key過期

合理的規(guī)避方案:

  • 服務器啟動時, 提前寫入

  • 規(guī)范key的命名, 通過中間件攔截

  • 對某些高頻訪問的Key,設置合理的TTL或永不過期

Redis常見問題解析:雪崩

概念:Redis緩存層由于某種原因宕機后,所有的請求會涌向存儲層,短時間內的高并發(fā)請求可能會導致存儲層掛機,稱之為“Redis雪崩”。

合理的規(guī)避方案:

  • 使用Redis集群

  • 限流

Redis在產(chǎn)品開發(fā)中的應用實踐

為此,我很高興的為大家介紹,葡萄城架構師Jim將在2019-11-27 14:00 為大家?guī)硪粓龉_課,其中 Jim除了為大家講解Redis的基礎,同時也會實際演示他所在的項目組使用Redis時碰到的問題以及解決方案,對于剛接觸Redis的同學來說,更具參考意義和學習價值,歡迎大家屆時參加,公開課地址:https://live.vhall.com/661463644。

  • 后端采用nodeJS

  • 使用Azure的Redis服務

  • Redis的使用場景

    -? token緩存, 用于令牌驗證

    -? IP白名單

碰到的問題

  • “網(wǎng)絡抖動”或者Redis服務異常導致Redis訪問超時

  • Redis客戶端驅動穩(wěn)定性問題

    -? 連接池 “Broken connection” 問題

    -? JS的Promise引出的Redis重置問題

下面我們來簡單了解一下Redis的進階知識。

進階之Redis協(xié)議簡介

Redis客戶端通訊協(xié)議:RESP(Redis Serialization Protocol),其特點是:

  • 簡單

  • 解析速度快

  • 可讀性好

Redis集群內部通訊協(xié)議:RECP(Redis Cluster Protocol?) ,其特點是:

  • 每一個node兩個tcp 連接

  • 一個負責client-server通訊(P: 6379)

  • 一個負責node之間通訊(P: 10000 + 6379)

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

Redis協(xié)議支持的數(shù)據(jù)類型:

  • 簡單字符(首字節(jié): “+”)

?????   “+OK\r\n”

  • 錯誤(首字節(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ù)庫

市面上類似于Redis,同樣是NoSQL型的數(shù)據(jù)庫有很多,如下圖所示,除了Redis,還有MemCache、Cassadra和Mongo。下面,我們就分別對這幾個數(shù)據(jù)庫做一下簡要的介紹:

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

?

?

Memcache這是一個和Redis非常相似的數(shù)據(jù)庫,但是它的數(shù)據(jù)類型沒有Redis豐富。Memcache由LiveJournal的Brad Fitzpatrick開發(fā),作為一套分布式的高速緩存系統(tǒng),被許多網(wǎng)站使用以提升網(wǎng)站的訪問速度,對于一些大型的、需要頻繁訪問數(shù)據(jù)庫的網(wǎng)站訪問速度的提升效果十分顯著。

Apache Cassandra(社區(qū)內一般簡稱為C*)這是一套開源分布式NoSQL數(shù)據(jù)庫系統(tǒng)。它最初由Facebook開發(fā),用于儲存收件箱等簡單格式數(shù)據(jù),集Google?BigTable的數(shù)據(jù)模型與Amazon?Dynamo的完全分布式架構于一身。Facebook于2008將 Cassandra 開源,由于其良好的可擴展性和性能,被?Apple、Comcast、Instagram、Spotify、eBay、Rackspace、Netflix等知名網(wǎng)站所采用,成為了一種流行的分布式結構化數(shù)據(jù)存儲方案。

MongoDB:是一個基于分布式文件存儲、面向文檔的NoSQL數(shù)據(jù)庫,由C++編寫,旨在為WEB應用提供可擴展的高性能數(shù)據(jù)存儲解決方案。MongoDB是一個介于關系數(shù)據(jù)庫和非關系數(shù)據(jù)庫之間的產(chǎn)品,是非關系數(shù)據(jù)庫當中功能最豐富,最像關系型數(shù)據(jù)庫的,它支持的數(shù)據(jù)結構非常松散,是一種類似json的BSON格式。

總結

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

?


向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI