{eval=Array;=+count(Array);}

国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

問答專欄Q & A COLUMN

Redis是啥?

dongxiawudongxiawu 回答0 收藏1
問題描述:在Java高級里經常見,但是我才學到框架,所請問以Redis是啥,干啥用的?
收藏問題

5條回答

JaysonWang

JaysonWang

回答于2022-06-28 15:05

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


Redis 簡介

Redis 是一個開源(BSD 許可)的、內存中的數據結構存儲系統,它可以用作數據庫、緩存和消息中間件。

為什么要用 Redis

在高并發場景下,如果需要經常連接結果變動頻繁的數據庫,會導致數據庫讀取及存取的速度變慢,數據庫壓力極大。因此我們需要通過緩存來減少數據庫的壓力,使得大量的訪問進來能夠命中緩存,只有少量的需要到數據庫層。由于緩存基于內存,可支持的并發量遠遠大于基于硬盤的數據庫。所以對于高并發設計,緩存的設計是必不可少的一環。而 Redis 作為比較熱門的內存存儲系統之一,由于其對數據持久化的支持,種類豐富的數據結構,使其定位更傾向于內存數據庫,適用于對讀寫效率要求都很高、數據處理業務復雜和對安全性要求較高的系統。

Redis 特征

  1. 單線程,利用 redis 隊列技術將訪問變為串行訪問,消除了傳統數據庫串行控制的開銷。
Redis 的線程模型:
  1. Redis 支持數據的持久化,包括 RDB 的全量持久化,或者 AOF 的增量持久化,從而使得
Redis 掛了,數據是有機會恢復的。也可以將內存中的數據保持在磁盤中,重啟的時候可以再次加載進行使用。
  1. 分布式架構,讀寫分離。
  2. 支持的數據結構豐富。Redis 不僅僅支持簡單的 key-value 類型的數據,同時還提供 list、
set、zset、hash 等數據結構的存儲。
  1. Redis 支持數據的備份,提供成熟的主備同步,故障切換的功能,從而保證了高可用。

Redis Cluster 架構

Redis 搭建方式有很多種,本章主要介紹 Redis Cluster 集群構建方式:Redis 3.0 之后版本支持 Redis Cluster 集群,Redis Cluster 采用無中心結構,每個節點保存數據和整個集群狀態,每個節點都和其他所有節點連接。Redis Cluster 為了保證數據的高可用性,加入了主從模式,一個主節點對應一個或多個從節點,主節點提供數據存取,從節點則是從主節點拉取數據備份,當這個主節點掛掉后,就會有這個從節點選取一個來充當主節點,從而保證集群不會掛掉。主從結構,一是為了純粹的冗余備份,二是為了提升讀性能,比如很消耗性能的 SORT 就可以由從服務器來承擔。Redis 的主從同步是異步進行的,這意味著主從同步不會影響主邏輯,也不會降低 redis 的處理性能。主從架構中,可以考慮關閉主服務器的數據持久化功能,只讓從服務器進行持久化,這樣可以提高主服務器的處理性能。在主從架構中,從服務器通常被設置為只讀模式,這樣可以避免從服務器的數據被誤修改。

評論0 贊同0
  •  加載中...
shiguibiao

shiguibiao

回答于2022-06-28 15:05

redis就是個緩存數據庫,存儲一些熱點數據,提高訪問速度,提高并發量,也可以做分布式鎖,分布式session等,具體參照官網介紹

評論0 贊同0
  •  加載中...
izhuhaodev

izhuhaodev

回答于2022-06-28 15:05

簡單的介紹下,也是一種數據庫,只是與關系型數據庫不同(oracle、mysql等)的是,它是將數據存儲到內存里面,也就是當服務器或者說項目,宕機了的情況下,會大幾率會丟失數據(不過redis有快照和備份的功能,可以減低風險)。

樓主目前學習到了框架,等到了學習集成不同框架的時候,可以集成redis框架進行數據讀寫來試試看哦。

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

——沒事待在家里不出門的 居家程序員。(我不想脫發!)

評論0 贊同0
  •  加載中...
tracymac7

tracymac7

回答于2022-06-28 15:05

作者:我沒有三顆心臟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 作為緩存的讀取邏輯如下圖所示:

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

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

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

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

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

關于使用內存存儲數據,我知道谷歌好像就是把所有互聯網的數據都存儲在內存條的,所以才會有如此高質量、高效的搜索,但它畢竟是谷歌…
高速讀/寫的場合

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

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

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

  1. 當一個請求到達服務器時,只是把業務數據在 Redis 上進行讀寫,而沒有對數據庫進行任何的操作,這樣就能大大提高讀寫的速度,從而滿足高速響應的需求;
  2. 但是這些緩存的數據仍然需要持久化,也就是存入數據庫之中,所以在一個請求操作完 Redis 的讀/寫之后,會去判斷該高速讀/寫的業務是否結束,這個判斷通常會在秒殺商品為0,紅包金額為0時成立,如果不成立,則不會操作數據庫;如果成立,則觸發事件將 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中有四種可供我們選擇的工廠模型,它們分別是:

  • JredisConnectionFactory
  • JedisConnectionFactory
  • LettuceConnectionFactory
  • SrpConnectionFactory

我們這里就簡單配置成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確實能在性能方面幫助許多

評論0 贊同0
  •  加載中...
codeKK

codeKK

回答于2022-06-28 15:05

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 類型元素的集合,且不允許重復的元素。

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

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


評論0 贊同0
  •  加載中...

相關問題

最新活動

您已邀請0人回答 查看邀請

我的邀請列表

  • 擅長該話題
  • 回答過該話題
  • 我關注的人
向幫助了您的網友說句感謝的話吧!
付費偷看金額在0.1-10元之間
<