中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

怎么做網(wǎng)站關(guān)鍵詞搜索廣西網(wǎng)絡(luò)優(yōu)化seo

怎么做網(wǎng)站關(guān)鍵詞搜索,廣西網(wǎng)絡(luò)優(yōu)化seo,企業(yè)門戶網(wǎng)站的安全性,山西太原網(wǎng)站建設(shè)公司哪家好背景 在Java系統(tǒng)實(shí)現(xiàn)過程中,我們不可避免地會(huì)借助大量開源功能組件。然而,這些組件往往功能豐富且體系龐大,官方文檔常常詳盡至數(shù)百頁。而在實(shí)際項(xiàng)目中,我們可能僅需使用其中的一小部分功能,這就造成了一個(gè)挑戰(zhàn)&#…

背景

在Java系統(tǒng)實(shí)現(xiàn)過程中,我們不可避免地會(huì)借助大量開源功能組件。然而,這些組件往往功能豐富且體系龐大,官方文檔常常詳盡至數(shù)百頁。而在實(shí)際項(xiàng)目中,我們可能僅需使用其中的一小部分功能,這就造成了一個(gè)挑戰(zhàn):如何在有限的時(shí)間和精力下,高效地掌握并使用這些組件的核心功能,以實(shí)現(xiàn)投入產(chǎn)出最大化?

針對(duì)這一問題,我基于二八原則,整理編寫本文。

首先,我會(huì)聚焦于組件的常見和核心功能,這些功能通常是我們?cè)谌粘i_發(fā)中頻繁使用到的,也是構(gòu)建穩(wěn)定、高效系統(tǒng)的基石。通過深入了解這些核心功能的使用方法和最佳實(shí)踐,我們可以確保在關(guān)鍵點(diǎn)上投入足夠的精力,從而避免在實(shí)際使用中掉入陷阱。

其次,我會(huì)以問題為導(dǎo)向,將實(shí)用性作為第一要素,對(duì)組件的功能進(jìn)行篩選和整理。這意味著我會(huì)優(yōu)先關(guān)注那些在項(xiàng)目中實(shí)際需要用到的功能,而對(duì)于那些特定場景下才會(huì)用到的功能,我會(huì)在文中提及但不做詳細(xì)展開。這樣做的好處是,我們可以在保證核心功能得到充分理解的同時(shí),減少不必要的閱讀負(fù)擔(dān),提高學(xué)習(xí)效率,降低投入成本。

最后,我會(huì)注重內(nèi)容的精煉和易讀性。通過簡明扼要的文字描述和直觀的示例代碼,幫助讀者快速理解并掌握組件的核心用法。
同時(shí),我也會(huì)結(jié)合經(jīng)驗(yàn)指出常見的問題和注意事項(xiàng),以便讀者在使用過程中能夠規(guī)避一些常見的錯(cuò)誤和陷阱。

綜上所述,通過這個(gè)系列的內(nèi)容整理,我希望能夠幫助讀者在有限的時(shí)間和精力下,高效地掌握并使用這些開源功能組件的核心功能,滿足系統(tǒng)實(shí)現(xiàn)的需要。

注:部分內(nèi)容章節(jié)由AI輔助生成草稿,我對(duì)其進(jìn)行了復(fù)核和修訂,修復(fù)了有問題和有錯(cuò)誤的部分。

理論

Redis是什么?

Redis(Remote Dictionary Server),即遠(yuǎn)程字典服務(wù),是一個(gè)開源的、使用C語言編寫的、支持網(wǎng)絡(luò)的、可基于內(nèi)存亦可持久化的日志型Key-Value數(shù)據(jù)庫,提供多種開發(fā)語言的API,能夠很好地補(bǔ)充關(guān)系數(shù)據(jù)庫在某些場合的不足,并為開發(fā)者提供了豐富的數(shù)據(jù)操作選項(xiàng)和高效的數(shù)據(jù)處理性能。

Redis與關(guān)系型數(shù)據(jù)庫的區(qū)別是什么?

Redis與關(guān)系型數(shù)據(jù)庫在多個(gè)方面存在顯著的區(qū)別,主要涉及以下幾個(gè)方面:
數(shù)據(jù)模型與存儲(chǔ)方式
Redis采用鍵值存儲(chǔ)(Key-Value Store)模型,支持多種數(shù)據(jù)結(jié)構(gòu),包括字符串、哈希、列表、集合、有序集合等,使得數(shù)據(jù)存儲(chǔ)和操作更加靈活。這種模型能夠很好地適應(yīng)各種數(shù)據(jù)存儲(chǔ)需求,且更易于擴(kuò)展和修改。
關(guān)系型數(shù)據(jù)庫則采用表格的形式來組織數(shù)據(jù),數(shù)據(jù)被組織成行和列的形式,并通過外鍵關(guān)系進(jìn)行關(guān)聯(lián),以支持復(fù)雜的關(guān)系模型。這種結(jié)構(gòu)化的數(shù)據(jù)模型有助于數(shù)據(jù)的清晰表示和查詢,但也可能導(dǎo)致數(shù)據(jù)結(jié)構(gòu)相對(duì)固定,不易于靈活修改。

