首頁>Club>
在Java高階裡經常見,但是我才學到框架,所請問以Redis是啥,幹啥用的?
7
回覆列表
  • 1 # Trazen

    Redis是一種nosql(非關係型資料庫),也是一個key-value儲存系統,它支援豐富的資料型別,如:string、list、set、zset(sorted set)、hash。

    Redis以記憶體作為資料儲存介質,所以讀寫資料的效率極高,遠遠超過資料庫。以設定和獲取一個256位元組字串為例,它的讀取速度可高達110000次/s,寫速度高達81000次/s。

  • 2 # IT技術管理那些事兒

    作者:我沒有三顆心臟Redis 概述

    在我們日常的Java Web開發中,無不都是使用資料庫來進行資料的儲存,由於一般的系統任務中通常不會存在高併發的情況,所以這樣看起來並沒有什麼問題,可是一旦涉及大資料量的需求,比如一些商品搶購的情景,或者是主頁訪問量瞬間較大的時候,單一使用資料庫來儲存資料的系統會因為面向磁碟,磁碟讀/寫速度比較慢的問題而存在嚴重的效能弊端,一瞬間成千上萬的請求到來,需要系統在極短的時間內完成成千上萬次的讀/寫操作,這個時候往往不是資料庫能夠承受的,極其容易造成資料庫系統癱瘓,最終導致服務宕機的嚴重生產問題。

    NoSQL 技術

    為了克服上述的問題,Java Web專案通常會引入NoSQL技術,這是一種基於記憶體的資料庫,並且提供一定的持久化功能。

    Redis和MongoDB是當前使用最廣泛的NoSQL,而就Redis技術而言,它的效能十分優越,可以支援每秒十幾萬此的讀/寫操作,其效能遠超資料庫,並且還支援叢集、分散式、主從同步等配置,原則上可以無限擴充套件,讓更多的資料儲存在記憶體中,更讓人欣慰的是它還支援一定的事務能力,這保證了高併發的場景下資料的安全和一致性。

    Redis 在 Java Web 中的應用

    Redis 在 Java Web 主要有兩個應用場景:

    儲存 快取 用的資料;需要高速讀/寫的場合使用它快速讀/寫;快取

    在日常對資料庫的訪問中,讀操作的次數遠超寫操作,比例大概在 1:9 到 3:7,所以需要讀的可能性是比寫的可能大得多的。當我們使用SQL語句去資料庫進行讀寫操作時,資料庫就會去磁碟把對應的資料索引取回來,這是一個相對較慢的過程。

    如果我們把資料放在 Redis 中,也就是直接放在記憶體之中,讓服務端直接去讀取記憶體中的資料,那麼這樣速度明顯就會快上不少,並且會極大減小資料庫的壓力,但是使用記憶體進行資料儲存開銷也是比較大的,限於成本的原因,一般我們只是使用 Redis 儲存一些常用和主要的資料,比如使用者登入的資訊等。

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

    **業務資料常用嗎?命中率如何?**如果命中率很低,就沒有必要寫入快取;**該業務資料是讀操作多,還是寫操作多?**如果寫操作多,頻繁需要寫入資料庫,也沒有必要使用快取;**業務資料大小如何?**如果要儲存幾百兆位元組的檔案,會給快取帶來很大的壓力,這樣也沒有必要;

    在考慮了這些問題之後,如果覺得有必要使用快取,那麼就使用它!使用 Redis 作為快取的讀取邏輯如下圖所示:

    從上圖我們可以知道以下兩點:

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

    從上面的分析可以知道,讀操作的可能性是遠大於寫操作的,所以使用 Redis 來處理日常中需要經常讀取的資料,速度提升是顯而易見的,同時也降低了對資料庫的依賴,使得資料庫的壓力大大減少。

    分析了讀操作的邏輯,下面我們來看看寫操作的流程:

    從流程可以看出,更新或者寫入的操作,需要多個 Redis 的操作,如果業務資料寫次數遠大於讀次數那麼就沒有必要使用 Redis。

    關於使用記憶體儲存資料,我知道谷歌好像就是把所有網際網路的資料都儲存在記憶體條的,所以才會有如此高質量、高效的搜尋,但它畢竟是谷歌…高速讀/寫的場合

    在如今的網際網路中,越來越多的存在高併發的情況,比如天貓雙11、搶紅包、搶演唱會門票等,這些場合都是在某一個瞬間或者是某一個短暫的時刻有成千上萬的請求到達伺服器,如果單純的使用資料庫來進行處理,就算不崩,也會很慢的,輕則造成使用者體驗極差使用者量流失,重則資料庫癱瘓,服務宕機,而這樣的場合都是不允許的!

    所以我們需要使用 Redis 來應對這樣的高併發需求的場合,我們先來看看一次請求操作的流程圖:

    我們來進一步闡述這個過程:

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

    把 Redis 下載下來後找到一個合適的地方解壓,就能得到如下圖所示的目錄(這裡空格被替換成了%20…):

    為了方便啟動,我們在該目錄下新建一個 startup.cmd 的檔案,然後將以下內容寫入檔案:

    這個命令其實就是在呼叫 redis-server.exe 命令來讀取 redis.window.conf 的內容,我們雙擊剛才建立好的 startup.cmd 檔案,就能成功的看到 Redis 啟動:

    我們可以開啟同一個資料夾下的 redis-cli.exe 檔案,這是 Redis 自帶的一個客戶端工具,它可以用來連線到我們當前的 Redis 伺服器,我們做以下測試:

    如此,我們便在 Windows 的環境下安裝好了 Redis。

    在 Java 中使用 Redis第一步:新增 Jedis 依賴

    想要在 Java 中使用 Redis 快取,需要新增相關的Jar包依賴

    把它匯入工程中去就可以啦,下面我們來對Redis的寫入效能做一下測試:

    據說 Redis 的效能能達到十萬級別,我不敢相信我的桌上型電腦電腦只有十分之一不到的效能,雖然說這裡不是流水線的操作,會造成一定的影響,但我還是不信邪,我查到了官方的效能測試方法:

    **然後輸入命令:【redis-benchmark -n 100000 -q】:**來同時執行10萬個請求測試效能

    好吧,我同時在我的筆記本上測試了一下,結果更加慘淡…low啊low…

    第二步:使用 Redis 連線池

    跟資料庫連線池相同,Java Redis也同樣提供了類來管理我們的Reids連線池物件,並且我們可以使用來對連線池進行配置,程式碼如下:

    Redis 只能支援六種資料型別(string/hash/list/set/zset/hyperloglog)的操作,但在 Java 中我們卻通常以類物件為主,所以在需要 Redis 儲存的五中資料型別與 Java 物件之間進行轉換,如果自己編寫一些工具類,比如一個角色物件的轉換,還是比較容易的,但是涉及到許多物件的時候,這其中無論工作量還是工作難度都是很大的,所以總體來說,就操作物件而言,使用 Redis 還是挺難的,好在 Spring 對這些進行了封裝和支援。

    第三步:在 Spring 中使用 Redis

    上面說到了 Redis 無法操作物件的問題,無法在那些基礎型別和 Java 物件之間方便的轉換,但是在 Spring 中,這些問題都可以透過使用RedisTemplate得到解決!

    想要達到這樣的效果,除了 Jedis 包以外還需要在 Spring 引入 spring-data-redis 包:https://mvnrepository.com/artifact/org.springframework.data/spring-data-redis

    這裡把2.0.7最新版本標紅的意思是:別老想著使用最新的Jar包,特別是涉及到框架的一些東西,筆者用實際的操作體驗告訴你們,引入該版本的包是會導致Jar包衝突的(也就是莫名其妙的錯誤),我乖乖換回了1.7.2的版本,程式碼就通了…我們來看看怎麼做吧:

    (1)第一步:使用Spring配置JedisPoolConfig物件

    大部分的情況下,我們還是會用到連線池的,於是先用 Spring 配置一個 JedisPoolConfig 物件:

    (2)第二步:為連線池配置工廠模型

    好了,我們現在配置好了連線池的相關屬性,那麼具體使用哪種工廠實現呢?在Spring Data Redis中有四種可供我們選擇的工廠模型,它們分別是:

    JredisConnectionFactoryJedisConnectionFactoryLettuceConnectionFactorySrpConnectionFactory

    我們這裡就簡單配置成JedisConnectionFactory:

    (3)第三步:配置RedisTemplate

    普通的連線根本沒有辦法直接將物件直接存入 Redis 記憶體中,我們需要替代的方案:將物件序列化(可以簡單的理解為繼承Serializable介面)。我們可以把物件序列化之後存入Redis快取中,然後在取出的時候又透過轉換器,將序列化之後的物件反序列化回物件,這樣就完成了我們的要求:

    RedisTemplate可以幫助我們完成這份工作,它會找到對應的序列化器去轉換Redis的鍵值:

    筆者從《JavaEE網際網路輕量級框架整合開發》中瞭解到,這一步需要配置單獨的序列化器去支撐這一步的工作,但是自己在測試當中,發現只要我們的POJO類實現了Serializable介面,就不會出現問題…所以我直接省略掉了配置序列化器這一步…

    (4)第四步:編寫測試

    首先編寫好支援我們測試的POJO類:

    然後編寫測試類:

    執行可以成功看到結果:

    第四步:在 SpringBoot 中使用 Redis

    (1)在SpringBoot中新增Redis依賴:

    (2)新增配置檔案:

    在SpringBoot中使用或者都可以,這裡給出的例子,因為自己的檔案看上去感覺亂糟糟的:

    (3)測試訪問:

    透過上面這段極為簡單的測試案例演示瞭如何透過自動配置的StringRedisTemplate物件進行Redis的讀寫操作,該物件從命名中就可注意到支援的是String型別。原本是RedisTemplate<K, V>介面,StringRedisTemplate就相當於RedisTemplate<String, String>的實現。

    執行測試,如果一切成功則不會報錯,如果我們沒有拿到或者拿到的數不是我們想要的 “111” ,那麼則會報錯,這是使用Assert的好處(下面是我改成112之後執行報錯的結果):

    (4)儲存物件:

    這一步跟上面使用Spring一樣,只需要將POJO類實現Serializable介面就可以了,我這裡就貼一下測試程式碼:

    仍然沒有任何問題:

    直接黏上兩段簡單的示例程式碼:

    在Redis中操作List在Redis中操作Hash總結

    在網上看到了關於MySQL的效能測試,讀寫操作大概就每秒1000以下的樣子,而且這還和引擎相關,所以可以看出Redis確實能在效能方面幫助許多

  • 3 # 雲渺書齋

    Redis簡介

    Redis是一個開源的使用ANSI C語言編寫、遵守BSD協議、支援網路、可基於記憶體亦可持久化的日誌型、Key-Value資料庫,並提供多種語言的API。Reis通常被稱為資料結構伺服器,因為值(value)可以是 字串(String), 雜湊(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等型別。

    特點

    Redis是一個高效能的key-value資料庫,其主要特點:

    Redis支援資料的持久化,可以將記憶體中的資料儲存在磁碟中,重啟的時候可以再次載入進行使用。

    Redis不僅僅支援簡單的key-value型別的資料,同時還提供list,set,zset,hash等資料結構的儲存。

    Redis支援資料的備份,即master-slave模式的資料備份。

    優點

    效能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s 。

    豐富的資料型別 – Redis支援二進位制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 資料型別操作。

    原子 – Redis的所有操作都是原子性的,意思就是要麼成功執行要麼失敗完全不執行。單個操作是原子性的。多個操作也支援事務,即原子性,透過MULTI和EXEC指令包起來。

    豐富的特性 – Redis還支援 publish/subscribe, 通知, key 過期等等特性。

    五種資料型別

    Redis吳忠資料型別為字串(String),雜湊(Hash), 列表(list), 集合(sets)和有序集合(sorted sets)。

    Redis 內部使用一個 redisObject 物件來表示所有的 key 和 value。type 表示一個 value 物件具體是何種資料型別,encoding 是不同資料型別在 Redis 內部的儲存方式。。

    String 是 Redis 最基本的型別,一個 Key 對應一個 Value。Value 可以是 String、數字。Hash是一個鍵值(key-value)的集合。Redis 的 Hash 是一個 String 的 Key 和 Value 的對映表,Hash 特別適合儲存物件。常用命令:hget,hset,hgetall 等。List 列表是簡單的字串列表,按照插入順序排序。可以新增一個元素到列表的頭部(左邊)或者尾部(右邊) 常用命令:lpush、rpush、lpop、rpop、lrange(獲取列表片段)等。Set 是 String 型別的無序集合。集合是透過 hashtable 實現的。Set 中的元素是沒有順序的,而且是沒有重複的。常用命令:sdd、spop、smembers、sunion 等。sorted sets和 Set 一樣是 String 型別元素的集合,且不允許重複的元素。

    如果解決了你的疑惑,請點點關注和評論,謝謝大家支援。

    正春華枝俏,待秋實果茂,與君共勉。

  • 4 # 居家程式設計師

    簡單的介紹下,也是一種資料庫,只是與關係型資料庫不同(oracle、mysql等)的是,它是將資料儲存到記憶體裡面,也就是當伺服器或者說專案,宕機了的情況下,會大機率會丟失資料(不過redis有快照和備份的功能,可以減低風險)。

    樓主目前學習到了框架,等到了學習整合不同框架的時候,可以整合redis框架進行資料讀寫來試試看哦。

    更詳細的可以看這個博文,描述的很詳細呢(http://www.cnblogs.com/qunshu/p/3196972.html)

  • 5 # 啟迪雲Tuscloud

    持久化Redis是典型的key-value型資料庫,我們通常把伺服器的非空資料庫及鍵值對統稱為資料庫狀態。因為Redis是記憶體資料庫,它把自己的資料庫狀態儲存在記憶體中,所以一旦發生停電或者其他因素使主機宕機,那麼資料將會丟失,所以Redis引入了持久化操作,它把Redis在記憶體中的資料庫狀態持久化到硬碟,當伺服器重新啟動的時候,去載入硬碟中的持久化檔案就可恢復現場狀態.

    Redis有兩種持久化方式:RDB持久化和AOF持久化,前者是透過把資料庫狀態的鍵值對儲存起來,而AOF則是把命令儲存起來,那麼伺服器是使用哪種持久化呢?因為AOF檔案更新頻率更高,所以優先AOF.接下來將分別介紹兩種持久化方式

    RDB持久化

    建立RDB檔案:

    伺服器可以透過save和bgsave來實現rdb持久化,前者會阻塞伺服器程序,導致在進行save操作期間,伺服器無法繼續處理客戶端請求;bgsave則會派生一個子程序,讓子程序去進行持久化操作,而伺服器程序繼續響應客戶端.這裡要說明的是bgsave和save這兩個操作無法同時進行,因為會出現競爭條件.

    由於bgsave會建立子程序來進行持久化操作,並不阻礙伺服器程序處理其他事,所以我們可以讓伺服器每隔一段時間執行一次bgsave,因此可以透過設定儲存條件來讓伺服器執行bgsave操作.

    好,現在我們真正講述Redis是如何檢查儲存條件滿足與否!

    Redis伺服器有個週期性函式serverCron,預設每隔100ms執行一次,Redis就是透過它來檢測儲存條件

    介紹到這裡,我們我們已經知道RDB持久化操作的時機和方式,接下來一起看看RDB的檔案結構.

    REDIS長度5位元組,儲存著"R" "E" "D" "I" "S" 五個字元,可用來判斷檔案是否是rdb檔案db_version長度為4位元組,值為整數型字串,代表rdb檔案的版本號.比如0006databases 資料庫狀態,包含一個或多個數據庫,以及各個資料庫中的鍵值對EOF常量,1位元組,標誌著rdb檔案的結束check_sum:8位元組的校驗和,程式透過對REDIS,db_version,databases,EOF四部分計算得來,伺服器載入rdb檔案時,會將檔案計算得來的校驗和與該值對比,依次來檢測rdb檔案正確性.

    知道它的結構後,我們具體看看是如何儲存的:

    databases

    有幾個非空資料庫則儲存幾個,每個非空資料庫又包含SELECTDB db_number key_value_pairs,

    SELECTDB常用為1位元組,當程式讀到這個值時,知道自己要選擇資料庫,db_number資料庫號,

    key_value_pairs為當前資料庫中所有的鍵值對

    key_value_pairs:Type有以下幾種型別

    key總是字串型別,鍵值對的形式與鍵是否帶過期值有關,詳情參考上圖,接下來一起學習value

    value的編碼字串物件:字串物件的格式主要分為兩種,一種是原樣,一種是壓縮後的,int型字串原樣輸出,raw編碼的如果長度大於20byte採取壓縮形式,否則和int型相同.分別如下所示列表物件集合物件(同列表)集合物件:同集合,不過是元素項開頭加了一個score雜湊表物件:依次table_size key1 value1 key2 value2INTSET 整數集合ziplist編碼的列表,雜湊表或有序集合

    到這裡RDF持久化基本描述完畢(對rdb檔案分析感興趣的可以自己看),接下來一起學習AOFAOF持久化

    與RDB持久化儲存資料庫中的鍵值對來記錄資料庫不同,AOF持久化是透過記錄Redis伺服器所執行的寫命令來記錄資料庫狀態的.那麼AOF持久化具體怎麼實現的呢?

    AOF持久化的功能實現可描述為命令追加(append),檔案寫入,檔案同步(sync)三個步驟

    命令追加:伺服器每執行一次寫命令,就把對應的命令請求協議內容新增到aof_buf緩衝區檔案寫入和檔案同步

    AOF檔案的載入與資料還原AOF重寫

    由於AOF檔案更行頻率很高,使用者會有大量的寫命令,如果每次都記錄,則會浪費大量空間,所以Redis實現了AOF重寫功能:首先從資料庫中讀取鍵現在的值,然後用一條命令去記錄鍵值對,代替之前記錄這個鍵值對的多條命令

    AOF後臺重寫

    由於redis會伴隨大量的寫入操作,如果伺服器去執行aof重寫,則可能長時間阻塞,於是伺服器使用子程序來進行aof重寫,子程序持有伺服器程序的資料副本.然而在子程序每次重寫期間,伺服器又會有新的寫請求,那麼如何解決這個資料不一致問題呢?

    為了解決這個問題,Redis伺服器設定了一個aof重寫緩衝區,在建立了子程序時,開始使用緩衝區,在子程序重寫期間,每當Redis伺服器有新的寫操作,都會把命令同時發給aof緩衝區和重寫緩衝區,這樣一來

    AOF緩衝區的內容會定期被寫人和同步到AOF檔案,對現有AOF檔案的處理工作如常進行。從建立子程序開始,伺服器執行的所有寫命令都會被記錄到AOF重寫緩衝區裡面.

    當子程序完成AOF重寫工作之後,它會向父程序傳送一個訊號,父程序在接到該訊號後:

    將AOF重寫緩衝區中的所有內容寫入到新AOF檔案中,這時新AOF檔案所儲存的資料庫狀態將和伺服器當前的資料庫狀態一致。對新的AOF檔案進行改名,原子地(atomic)覆蓋現有的AOF檔案,完成新舊兩個AOF檔案的替換。

  • 6 # Java猿

    redis就是個快取資料庫,儲存一些熱點資料,提高訪問速度,提高併發量,也可以做分散式鎖,分散式session等,具體參照官網介紹

  • 7 # 雲計算那些事兒

    想要了解Redis,先從Redis是什麼?為何要用Redis?有哪些特性,以及其叢集架構來幾個方面來了解。

    Redis 簡介Redis 是一個開源(BSD 許可)的、記憶體中的資料結構儲存系統,它可以用作資料庫、快取和訊息中介軟體。為什麼要用 Redis在高併發場景下,如果需要經常連線結果變動頻繁的資料庫,會導致資料庫讀取及存取的速度變慢,資料庫壓力極大。因此我們需要透過快取來減少資料庫的壓力,使得大量的訪問進來能夠命中快取,只有少量的需要到資料庫層。由於快取基於記憶體,可支援的併發量遠遠大於基於硬碟的資料庫。所以對於高併發設計,快取的設計是必不可少的一環。而 Redis 作為比較熱門的記憶體儲存系統之一,由於其對資料持久化的支援,種類豐富的資料結構,使其定位更傾向於記憶體資料庫,適用於對讀寫效率要求都很高、資料處理業務複雜和對安全性要求較高的系統。

    Redis 特徵

    單執行緒,利用 redis 佇列技術將訪問變為序列訪問,消除了傳統資料庫序列控制的開銷。Redis 的執行緒模型:Redis 支援資料的持久化,包括 RDB 的全量持久化,或者 AOF 的增量持久化,從而使得Redis 掛了,資料是有機會恢復的。也可以將記憶體中的資料保持在磁碟中,重啟的時候可以再次載入進行使用。分散式架構,讀寫分離。支援的資料結構豐富。Redis 不僅僅支援簡單的 key-value 型別的資料,同時還提供 list、set、zset、hash 等資料結構的儲存。Redis 支援資料的備份,提供成熟的主備同步,故障切換的功能,從而保證了高可用。Redis Cluster 架構Redis 搭建方式有很多種,本章主要介紹 Redis Cluster 叢集構建方式:Redis 3.0 之後版本支援 Redis Cluster 叢集,Redis Cluster 採用無中心結構,每個節點儲存資料和整個叢集狀態,每個節點都和其他所有節點連線。Redis Cluster 為了保證資料的高可用性,加入了主從模式,一個主節點對應一個或多個從節點,主節點提供資料存取,從節點則是從主節點拉取資料備份,當這個主節點掛掉後,就會有這個從節點選取一個來充當主節點,從而保證叢集不會掛掉。主從結構,一是為了純粹的冗餘備份,二是為了提升讀效能,比如很消耗效能的 SORT 就可以由從伺服器來承擔。Redis 的主從同步是非同步進行的,這意味著主從同步不會影響主邏輯,也不會降低 redis 的處理效能。主從架構中,可以考慮關閉主伺服器的資料持久化功能,只讓從伺服器進行持久化,這樣可以提高主伺服器的處理效能。在主從架構中,從伺服器通常被設定為只讀模式,這樣可以避免從伺服器的資料被誤修改。

  • 中秋節和大豐收的關聯?
  • 為什麼現在的小孩兒上個學,老師給家長留的作業更多?