{eval=Array;=+count(Array);}
想要了解Redis,先從Redis是什么?為何要用Redis?有哪些特性,以及其集群架構來幾個方面來了解。
Redis 特征
redis就是個緩存數據庫,存儲一些熱點數據,提高訪問速度,提高并發量,也可以做分布式鎖,分布式session等,具體參照官網介紹
簡單的介紹下,也是一種數據庫,只是與關系型數據庫不同(oracle、mysql等)的是,它是將數據存儲到內存里面,也就是當服務器或者說項目,宕機了的情況下,會大幾率會丟失數據(不過redis有快照和備份的功能,可以減低風險)。
樓主目前學習到了框架,等到了學習集成不同框架的時候,可以集成redis框架進行數據讀寫來試試看哦。
更詳細的可以看這個博文,描述的很詳細呢(http://www.cnblogs.com/qunshu/p/3196972.html)
——沒事待在家里不出門的 居家程序員。(我不想脫發!)
作者:我沒有三顆心臟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。
關于使用內存存儲數據,我知道谷歌好像就是把所有互聯網的數據都存儲在內存條的,所以才會有如此高質量、高效的搜索,但它畢竟是谷歌…高速讀/寫的場合
在如今的互聯網中,越來越多的存在高并發的情況,比如天貓雙11、搶紅包、搶演唱會門票等,這些場合都是在某一個瞬間或者是某一個短暫的時刻有成千上萬的請求到達服務器,如果單純的使用數據庫來進行處理,就算不崩,也會很慢的,輕則造成用戶體驗極差用戶量流失,重則數據庫癱瘓,服務宕機,而這樣的場合都是不允許的!
所以我們需要使用 Redis 來應對這樣的高并發需求的場合,我們先來看看一次請求操作的流程圖:
我們來進一步闡述這個過程:
把 Redis 下載下來后找到一個合適的地方解壓,就能得到如下圖所示的目錄(這里空格被替換成了%20…):
為了方便啟動,我們在該目錄下新建一個 startup.cmd 的文件,然后將以下內容寫入文件:
這個命令其實就是在調用 redis-server.exe 命令來讀取 redis.window.conf 的內容,我們雙擊剛才創建好的 startup.cmd 文件,就能成功的看到 Redis 啟動:
上圖的提示信息告訴了我們:① Redis 當前的版本為 3.0.503;**② Redis 運行在 6379 端口;**③ Redis 進程的 PID 為 14748;④ 64 位。
我們可以打開同一個文件夾下的 redis-cli.exe 文件,這是 Redis 自帶的一個客戶端工具,它可以用來連接到我們當前的 Redis 服務器,我們做以下測試:
如此,我們便在 Windows 的環境下安裝好了 Redis。
在 Java 中使用 Redis第一步:添加 Jedis 依賴想要在 Java 中使用 Redis 緩存,需要添加相關的Jar包依賴
把它導入工程中去就可以啦,下面我們來對Redis的寫入性能做一下測試:
據說 Redis 的性能能達到十萬級別,我不敢相信我的臺式機電腦只有十分之一不到的性能,雖然說這里不是流水線的操作,會造成一定的影響,但我還是不信邪,我查到了官方的性能測試方法:
**首先在Redis根目錄下召喚Cmd:**具體方法是按住【Shift】點擊右鍵
**然后輸入命令:【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中有四種可供我們選擇的工廠模型,它們分別是:
我們這里就簡單配置成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確實能在性能方面幫助許多
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 內部的存儲方式。。
如果解決了你的疑惑,請點點關注和評論,謝謝大家支持。
正春華枝俏,待秋實果茂,與君共勉。
0
回答3
回答0
回答0
回答0
回答0
回答0
回答1
回答1
回答1
回答