存儲(chǔ)機(jī)制與性能
Redis主要將數(shù)據(jù)存儲(chǔ)在內(nèi)存中,通過持久化機(jī)制可選地將數(shù)據(jù)寫入磁盤。這種設(shè)計(jì)使得Redis能夠?qū)崿F(xiàn)高速的讀寫操作,特別適用于需要快速響應(yīng)的場景。
關(guān)系型數(shù)據(jù)庫通常將數(shù)據(jù)存儲(chǔ)在磁盤上,通過緩存等機(jī)制提高讀取速度。由于磁盤I/O操作通常比內(nèi)存操作慢得多,因此關(guān)系型數(shù)據(jù)庫的讀寫速度相對(duì)較慢。

事務(wù)處理
Redis支持事務(wù),其事務(wù)是基于隊(duì)列實(shí)現(xiàn)的,即創(chuàng)建一個(gè)事務(wù)隊(duì)列,然后將事務(wù)操作都放入到隊(duì)列中,最后依次執(zhí)行,但沒有提供回滾機(jī)制。
關(guān)系型數(shù)據(jù)庫則支持基于ACID的事務(wù),提供更嚴(yán)格的一致性和隔離性。這使得關(guān)系型數(shù)據(jù)庫在處理復(fù)雜的事務(wù)邏輯時(shí)更加可靠。

查詢語言與操作能力
Redis提供簡單的鍵值查詢和一些特定的數(shù)據(jù)結(jié)構(gòu)操作命令??陀^地說,其職責(zé)定位也沒有復(fù)雜查詢的需求。
關(guān)系型數(shù)據(jù)庫使用SQL作為查詢語言,支持復(fù)雜的查詢和連接操作,能夠處理各種復(fù)雜的業(yè)務(wù)邏輯和數(shù)據(jù)關(guān)系。

應(yīng)用場景
Redis適用于需要快速讀寫、對(duì)數(shù)據(jù)結(jié)構(gòu)操作要求較高、需要緩存或?qū)崟r(shí)分析等場景。例如,它可以作為緩存層,減少數(shù)據(jù)庫壓力,提高系統(tǒng)性能;也可以用于實(shí)現(xiàn)分布式鎖、消息隊(duì)列等功能。
關(guān)系型數(shù)據(jù)庫則更適用于需要嚴(yán)格事務(wù)控制、支持復(fù)雜查詢和關(guān)聯(lián)操作的應(yīng)用場景。它們?cè)谄髽I(yè)級(jí)應(yīng)用、數(shù)據(jù)倉庫等領(lǐng)域有著廣泛的應(yīng)用。

綜上所述,Redis與關(guān)系型數(shù)據(jù)庫在數(shù)據(jù)模型、存儲(chǔ)方式、性能、事務(wù)處理、查詢語言以及應(yīng)用場景等方面都存在顯著差異。
關(guān)系型數(shù)據(jù)庫和Redis在應(yīng)用系統(tǒng)中往往是同時(shí)存在,配合使用,用于實(shí)現(xiàn)不同的需求,應(yīng)對(duì)不同的場景。

Redis有哪些特點(diǎn)?

Redis的特點(diǎn)主要體現(xiàn)在其速度快簡單穩(wěn)定等方面。由于Redis數(shù)據(jù)都是緩存在內(nèi)存中,并且采用單線程避免了不必要的上下文切換和競爭條件,因此其讀寫性能非常出色,官方給出的數(shù)字顯示,Redis的讀速度可以達(dá)到110000次/s,寫速度可以達(dá)到81000次/s。此外,Redis還支持主從同步,數(shù)據(jù)可以從主服務(wù)器向任意數(shù)量的從服務(wù)器上同步,從而實(shí)現(xiàn)了數(shù)據(jù)的備份以及讀寫分離。

Redis應(yīng)用場景有哪些?

Redis在多個(gè)場合都有廣泛的應(yīng)用,包括但不限于用作緩存來存儲(chǔ)熱點(diǎn)數(shù)據(jù)、提升數(shù)據(jù)訪問速度、降低數(shù)據(jù)庫壓力;實(shí)現(xiàn)各種復(fù)雜的排行榜應(yīng)用;作為計(jì)數(shù)器記錄如電商網(wǎng)站商品的瀏覽量等;實(shí)現(xiàn)分布式鎖;在社交網(wǎng)絡(luò)應(yīng)用中實(shí)現(xiàn)點(diǎn)贊、關(guān)注等功能;以及在多個(gè)應(yīng)用之間共享數(shù)據(jù)等。

Redis支持哪些數(shù)據(jù)類型?

