Redis基礎知識入門

參考Redis【入門】就這一篇!

Redis概述

平常做Web小項目時都是直接使用mysql等數據庫,在磁盤上進行數據的存取,由於一般的系統任務中通常不會存在高併發的情況,所以沒什麼問題,但是一旦涉及大數據量的需求,比如商品搶購使得主頁訪問量瞬間極大的時候,如果僅僅使用數據庫來保存數據,會因爲磁盤讀/寫速度太慢而造成數據庫系統癱瘓。

NoSQL 技術

**MySQL(關係型數據庫)**需要把數據存儲到庫、表、行、字段裏,查詢的時候根據條件一行一行地去匹配,當查詢量非常大的時候就很耗費時間和資源,尤其是數據是需要從磁盤裏去檢索。

NoSQL(非關係型的數據庫) 存儲原理非常簡單(典型的數據類型爲k-v),不存在繁雜的關係鏈,不需要像mysql那樣需要找到對應的庫、表(通常是多個表)以及字段。
NoSQL數據可以存儲在內存裏,查詢速度非常快。
NoSQL在性能表現上雖然能優於關係型數據庫,但是它並不能完全替代關係型數據庫。
NoSQL因爲沒有複雜的數據結構,擴展非常容易,支持分佈式

RedisMongoDB是當前使用最廣泛的NoSQL,而就Redis技術而言,它的性能十分優越,可以支持每秒十幾萬此的讀/寫操作。

Redis值的五種類型

String 整數,浮點數或者字符串
Set 集合
Zset 有序集合
Hash 散列表
List 列表

Redis在Web開發中的應用

Redis 在應用中主要分成兩部分

  • 同時使用Redis和數據庫
  • 只使用Redis,事後再更新數據庫

1、同時使用Redis和數據庫

在日常對數據庫的訪問中,讀操作的次數遠超寫操作。當我們使用SQL語句去數據庫進行讀寫操作時,數據庫就會去磁盤把對應的數據索引取回來,這是一個相對較慢的過程。

如果我們把數據放在 Redis 中,也就是直接放在內存之中,讓服務端直接去讀取內存中的數據,那麼這樣速度明顯就會快上不少,並且會極大減小數據庫的壓力,但是內存容量有限,限於成本的原因,一般我們只是使用 Redis 存儲一些常用和主要的數據,比如用戶登錄的信息等。

一般而言在使用 Redis 進行存儲的時候,我們需要從以下幾個方面來考慮:

  • **數據常用嗎?命中率如何?**如果數據不常用,緩存命中率很低,就沒有必要寫入緩存;
  • **是讀操作多,還是寫操作多?**如果寫操作多,頻繁需要寫入數據庫,也沒有必要使用緩存;
  • **數據大小如何?**如果要存儲幾百兆字節的文件,會給緩存帶來很大的壓力,這樣也沒有必要;

Redis 讀操作邏輯:

img

  1. 第一次讀取數據的時候,讀取 Redis 的數據就會失敗,此時就會觸發程序讀取數據庫,把數據讀取出來,並且寫入 Redis 中;
  2. 第二次以及以後需要讀取數據時,就會直接讀取 Redis,讀到數據後就結束了流程,這樣速度就大大提高了。

Redis 寫操作邏輯:

img

可見寫操作不僅要寫入數據庫,還要同時寫入Redis,因此如果寫次數遠大於讀次數那麼就沒有必要使用 Redis。

2、只使用Redis,事後再更新數據庫

高併發的情況爲了追求極致的速度,只讀寫Redis,等高併發請求結束後再將Redis上的數據同步到數據庫中,此時,一次請求操作的流程圖如下:

img

  1. 當一個請求到達服務器時,只是把數據在 Redis 上讀寫而沒有對數據庫進行任何的操作,這樣就能大大提高讀寫的速度,從而滿足高速響應的需求;
  2. 但是這些緩存的數據仍然需要持久化,也就是存入數據庫之中,所以在一個請求操作完 Redis 的讀/寫之後,會去判斷該高速讀/寫的業務是否結束,這個判斷通常會在秒殺商品爲0,紅包金額爲0時成立,如果不成立,則不會操作數據庫;如果成立,則觸發事件將 Redis 的緩存的數據以批量的形式一次性寫入數據庫,從而完成持久化的工作。

Redis其他內容

1、緩存穿透、緩存擊穿、緩存雪崩

問題:

  • **緩存穿透:**持續向服務器請求不存在於服務器中的數據。先在Redis中查詢,查詢不到後去數據庫中查詢(都找不到)。
  • **緩存擊穿:**一個很熱門的數據,突然失效,大量請求到服務器數據庫中
  • **緩存雪崩:**大量數據同一時間失效。

解決方法:

  • 緩存穿透:

    1.接口層增加校驗,攔截對肯定不存在的數據的請求;

    2.先後訪問緩存和數據庫都沒有取到數據,這時可以將key-value對寫爲key-null,這樣可以防止惡意用戶反覆用同一個id暴力攻擊。

  • 緩存擊穿:設置熱點數據永不過期。

  • 緩存雪崩:

    1.緩存數據的過期時間設置隨機,防止同一時間大量數據過期現象發生。
    2.如果緩存數據庫是分佈式部署,將熱點數據均勻分佈在不同的緩存數據庫中。

2、redis存取使用單線程

原因:

  1. redis是基於內存的,內存的讀寫速度非常快(純內存)。
  2. redis是單線程的,省去了很多上下文切換線程的時間(避免線程切換和競態消耗)。
  3. redis使用多路複用技術,可以處理併發的連接(非阻塞IO)。

在mysql等數據庫技術中需要進行磁盤I/O,等待I/O時間很長,應該把CPU讓給其他線程進行存取,所以用多線程存取效率更高。而redis不需要磁盤I/O,性能瓶頸不在CPU而在內存大小和網絡帶寬上,因此用單線程+多路複用技術足夠了。

Redis還有很多內容面試時會問到,到時再學吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章