Redis支持以下五種主要的數(shù)據(jù)類型:

  1. 字符串(String)
    • 是Redis最基本的數(shù)據(jù)類型,一個(gè)key對(duì)應(yīng)一個(gè)value。
    • 字符串類型是二進(jìn)制安全的,這意味著你可以把Redis的字符串類型理解成字節(jié)數(shù)組,你可以對(duì)字符串類型進(jìn)行很多操作,例如追加、獲取子串等。
  2. 哈希(Hash)
    • Redis hash是一個(gè)string類型的field和value的映射表,hash特別適合用于存儲(chǔ)對(duì)象。
  3. 列表(List)
    • Redis列表是簡單的字符串列表,按照插入順序排序。你可以添加一個(gè)元素到列表的頭部(左邊)或者尾部(右邊)。
  4. 集合(Set)
    • Redis的集合是無序的字符串集合,并且集合成員是唯一的,不存在重復(fù)的元素。
    • Redis集合是通過哈希表實(shí)現(xiàn)的,所以添加,刪除,查找的復(fù)雜度都是O(1)。
  5. 有序集合(Sorted Set)
    • Redis有序集合和集合一樣也是string類型元素的集合,并且集合成員是唯一的。不同的是每個(gè)元素都會(huì)關(guān)聯(lián)一個(gè)double類型的分?jǐn)?shù)(score)。Redis正是通過分?jǐn)?shù)來為集合中的元素進(jìn)行從小到大的排序。
    • 有序集合的成員是唯一的,但分?jǐn)?shù)(score)可以重復(fù)。
    • 集合是通過哈希表實(shí)現(xiàn)的,所以添加,刪除,查找的復(fù)雜度都是O(1)。

這些數(shù)據(jù)類型為Redis提供了豐富的功能集,使其可以靈活地處理各種類型的數(shù)據(jù)和應(yīng)用場景。

實(shí)際上,使用最多的類型還是字符串。

哪些數(shù)據(jù)需要放到Redis緩存?

一般來說,放到緩存中的往往是更新頻率低,大量讀取的數(shù)據(jù)。
對(duì)于應(yīng)用系統(tǒng)而言,主要分為兩類:
一是基礎(chǔ)數(shù)據(jù),如系統(tǒng)的配置參數(shù),數(shù)據(jù)字典(性別、證件號(hào)碼等)。
二是業(yè)務(wù)數(shù)據(jù),如某城市的天氣預(yù)報(bào)數(shù)據(jù),電商系統(tǒng)中的秒殺商品。

使用緩存常見誤區(qū)是什么?

緩存數(shù)據(jù)沒有及時(shí)刷新。
將數(shù)據(jù)放入緩存,意味著內(nèi)存中多了一份數(shù)據(jù)庫中的數(shù)據(jù)副本。應(yīng)用系統(tǒng)會(huì)優(yōu)先從緩存中讀取。若數(shù)據(jù)庫中的數(shù)據(jù)被更新,則需要主動(dòng)將其更新到緩存,否則業(yè)務(wù)上讀取到的就是陳舊的錯(cuò)誤數(shù)據(jù),在大多數(shù)情況下是不可接受的。
比如秒殺商品變更了價(jià)格,用戶看到的是緩存中的尚未改變的價(jià)格,下單支付時(shí)才發(fā)現(xiàn)價(jià)格變了。

實(shí)戰(zhàn)

Redis如何安裝?

服務(wù)器端往往是Linux或Docker環(huán)境,如何安裝部署根據(jù)環(huán)境操作即可。
開發(fā)環(huán)境大多都是windows中,建議使用exe安裝,會(huì)自動(dòng)將其注冊(cè)為windows服務(wù)。
image.png
通過操作系統(tǒng)的服務(wù)管理面板可進(jìn)行靈活控制啟停及開機(jī)自動(dòng)運(yùn)行。
Redis的日志目錄和配置文件參見安裝路徑,在不清楚各參數(shù)含義的情況下,保持默認(rèn)即可,如下圖:image.png

Redis的讀寫庫應(yīng)該選哪個(gè)?

java中進(jìn)行redis讀寫操作的庫主要有兩個(gè),一個(gè)是Jedis,另外一個(gè)是lettuce。
我們應(yīng)該選哪個(gè)呢?
先來看下簡介。
Jedis:是老牌的Redis的Java實(shí)現(xiàn)客戶端,提供了比較全面的Redis命令的支持。
Lettuce:高級(jí)Redis客戶端,用于線程安全同步,異步和響應(yīng)使用,支持集群,Sentinel,管道和編碼器。
好像從簡介中也看不出誰優(yōu)誰劣,再進(jìn)一步看下技術(shù)實(shí)現(xiàn)。
Jedis使用阻塞的I/O,且其方法調(diào)用都是同步的,程序流需要等到sockets處理完I/O才能執(zhí)行,不支持異步。Jedis客戶端實(shí)例不是線程安全的,所以需要通過連接池來使用Jedis。
Lettuce基于Netty框架的事件驅(qū)動(dòng)的通信層,其方法調(diào)用是異步的。Lettuce的API是線程安全的,所以可以操作單個(gè)Lettuce連接來完成各種操作。
這時(shí)候就看出來差別來了,從技術(shù)實(shí)現(xiàn)上,明顯Lettuce更勝一籌。

使用jedis庫去操作redis,其流程跟訪問關(guān)系型數(shù)據(jù)庫非常像,即創(chuàng)建一個(gè)連接池,然后從連接池中獲取一個(gè)連接,進(jìn)行讀寫操作,最后再關(guān)閉連接(將連接歸還給連接池)。

@Slf4j
public class JedisUtil {@Autowiredprivate JedisPool jedisPool;/*** 存入Redis緩存** @param key* @param value*/public void set(String key, String value) {Jedis jedis = null;try {jedis = jedisPool.getResource();jedis.set(key, value);} catch (Exception ex) {log.error("存儲(chǔ)Redis出錯(cuò)" + ex);} finally {if (jedis != null) {jedis.close();}}}
}

因此,相比Jedis,更推薦使用Lettuce。

如何在SpringBoot項(xiàng)目中使用?

可以在SpringBoot項(xiàng)目中直接使用Lettuce,但是更佳的方式,是使用spring-data-redis。
spring-data-redis對(duì)redis底層開發(fā)包(Jedis、lettuce等 )進(jìn)行了高度封裝,統(tǒng)一由RedisTemplate提供了redis各種操作、異常處理及序列化工作。
也就是說,可以將spring-data-redis視作抽象的接口,對(duì)redis的讀寫,可以靈活更換為具體的客戶端,如jedis或lettuce。這種設(shè)計(jì)方式挺常見的,比如slf4j提供日志門面,接入logback、log4j2等實(shí)現(xiàn)日志功能。
使用spring-data-redis,而不是直接使用lettuce等客戶端,一方面,封裝后的組件,往往比未封裝的組件更易用;另一方面,當(dāng)需要更換組件時(shí),易于實(shí)現(xiàn),應(yīng)用系統(tǒng)的代碼無需調(diào)整。

添加哪些依賴?

在SpringBoot項(xiàng)目的pom文件中,添加如下依賴:

<!-- redis緩存 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId>
</dependency>

SpringBoot從2.0版本開始,將spring-boot-starter-data-redis內(nèi)置的jedis,更換為lettuce,也間接說明了后者更優(yōu)。
注意這里面有個(gè)坑點(diǎn),lettuce內(nèi)部使用了apache的連接池,但并沒有強(qiáng)依賴,因此需要單獨(dú)引入commons-pool2。

如何配置?

Spring Boot為Redis提供了自動(dòng)配置的功能,使得我們可以很容易地通過配置文件(通常是application.yml或application.properties)來設(shè)置Redis的相關(guān)參數(shù)。
在yml中配置redis及l(fā)ettuce參數(shù),如下所示:

spring: redis:host: localhostport: 6379password:#新版本Redis的timeout是一個(gè)duration,需使用如下寫法timeout: 10sdatabase: 0lettuce:pool:# 連接池中的最小空閑連接min-idle: 2# 連接池中的最大空閑連接max-idle: 2# 連接池的最大連接數(shù)max-active: 16#連接池最大阻塞等待時(shí)間max-wait: 30s

host
說明:指定Redis服務(wù)器的地址。
值:localhost 表示Redis服務(wù)器運(yùn)行在本機(jī)上。
port
說明:指定Redis服務(wù)器的端口號(hào)。
值:6379 是Redis的默認(rèn)端口號(hào)。
password
說明:指定連接Redis服務(wù)器所需的密碼。
值:此處為空,表示沒有設(shè)置密碼。如果Redis服務(wù)器設(shè)置了密碼,需要在這里填寫。
timeout
說明:指定連接Redis服務(wù)器的超時(shí)時(shí)間。
值:10s 表示超時(shí)時(shí)間為10秒。在新版本的Redis中,timeout已經(jīng)是一個(gè)duration,所以使用“s”來表示秒。
database
說明:指定使用的Redis數(shù)據(jù)庫索引。
值:0 表示使用Redis的第一個(gè)數(shù)據(jù)庫。Redis默認(rèn)提供了16個(gè)數(shù)據(jù)庫,索引從0到15。

以下是Lettuce連接池的配置部分
min-idle
說明:連接池中的最小空閑連接數(shù)。
值:2 表示連接池中至少保持2個(gè)空閑連接。
max-idle
說明:連接池中的最大空閑連接數(shù)。
值:2 表示連接池中最多可以保持2個(gè)空閑連接。
max-active
說明:連接池的最大連接數(shù)。
值:16 表示連接池中最多可以有16個(gè)活躍連接。
max-wait
說明:當(dāng)連接池中沒有可用連接時(shí),獲取連接的最大阻塞等待時(shí)間。
值:30s 表示如果連接池中沒有可用連接,獲取連接的線程會(huì)最多等待30秒。

這些配置為Spring Boot應(yīng)用程序提供了連接Redis服務(wù)器的所有基本信息,以及關(guān)于連接池的行為參數(shù)。通過調(diào)整這些參數(shù),可以優(yōu)化Redis的使用性能,滿足應(yīng)用程序的不同需求。

如何讀寫Redis?

spring-data-redis組件使用RedisTemplate來進(jìn)行操作,自行封裝的一個(gè)工具類,如下所示:

package tech.abc.platform.common.utils;import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Component;import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;/*** 緩存工具類** @author wqliu* @date 2023-03-06*/
@Component
@Slf4j
public class CacheUtil {@Autowiredpublic RedisTemplate redisTemplate;/*** 設(shè)置緩存對(duì)象** @param key   緩存的鍵* @param value 緩存的值*/public <T> void set(String key, T value) {redisTemplate.opsForValue().set(key, value);}/*** 設(shè)置緩存對(duì)象,附帶設(shè)定有效期** @param key      緩存的鍵值* @param value    緩存的值* @param timeout  時(shí)間* @param timeUnit 時(shí)間單位*/public <T> void set(String key, T value, long timeout, TimeUnit timeUnit) {redisTemplate.opsForValue().set(key, value, timeout, timeUnit);}/*** 獲取緩存對(duì)象** @param key 緩存鍵值* @return 緩存鍵值對(duì)應(yīng)的數(shù)據(jù)*/public <T> T get(String key) {ValueOperations<String, T> operation = redisTemplate.opsForValue();return operation.get(key);}/*** 刪除緩存對(duì)象** @param key 緩存的鍵*/public boolean remove(String key) {return redisTemplate.delete(key);}/*** 從redis緩存中移除指定前綴的所有值*/public void removePrefix(String prefix) {Set keys = redisTemplate.keys(prefix + "*");redisTemplate.delete(keys);}/*** 設(shè)置緩存對(duì)象的有效期** @param key      緩存的鍵值* @param timeout  時(shí)間* @param timeUnit 時(shí)間單位*/public <T> void expire(String key, Integer timeout, TimeUnit timeUnit) {redisTemplate.expire(key, timeout, timeUnit);}/*** 批量存入緩存** @param cachedMap*/public void setBatch(Map<String, String> cachedMap) {for (String key : cachedMap.keySet()) {set(key, cachedMap.get(key));}}}

可以看出來,使用封裝后的RedisTemplate,要比原生的jedis方便得多,一句代碼就能實(shí)現(xiàn)讀或?qū)?#xff0c;而jedis更像是訪問關(guān)系型數(shù)據(jù)庫的模式,需要先從連接池中獲取1個(gè)連接,然后執(zhí)行讀或?qū)懖僮?#xff0c;最后再關(guān)閉連接。

Redis工具查看數(shù)據(jù)異常怎么解決?

經(jīng)過上述步驟,通過系統(tǒng)讀寫是沒問題,但是使用redis客戶端工具,直連redis服務(wù)器,查看數(shù)據(jù)時(shí),則會(huì)顯示多了一些不可讀的前綴\xac\xed\x00\x05t\x00\,這是另外一個(gè)坑點(diǎn)。
這是怎么出現(xiàn)的呢?原來lettuce默認(rèn)使用JdkSerializationRedisSerializer作為序列化與反序列化的工具,將字符串轉(zhuǎn)換為字節(jié)數(shù)組搞出來的幺蛾子。

怎么解決呢?知道原因了,解決思路也有了,搞一個(gè)配置類,將默認(rèn)的序列化與反序列的類替換掉。

@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<Object, Object> redisStringTemplate(RedisTemplate<Object, Object> redisTemplate) {StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();redisTemplate.setKeySerializer(stringRedisSerializer);redisTemplate.setValueSerializer(stringRedisSerializer);return redisTemplate;}}

StringRedisSerializer是spring-data提供的,同時(shí)還提供了負(fù)責(zé)json數(shù)據(jù)的處理類,可用于鍵值為json的場景。

場景

緩存數(shù)據(jù)字典

將應(yīng)用系統(tǒng)中的下拉列表中的字典數(shù)據(jù),如性別、證件類型,在系統(tǒng)啟動(dòng)時(shí)從數(shù)據(jù)庫寫入到Redis緩存。
在使用這些字典作為屬性的業(yè)務(wù)實(shí)體時(shí),如查詢用戶,讀取Redis,將編碼值轉(zhuǎn)換為文本,返回給前端,從而避免了大量數(shù)據(jù)庫讀操作。

自助重置密碼

用戶忘記密碼時(shí),提供自助方式,讓用戶輸入注冊(cè)時(shí)的郵箱地址,然后生成一個(gè)uuid,一方面,將該uuid作為鍵值,存入到redis,并設(shè)置24小時(shí)有效;另一方面,將uuid作為參數(shù)附加到自助重置密碼的地址上,作為郵件內(nèi)容發(fā)送到用戶郵箱。
用戶點(diǎn)擊郵件中的鏈接地址時(shí),系統(tǒng)獲取到uuid,去Redis中查詢鍵是否存在,若不存在,則認(rèn)為鏈接已超出時(shí)效。
這里是利用了Redis自身支持時(shí)效的特點(diǎn)來簡化開發(fā)工作(相比自己在關(guān)系型數(shù)據(jù)庫中建表來保存失效時(shí)間,驗(yàn)證環(huán)節(jié)自行比較)。
同理,用戶登錄環(huán)節(jié),驗(yàn)證碼5分鐘有效,也可以采用這種方案。

擴(kuò)展

集群模式有哪些?

Redis集群模式主要有三種,分別是:主從復(fù)制模式、哨兵模式(Sentinel)和Cluster模式。

主從復(fù)制模式
主從復(fù)制模式是最簡單的集群方式。它使用一個(gè)Redis實(shí)例作為主機(jī)(master),其他實(shí)例作為備份機(jī)(slave)。主機(jī)負(fù)責(zé)數(shù)據(jù)的寫入和讀取操作,而從機(jī)只支持與主機(jī)數(shù)據(jù)的同步和讀取操作。當(dāng)主機(jī)發(fā)生故障時(shí),需要人工介入,將某個(gè)從機(jī)提升為新的主機(jī)。
優(yōu)點(diǎn):提高了服務(wù)器性能,實(shí)現(xiàn)了讀寫分離。
缺點(diǎn):故障恢復(fù)效率較低,需要人工介入。

哨兵模式(Sentinel)
哨兵模式通過一組哨兵實(shí)例組成的哨兵系統(tǒng)來監(jiān)視主從節(jié)點(diǎn)的健康狀態(tài)。一旦主節(jié)點(diǎn)故障被偵測到,系統(tǒng)會(huì)自動(dòng)選舉出一個(gè)從節(jié)點(diǎn),晉升為新的主節(jié)點(diǎn),從而實(shí)現(xiàn)故障恢復(fù)的自動(dòng)化。
優(yōu)點(diǎn):提高了系統(tǒng)的高可用性,故障恢復(fù)更加自動(dòng)化,提高了系統(tǒng)的穩(wěn)定性和可靠性。
缺點(diǎn):內(nèi)存容量和寫入性能仍受限于單個(gè)節(jié)點(diǎn)。

Cluster模式
Cluster模式通過數(shù)據(jù)分片(sharding)和多節(jié)點(diǎn)水平擴(kuò)展,有效提高了內(nèi)存利用率和寫入性能,適用于更大規(guī)模和更高要求的數(shù)據(jù)處理場景。Redis Cluster將數(shù)據(jù)分為16384個(gè)槽位,每個(gè)節(jié)點(diǎn)負(fù)責(zé)管理一部分槽位。當(dāng)客戶端向Redis Cluster發(fā)送請(qǐng)求時(shí),Cluster會(huì)根據(jù)鍵的哈希值將請(qǐng)求路由到相應(yīng)的節(jié)點(diǎn)。具體來說,Redis Cluster使用CRC16算法計(jì)算鍵的哈希值,然后對(duì)16384取模,得到槽位編號(hào)。
優(yōu)點(diǎn):為Redis集群的性能和擴(kuò)展性提供了重要的支撐。
缺點(diǎn):復(fù)雜度高
在實(shí)際應(yīng)用中,可以根據(jù)具體的業(yè)務(wù)需求和場景來選擇合適的Redis集群模式。如果需要更高級(jí)別的自動(dòng)化故障恢復(fù)和更好的性能,可以考慮使用哨兵模式或Cluster模式。如果只是簡單的讀寫分離和備份需求,主從復(fù)制模式可能是一個(gè)不錯(cuò)的選擇。

如果應(yīng)用規(guī)模有限,用戶量比較小,單機(jī)模式也足夠用了,redis自身的穩(wěn)定性相當(dāng)高,沒必要集群。

Redis如何實(shí)現(xiàn)持久化?

Redis的持久化模式主要有三種:快照方式(RDB, RedisDataBase)、文件追加方式(AOF, AppendOnlyFile)以及混合持久化方式。

快照方式(RDB
原理:該方式將某個(gè)時(shí)刻的內(nèi)存數(shù)據(jù)以二進(jìn)制的方式寫入磁盤。由于是二進(jìn)制寫入,效率較高。
優(yōu)點(diǎn):RDB文件為二進(jìn)制數(shù)據(jù),占用內(nèi)存小且緊湊,適合作為備份文件。同時(shí),RDB持久化方式可以最大化Redis的性能,因?yàn)楦高M(jìn)程在保存RDB文件時(shí)只需要fork出一個(gè)子進(jìn)程,接下來的工作全部由子進(jìn)程完成,父進(jìn)程不需要進(jìn)行其他IO操作。
缺點(diǎn):當(dāng)Redis意外終止時(shí),可能會(huì)導(dǎo)致數(shù)據(jù)部分丟失。此外,RDB需要經(jīng)常fork子進(jìn)程來保存數(shù)據(jù)集到硬盤上,當(dāng)數(shù)據(jù)集較大時(shí),fork過程可能會(huì)非常耗時(shí),導(dǎo)致Redis在一段時(shí)間內(nèi)無法響應(yīng)客戶端請(qǐng)求。
快照方式不會(huì)堵塞主進(jìn)程。

文件追加方式(AOF)
原理:該方式記錄所有的操作命令,并以文本的形式追加到文件中。由于是以文本形式寫入,效率相對(duì)較低,但保證了數(shù)據(jù)的完整性。
優(yōu)點(diǎn):由于AOF記錄的是操作指令,因此可以確保數(shù)據(jù)的完整性。
缺點(diǎn):由于AOF是以文本形式寫入,其效率不如RDB。同時(shí),AOF文件通常會(huì)比RDB文件大,需要更多的磁盤空間。
AOF是先寫redis,再追加日志,都在主進(jìn)程中,所以追加日志操作實(shí)際會(huì)堵塞主進(jìn)程。此外,若在寫redis成功,寫日志還沒完成,這時(shí)候宕機(jī),通過AOF來恢復(fù)會(huì)丟數(shù)據(jù)。

混合持久化方式:
原理:Redis 4.0之后新增的方式,結(jié)合了RDB和AOF的優(yōu)點(diǎn)。在寫入時(shí),先把當(dāng)前數(shù)據(jù)以RDB形式寫入文件的開頭,再將后續(xù)的操作命令以AOF的格式存入文件。
優(yōu)點(diǎn):這種方式既能保證Redis重啟時(shí)的速度,又能降低數(shù)據(jù)丟失的風(fēng)險(xiǎn)。

在選擇持久化策略時(shí),需要根據(jù)實(shí)際的應(yīng)用場景和需求來權(quán)衡。例如,如果更看重?cái)?shù)據(jù)的完整性和可恢復(fù)性,可以選擇AOF或混合持久化方式;如果更看重性能和磁盤空間的使用效率,可以選擇RDB方式。

需要注意的是,在使用Redis的持久化功能時(shí),應(yīng)定期檢查和備份持久化文件,以防止數(shù)據(jù)丟失或損壞。同時(shí),也應(yīng)對(duì)Redis服務(wù)器進(jìn)行監(jiān)控和維護(hù),確保其正常運(yùn)行和數(shù)據(jù)的安全性。

什么是緩存穿透?

緩存穿透是指查詢一個(gè)根本不存在的數(shù)據(jù),由于緩存也沒有該數(shù)據(jù),每次請(qǐng)求都會(huì)直接打到數(shù)據(jù)庫上,而數(shù)據(jù)庫中也沒有該數(shù)據(jù),相當(dāng)于進(jìn)行了兩次無效的查詢。常見的場景是并發(fā)查詢不存在的key時(shí),由于緩存未命中,每次請(qǐng)求都會(huì)直接查詢數(shù)據(jù)庫,造成數(shù)據(jù)庫壓力驟增甚至宕機(jī)。

為了避免緩存穿透帶來的問題,可以采取以下策略:

布隆過濾器:將所有可能存在的數(shù)據(jù)哈希到一個(gè)足夠大的bitmap中,一個(gè)一定不存在的數(shù)據(jù)會(huì)被這個(gè)bitmap攔截掉,從而避免了對(duì)底層存儲(chǔ)系統(tǒng)的查詢壓力。
緩存空對(duì)象:當(dāng)存儲(chǔ)層不命中后,即使是一個(gè)空對(duì)象或默認(rèn)值,也將其緩存起來,這樣后續(xù)再查詢同樣的key時(shí),就直接返回緩存中的空對(duì)象或默認(rèn)值,而不需要再去存儲(chǔ)層查詢。但這種方式需要特別注意緩存的失效時(shí)間和存儲(chǔ)空間的問題。
限制訪問頻率:針對(duì)同一個(gè)key的訪問,如果一段時(shí)間內(nèi)訪問頻率過高,可以考慮加入訪問隊(duì)列或使用滑動(dòng)窗口限制訪問頻率,從而減少對(duì)數(shù)據(jù)庫的查詢壓力。

在實(shí)際應(yīng)用中,需要根據(jù)具體的業(yè)務(wù)場景和需求來選擇合適的緩存穿透應(yīng)對(duì)策略。

什么是緩存擊穿?

緩存擊穿是指當(dāng)一個(gè)熱點(diǎn)(即訪問非常頻繁)的key在緩存中失效(過期)的瞬間,大量的并發(fā)請(qǐng)求同時(shí)訪問這個(gè)key時(shí),由于緩存中沒有該key的數(shù)據(jù),這些請(qǐng)求都會(huì)直接穿透到數(shù)據(jù)庫,導(dǎo)致數(shù)據(jù)庫瞬間承受巨大的壓力。
簡單來說,就是數(shù)據(jù)庫中有值而緩存中沒有值。
為了避免緩存擊穿問題,通常有以下幾種解決策略:
使用互斥鎖:當(dāng)多個(gè)線程同時(shí)訪問失效的key時(shí),可以使用互斥鎖(如Redis的分布式鎖)來確保只有一個(gè)線程去數(shù)據(jù)庫查詢并重建緩存,其他線程則等待鎖釋放后訪問新緩存。
設(shè)置熱點(diǎn)key永不過期:如果某個(gè)key的訪問非常頻繁且數(shù)據(jù)基本不會(huì)更新,可以考慮將其設(shè)置為永不過期,避免其過期導(dǎo)致的緩存擊穿。

主動(dòng)更新緩存:對(duì)于更新頻率較高的數(shù)據(jù),可以利用定時(shí)線程在緩存過期前主動(dòng)重新構(gòu)建緩存,或者在緩存過期時(shí)延后一段時(shí)間再過期,以確保緩存始終有效。

注意上面說的的互斥鎖方案,加鎖排隊(duì)只是為了減輕數(shù)據(jù)庫的壓力,并沒有提高系統(tǒng)吞吐量。假設(shè)在高并發(fā)下,緩存重建期間 key 是鎖著的,這是過來 1000 個(gè)請(qǐng)求 999 個(gè)都在阻塞的,同樣會(huì)導(dǎo)致用戶等待超時(shí)。

需要注意的是,在處理緩存擊穿問題時(shí),應(yīng)該結(jié)合具體的業(yè)務(wù)場景和需求來選擇最合適的解決方案,并在實(shí)施后進(jìn)行充分的測試以確保其有效性和性能。

什么是緩存雪崩?

緩存雪崩是指當(dāng)大量緩存同時(shí)失效或過期后,系統(tǒng)無法從緩存中獲取數(shù)據(jù),轉(zhuǎn)而請(qǐng)求數(shù)據(jù)庫,導(dǎo)致數(shù)據(jù)庫承受巨大壓力,進(jìn)而引起系統(tǒng)性能急劇下降的情況。
緩存擊穿是對(duì)于單個(gè)key值失效來了大量并發(fā)請(qǐng)求,緩存雪崩是大量key值在同一時(shí)間點(diǎn)或短暫的時(shí)間段失效。
具體來說,當(dāng)緩存中的數(shù)據(jù)失效或被清除時(shí),系統(tǒng)需要再次訪問數(shù)據(jù)庫,重新計(jì)算并生成緩存數(shù)據(jù)。這個(gè)處理過程通常耗時(shí)較長,可能達(dá)到上百毫秒甚至更久。對(duì)于高并發(fā)的系統(tǒng)而言,在緩存失效的這段時(shí)間內(nèi),系統(tǒng)會(huì)接收到大量的請(qǐng)求。由于舊的緩存已經(jīng)失效且新的緩存尚未生成,這些請(qǐng)求都會(huì)直接訪問數(shù)據(jù)庫,從而導(dǎo)致數(shù)據(jù)庫承受巨大的訪問壓力。如果這種壓力超過了數(shù)據(jù)庫的承受能力,就可能引發(fā)數(shù)據(jù)庫宕機(jī),進(jìn)而使整個(gè)系統(tǒng)崩潰。

為了避免緩存雪崩,可以采取以下策略:
保持緩存層的高可用性:使用Redis哨兵模式或集群部署方式,確保即使個(gè)別Redis節(jié)點(diǎn)故障,整個(gè)緩存層依然可用。
優(yōu)化緩存過期時(shí)間:為緩存中的每個(gè)key設(shè)置合適的過期時(shí)間,避免大量key在同一時(shí)刻同時(shí)失效。有一個(gè)簡單方案就是將緩存失效時(shí)間分散開,比如我們可以在原有的失效時(shí)間基礎(chǔ)上增加一個(gè)隨機(jī)值,比如 1-5 分鐘隨機(jī),這樣每一個(gè)緩存的過期時(shí)間的集中程度就會(huì)降低,很難引發(fā)集體失效的事件。

綜上所述,緩存雪崩是一個(gè)需要認(rèn)真對(duì)待的問題,合理的緩存策略和管理機(jī)制對(duì)于維護(hù)系統(tǒng)的穩(wěn)定性和性能至關(guān)重要。

http://m.risenshineclean.com/news/64035.html

相關(guān)文章:

  • 跟網(wǎng)站開發(fā)有關(guān)系的工作有哪些郵件營銷
  • wordpress免費(fèi)教育主題搜索引擎優(yōu)化技術(shù)有哪些
  • 深圳做網(wǎng)站收費(fèi)百度產(chǎn)品
  • wordpress 作者idseo網(wǎng)站推廣免費(fèi)
  • 光之翼可以做網(wǎng)站嗎中國網(wǎng)新山東
  • 一個(gè)主機(jī)可以建設(shè)多少個(gè)網(wǎng)站seo推廣培訓(xùn)資料
  • 網(wǎng)站做代理服務(wù)器網(wǎng)站制作培訓(xùn)
  • 品牌網(wǎng)站分析關(guān)鍵詞在線聽
  • 做網(wǎng)站需要做什么頁面媒體網(wǎng)絡(luò)推廣價(jià)格優(yōu)惠
  • 怎么樣開網(wǎng)站淘寶店鋪怎么推廣
  • 成都網(wǎng)站建設(shè)易維達(dá)好互聯(lián)網(wǎng)營銷的特點(diǎn)
  • 做公司網(wǎng)站注意事項(xiàng)網(wǎng)站推廣優(yōu)化平臺(tái)
  • 怎么按照屏幕比例做網(wǎng)站適應(yīng)安裝百度一下
  • 網(wǎng)頁靠什么賺錢南京seo網(wǎng)絡(luò)優(yōu)化公司
  • 用dw做網(wǎng)站結(jié)構(gòu)圖域名查詢 站長查詢
  • 個(gè)人可以做商城網(wǎng)站嗎優(yōu)秀品牌策劃方案
  • 手機(jī)網(wǎng)站做指向推廣教程
  • 建設(shè)黨史網(wǎng)站的意義在線智能識(shí)圖
  • 比價(jià)網(wǎng)站源碼整站程序百度上做優(yōu)化
  • h5可以做網(wǎng)站么免費(fèi)推廣途徑
  • 中小企業(yè)服務(wù)平臺(tái)企業(yè)seo外包公司
  • 公司網(wǎng)站建設(shè)服務(wù)大數(shù)據(jù)獲客系統(tǒng)
  • 萊蕪公司做網(wǎng)站外鏈相冊(cè)
  • wordpress 添加 聯(lián)系我們網(wǎng)站優(yōu)化方案
  • 建設(shè)外貿(mào)商城網(wǎng)站制作怎樣在百度上發(fā)布廣告
  • 有贊做網(wǎng)站360推廣
  • 東莞做網(wǎng)站一年費(fèi)用網(wǎng)站優(yōu)化seo培
  • 網(wǎng)站跳出率一般多少公司網(wǎng)站設(shè)計(jì)公司
  • 網(wǎng)站建設(shè)的合同書愛站小工具計(jì)算器
  • iis網(wǎng)站asp.net部署投放廣告找什么平臺(tái)