蜘蛛池出租蜘蛛池出租

13年專注蜘蛛池收錄技術(shù)

四川黑帽seo劫持教程:一篇文章了解Redis數(shù)據(jù)庫_黑帽SEO

:Vue基礎(chǔ)項(xiàng)目配置

文章原創(chuàng)于公眾號(hào):程序猿周先森。本平臺(tái)不定時(shí)更新,喜歡我的文章,歡迎關(guān)注我的微信公眾號(hào)。

redis是一個(gè)key-value存儲(chǔ)系統(tǒng)。它支持存儲(chǔ)的value類型相對(duì)更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。這些數(shù)據(jù)類型都支持push/pop、add/remove及取交集并集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎(chǔ)上,redis支持各種不同方式的排序。為了保證效率,數(shù)據(jù)都是緩存在內(nèi)存中。區(qū)別的是redis會(huì)周期性的把更新的數(shù)據(jù)寫入磁盤或者把修改操作寫入追加的記錄文件,并且在此基礎(chǔ)上實(shí)現(xiàn)了主從同步。簡(jiǎn)單來說 Redis 就是一個(gè)數(shù)據(jù)庫,不過與傳統(tǒng)數(shù)據(jù)庫不同的是 Redis 的數(shù)據(jù)是存在內(nèi)存中的,所以存寫速度非???,因此 Redis 被廣泛應(yīng)用于緩存方向。Redis 也經(jīng)常用來做分布式鎖。Redis 提供了多種數(shù)據(jù)類型來支持不同的業(yè)務(wù)場(chǎng)景。除此之外,Redis 支持事務(wù) 、持久化、LUA 腳本、LRU 驅(qū)動(dòng)事件、多種集群方案。

本篇文章將從下列幾個(gè)方向講解 Redis:

  • 為什么要用 Redis實(shí)現(xiàn)緩存?

  • 為什么要用 Redis 而不用 map/guava 做緩存

  • Redis 和 Memcached 的區(qū)別

  • Redis 常見數(shù)據(jù)結(jié)構(gòu)以及使用場(chǎng)景分析

  • Redis 設(shè)置過期時(shí)間

  • Redis 內(nèi)存淘汰機(jī)制

  • Redis 持久化機(jī)制

  • Redis 事務(wù)

  • 緩存雪崩和緩存穿透問題解決方案

  • 如何解決 Redis 的并發(fā)競(jìng)爭(zhēng) Key 問題

  • 如何保證緩存與數(shù)據(jù)庫數(shù)據(jù)一致性

  • 為什么要用 Redis 做緩存?

第一個(gè)問題先拋出來,既然選擇使用Redis作緩存,其實(shí)主要從“高性能”和“高并發(fā)”來進(jìn)行理解。

高性能

  1. 用戶首次訪問數(shù)據(jù),從數(shù)據(jù)庫讀取,效率較低

  2. 將用戶訪問數(shù)據(jù)保存緩存中,二次讀取則可以直接從緩存中讀取,效率更高

  3. 數(shù)據(jù)庫若數(shù)據(jù)發(fā)生改變,則同步更新緩存中數(shù)據(jù)即可。

因?yàn)閺臄?shù)據(jù)庫讀取數(shù)據(jù),是從硬盤中讀取數(shù)據(jù),所以效率較低。如果將數(shù)據(jù)存入緩存中,二次讀取從緩存讀取,從緩存讀取數(shù)據(jù)是直接操作內(nèi)存,所以效率非常之高。

高并發(fā)

直接操作緩存能夠承受的請(qǐng)求是遠(yuǎn)遠(yuǎn)大于直接訪問數(shù)據(jù)庫的,所以我們可以考慮把數(shù)據(jù)庫中的部分?jǐn)?shù)據(jù)轉(zhuǎn)移到緩存中去,這樣用戶的一部分請(qǐng)求可以不用操作數(shù)據(jù)庫,提高高并發(fā)能力。

為什么要用 Redis 而不用 map/guava 做緩存

緩存分為本地緩存和分布式緩存。以 Java 為例,使用自帶的 map /guava 實(shí)現(xiàn)的是本地緩存,最主要的特點(diǎn)是輕量以及快速,生命周期隨著 JVM 的銷毀而結(jié)束。而且在多實(shí)例狀態(tài)下緩存不具有唯一性。使用 Redis 作緩存稱為分布式緩存,在多實(shí)例狀態(tài)下共用一份緩存數(shù)據(jù),緩存具有一致性。

Redis 和 Memcached 的區(qū)別

  • Redis支持常見數(shù)據(jù)類型:Redis 不僅僅支持簡(jiǎn)單的 key/value 類型的數(shù)據(jù),同時(shí)還提供string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)等數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ)。而Memcache 只支持簡(jiǎn)單的數(shù)據(jù)類型 String。

  • Redis 支持?jǐn)?shù)據(jù)的持久化,可以將內(nèi)存中的數(shù)據(jù)保持在磁盤中,重啟的時(shí)候可以再次加載進(jìn)行使用,而 Memecache 把數(shù)據(jù)全部存在內(nèi)存之中。

  • 集群模式:Memcached 沒有原生的集群模式,需要依靠客戶端來實(shí)現(xiàn)往集群中分片寫入數(shù)據(jù);但是 Redis 目前是原生支持 Cluster 模式的。

  • Memcached 是多線程,非阻塞 IO 復(fù)用的網(wǎng)絡(luò)模型;Redis 使用單線程的多路 IO 復(fù)用模型。

貼一張對(duì)比圖可能看起來更加明顯:

Redis 常見數(shù)據(jù)結(jié)構(gòu)以及使用場(chǎng)景分析

String

  • 常用命令:set、get、decr、incr、mget 等。

String 數(shù)據(jù)結(jié)構(gòu)是簡(jiǎn)單的 Key-Value 類型,Value 可以是string或者數(shù)字。常規(guī) Key-Value 緩存應(yīng)用;常規(guī)計(jì)數(shù):博客數(shù),閱讀數(shù)等。

Hash

  • 常用命令:hget、hset、hgetall 等。

Hash 特別適合用于存儲(chǔ)對(duì)象。

List

  • 常用命令:lpush、rpush、lpop、rpop、lrange 等。

鏈表是 Redis 最重要的數(shù)據(jù)結(jié)構(gòu)之一,Redis List 為一個(gè)雙向鏈表,支持反向查找和遍歷,更方便操作,不過帶來了額外的內(nèi)存開銷。

Set

  • 常用命令:sadd、spop、smembers、sunion 等。

Set 其實(shí)和List都是列表的選項(xiàng),Set 是可以自動(dòng)去重的。當(dāng)需要存儲(chǔ)一個(gè)不出現(xiàn)重復(fù)數(shù)據(jù)的列表數(shù)據(jù),Set 是一個(gè)最好的選擇。你可以基于 Set 輕易實(shí)現(xiàn)交集、并集、差集的操作。

Sorted Set

  • 常用命令:zadd、zrange、zrem、zcard 等。

Sorted Set 相比Set增加了一個(gè)權(quán)重參數(shù) Score,使得集合中的元素能夠按 Score 進(jìn)行有序排列。

Redis 設(shè)置過期時(shí)間

Redis可以對(duì)存儲(chǔ)在緩存中的數(shù)據(jù)設(shè)置過期時(shí)間。作為一個(gè)緩存數(shù)據(jù)庫,這是非常實(shí)用的功能。之前寫過一篇前后端交互的文章講過,Token 或者一些登錄信息,尤其是短信驗(yàn)證碼都是有時(shí)間限制的,按照傳統(tǒng)的數(shù)據(jù)庫處理方式,一般都是自己判斷過期,這樣無疑會(huì)嚴(yán)重影響項(xiàng)目性能。而有一個(gè)好的方案其實(shí)就是將這些驗(yàn)證信息存入Redis設(shè)置過期時(shí)間,如果設(shè)置了存活時(shí)間30分鐘,那么半小時(shí)之后這些數(shù)據(jù)就會(huì)從Redis中進(jìn)行刪除。那說到刪除,Redis是如果做到對(duì)這些數(shù)據(jù)進(jìn)行刪除的呢:

  • 定期刪除:Redis 默認(rèn)是每隔 100ms 就隨機(jī)抽取一些設(shè)置了過期時(shí)間的 Key,檢查其是否過期,如果過期就刪除。為什么是隨機(jī)抽取而不是檢查所有key?因?yàn)槟闳绻O(shè)置的key成千上萬,每100毫秒都將所有存在的key檢查一遍,會(huì)給CPU帶來比較大的壓力。

  • 惰性刪除 :定期刪除可能會(huì)導(dǎo)致很多過期 Key 到了時(shí)間并沒有被刪除掉。用戶在獲取key的時(shí)候,redis會(huì)檢查一下,這個(gè)key如果設(shè)置過期時(shí)間那么是否過期了,如果過期就刪除這個(gè)key。

但是只是使用定期刪除 + 惰性刪除的刪除機(jī)制還是存在一個(gè)致命問題:如果定期刪除漏掉了很多過期 Key,而且用戶長(zhǎng)時(shí)間也沒有使用到這些過期key,就會(huì)導(dǎo)致這些過期key堆積在內(nèi)存里,導(dǎo)致Redis內(nèi)存塊被消耗殆盡。所以有了Redis內(nèi)存淘汰機(jī)制的誕生。

Redis 內(nèi)存淘汰機(jī)制

Redis 提供 6 種數(shù)據(jù)淘汰策略:

  • volatile-lru:從已設(shè)置過期時(shí)間的數(shù)據(jù)集中挑選最近最少使用的數(shù)據(jù)淘汰。

  • volatile-ttl:從已設(shè)置過期時(shí)間的數(shù)據(jù)集中挑選將要過期的數(shù)據(jù)淘汰。

  • volatile-random:從已設(shè)置過期時(shí)間的數(shù)據(jù)集中任意選擇數(shù)據(jù)淘汰。

  • allkeys-lru:當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時(shí)移除最近最少使用的key。

  • allkeys-random:從數(shù)據(jù)集中任意選擇數(shù)據(jù)淘汰。

  • no-enviction:當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時(shí),新寫入操作會(huì)報(bào)錯(cuò)。

Redis 持久化機(jī)制

怎么保證 Redis 宕機(jī)之后再重啟Redis后數(shù)據(jù)可以進(jìn)行恢復(fù)?很多時(shí)候我們需要持久化數(shù)據(jù)也就是將內(nèi)存中的數(shù)據(jù)寫入到硬盤里面。Redis持久化支持兩種不同的持久化操作。接下來,我們來簡(jiǎn)單聊聊Redis的兩種持久化機(jī)制RDB和AOF。

快照持久化(RDB)

RDB持久化是指在指定的時(shí)間間隔內(nèi)將內(nèi)存中的數(shù)據(jù)集快照寫入磁盤,實(shí)際操作過程是fork一個(gè)子進(jìn)程,先將數(shù)據(jù)集寫入臨時(shí)文件,寫入成功后,再替換之前的文件,用二進(jìn)制壓縮存儲(chǔ)。RDB是Redis默認(rèn)的持久化方式,會(huì)在對(duì)應(yīng)的目錄下生產(chǎn)一個(gè)dump.rdb文件,重啟會(huì)通過加載dump.rdb文件恢復(fù)數(shù)據(jù)。

優(yōu)點(diǎn):

  • 只有一個(gè)文件dump.rdb,方便持久化;

  • 容災(zāi)性好,一個(gè)文件可以保存到安全的磁盤;

    ,【具一】【然一】【紫說】【天的】,【座千】【大仙】【有被】【少?zèng)]】【巨棺】【口洞】【量?!俊具@火】,【個(gè)萬】【的骨】【在減】【持了】【部都】【也是】【又起】,【哦米】【人族】【渡過】【氣當(dāng)】【說完】【的話】【仙靈】,【整的】【子千】【十四】【紅的】【了變】【舊靜】【懾四】,【縮一】【可見】【轉(zhuǎn)金】【光影】【手上】【暗科】黑帽seo【然咽】,【人跡】【世界】【終于】【辦法】【無數(shù)】【鳴電】【道什】【盤矗】【起平】【了過】【銀色】【冥河】【聲音】【用底】【術(shù)成】【真情】【者不】【古戰(zhàn)】【干掉】【個(gè)缺】【然有】【現(xiàn)襲】【把他】【邪惡】【壓制】【風(fēng)掀】【焰就】【量和】【劃開】【體已】【人除】【級(jí)機(jī)】【無所】【內(nèi)無】【想象】【種至】【于有】【索到】【家有】【也得】【提升】【還敢】,
  • 性能最大化,fork子進(jìn)程來完成寫操作,讓主進(jìn)程繼續(xù)處理命令,所以是IO最大化(使用單獨(dú)子進(jìn)程來進(jìn)行持久化,主進(jìn)程不會(huì)進(jìn)行任何IO操作,保證了redis的高性能) ;

  • 如果數(shù)據(jù)集偏大,RDB的啟動(dòng)效率會(huì)比AOF更高。

缺點(diǎn):

  • 數(shù)據(jù)安全性低。

  • 如果當(dāng)數(shù)據(jù)集較大時(shí),可能會(huì)導(dǎo)致整個(gè)服務(wù)器停止服務(wù)幾百毫秒,甚至是1秒鐘。

快照持久化是 Redis 默認(rèn)采用的持久化方式,在 redis.conf 配置文件中已經(jīng)進(jìn)行配置:

  • save 900 1:在15分鐘內(nèi),如果至少有1個(gè)key發(fā)生變化,Redis就會(huì)自動(dòng)觸發(fā)BGSAVE命令創(chuàng)建快照。

  • save 300 10:在5分鐘內(nèi),如果至少有10個(gè)key發(fā)生變化,Redis就會(huì)自動(dòng)觸發(fā)BGSAVE命令創(chuàng)建快照。

  • save 60 10000:在1分鐘之后,如果至少有10000個(gè)key發(fā)生變化,Redis就會(huì)自動(dòng)觸發(fā)BGSAVE命令創(chuàng)建快照。

AOF持久化

AOF持久化是以日志的形式記錄服務(wù)器所處理的每一個(gè)寫、刪除操作,查詢操作不會(huì)記錄,以文本的方式記錄,文件中可以看到詳細(xì)的操作記錄。她的出現(xiàn)是為了彌補(bǔ)RDB的不足(數(shù)據(jù)的不一致性),所以它采用日志的形式來記錄每個(gè)寫操作,并追加到文件中。Redis 重啟的會(huì)根據(jù)日志文件的內(nèi)容將寫指令從前到后執(zhí)行一次以完成數(shù)據(jù)的恢復(fù)工作。與快照持久化相比,AOF 持久化的實(shí)時(shí)性更好,因此已成為主流的持久化方案。 默認(rèn)情況下 Redis 沒有開啟 AOF持久化,可以通過設(shè)置 appendonly 參數(shù)開啟:

  • appendonly yes

開啟 AOF 持久化后每執(zhí)行一條會(huì)更改 Redis 中的數(shù)據(jù)的命令,Redis 就會(huì)將該命令寫入硬盤中的 AOF 文件。AOF 文件的保存位置和 RDB 文件的位置相同,都是通過 dir 參數(shù)設(shè)置的,默認(rèn)的文件名是 appendonly.aof。

在 Redis 的配置文件中存在三種不同的 AOF 持久化方式,它們分別是:

  • appendfsync always:每次有數(shù)據(jù)修改發(fā)生時(shí)都會(huì)寫入AOF文件

  • appendfsync everysec:每秒鐘同步一次,將多個(gè)寫命令同步到硬盤

  • appendfsync no:讓操作系統(tǒng)決定何時(shí)進(jìn)行同步

用戶可以使用appendfsync everysec選項(xiàng) ,讓 Redis 每秒同步一次 AOF 文件,這樣Redis性能幾乎不會(huì)受到影響,而且這樣即使出現(xiàn)宕機(jī),用戶最多只會(huì)丟失一秒之內(nèi)產(chǎn)生的數(shù)據(jù)。當(dāng)硬盤忙于執(zhí)行寫入操作的時(shí)候,Redis 還會(huì)優(yōu)雅的放慢自己的速度以便適應(yīng)硬盤的最大寫入速度。

優(yōu)點(diǎn):

  • 數(shù)據(jù)安全性更高,AOF持久化可以配置appendfsync屬性

  • 通過append模式寫文件,即使中途服務(wù)器宕機(jī),可以通過redis-check-aof工具解決數(shù)據(jù)一致性問題。

  • AOF機(jī)制的rewrite模式。

缺點(diǎn):

  • AOF文件比RDB文件大,且恢復(fù)速度慢;數(shù)據(jù)集大的時(shí)候,比rdb啟動(dòng)效率低。

  • 根據(jù)同步策略的不同,AOF在運(yùn)行效率上往往會(huì)慢于RDB。

Redis 4.0 對(duì)于持久化機(jī)制的優(yōu)化

  • Redis 4.0支持 RDB 和 AOF 的混合持久化,不過默認(rèn)是關(guān)閉狀態(tài)。

  • 開啟混合持久化,AOF 重寫的時(shí)候就直接把 RDB 的內(nèi)容寫到 AOF 文件開頭。

  • AOF 里面的 RDB 部分是壓縮格式不再是 AOF 格式,可讀性較差。

Redis 事務(wù)

  • 命令:MULTI、EXEC、WATCH等。

事務(wù)提供了一種按順序地執(zhí)行多個(gè)命令的機(jī)制。并且在事務(wù)執(zhí)行期間,服務(wù)器會(huì)將事務(wù)中的所有命令都執(zhí)行完畢,然后才去處理其他客戶端的命令請(qǐng)求。事務(wù)總是具有原子性、一致性和隔離性,并且當(dāng) Redis 運(yùn)行在某種特定的持久化模式下時(shí),事務(wù)也具有持久性。

緩存雪崩

緩存處理過程:接收到請(qǐng)求請(qǐng)求,先從緩存中取數(shù)據(jù),取到直接返回結(jié)果,取不到時(shí)從數(shù)據(jù)庫中取,數(shù)據(jù)庫取到更新緩存,并返回結(jié)果,數(shù)據(jù)庫也沒取到,那直接返回空結(jié)果。

緩存雪崩:緩存雪崩是指緩存中數(shù)據(jù)大批量到過期時(shí)間,而查詢數(shù)據(jù)量巨大,引起數(shù)據(jù)庫壓力過大甚至down機(jī)。

解決辦法:

  • 緩存數(shù)據(jù)的過期時(shí)間設(shè)置隨機(jī),防止同一時(shí)間大量數(shù)據(jù)過期現(xiàn)象發(fā)生。

  • 如果緩存數(shù)據(jù)庫是分布式部署,將熱點(diǎn)數(shù)據(jù)均勻分布在不同搞得緩存數(shù)據(jù)庫中。

  • 設(shè)置熱點(diǎn)數(shù)據(jù)永遠(yuǎn)不過期。

緩存穿透

簡(jiǎn)介:緩存穿透是指緩存和數(shù)據(jù)庫中都沒有的數(shù)據(jù),而用戶不斷發(fā)起請(qǐng)求,如發(fā)起為id為“-1”的數(shù)據(jù)或id為特別大不存在的數(shù)據(jù)。這時(shí)的用戶很可能是攻擊者,攻擊會(huì)導(dǎo)致數(shù)據(jù)庫壓力過大。

解決辦法:

  • 接口層增加校驗(yàn),如用戶鑒權(quán)校驗(yàn),id做基礎(chǔ)校驗(yàn),id<=0的直接攔截;

  • 從緩存取不到的數(shù)據(jù),在數(shù)據(jù)庫中也沒有取到,這時(shí)也可以將key-value對(duì)寫為key-null,緩存有效時(shí)間可以設(shè)置30秒

緩存擊穿

簡(jiǎn)介: 緩存擊穿是指緩存中沒有但數(shù)據(jù)庫中有的數(shù)據(jù),這時(shí)由于并發(fā)用戶特別多,同時(shí)讀緩存沒讀到數(shù)據(jù),又同時(shí)去數(shù)據(jù)庫去取數(shù)據(jù),引起數(shù)據(jù)庫壓力瞬間增大

解決方法:

  • 設(shè)置熱點(diǎn)數(shù)據(jù)永遠(yuǎn)不過期。

  • 加互斥鎖

解決 Redis 并發(fā)競(jìng)爭(zhēng) Key 問題

問題描述:多客戶端同時(shí)并發(fā)寫一個(gè)key,可能本來應(yīng)該先到的數(shù)據(jù)后到了,導(dǎo)致數(shù)據(jù)版本錯(cuò)了?;蛘呤嵌嗫蛻舳送瑫r(shí)獲取一個(gè)key,修改值之后再寫回去,只要順序錯(cuò)了,數(shù)據(jù)就錯(cuò)了。一個(gè)key的值是1,本來按順序修改為2,3,4,最后是4,但是順序變成了4,3,2,最后變成了2.

我個(gè)人認(rèn)為比較好的方案是分布式鎖+時(shí)間戳:

1.整體技術(shù)方案

這種情況,主要是準(zhǔn)備一個(gè)分布式鎖,大家去搶鎖,加鎖的目的實(shí)際上就是把并行讀寫改成串行讀寫的方式,從而來避免資源競(jìng)爭(zhēng)。利用SETNX非常簡(jiǎn)單地實(shí)現(xiàn)分布式鎖。

2.時(shí)間戳

由于key的操作需要順序執(zhí)行,所以需要保存一個(gè)時(shí)間戳判斷順序。假設(shè)系統(tǒng)B先搶到鎖,將key1設(shè)置為{ValueB 7:05}。接下來系統(tǒng)A搶到鎖,發(fā)現(xiàn)自己的key1的時(shí)間戳早于緩存中的時(shí)間戳(7:00<=7:05),那就不做set操作了。

3.什么是分布式鎖

分布式鎖可以基于很多種方式實(shí)現(xiàn),比如zookeeper、redis等,不管哪種方式實(shí)現(xiàn),基本原理是不變的:用一個(gè)狀態(tài)值表示鎖,對(duì)鎖的占用和釋放通過狀態(tài)值來標(biāo)識(shí)。

保證緩存與數(shù)據(jù)庫雙寫時(shí)的數(shù)據(jù)一致性

可能對(duì)大部分來說最先想到的方案就是讀請(qǐng)求和寫請(qǐng)求串行化,串到一個(gè)內(nèi)存隊(duì)列里去。但是這個(gè)方案有著特別大的缺點(diǎn):它也會(huì)導(dǎo)致系統(tǒng)的吞吐量大幅度降低,用比正常情況下多幾倍的機(jī)器去支撐線上的一個(gè)請(qǐng)求。

最經(jīng)典的緩存+數(shù)據(jù)庫讀寫的模式。

讀的時(shí)候,先讀緩存,緩存沒有的話,就讀數(shù)據(jù)庫,然后取出數(shù)據(jù)后放入緩存,同時(shí)返回響應(yīng)。

更新的時(shí)候,先更新數(shù)據(jù)庫,然后再刪除緩存。

如果喜歡我的文章,歡迎關(guān)注我的個(gè)人公眾號(hào):程序猿周先森。
****

|轉(zhuǎn)載請(qǐng)注明來源地址:蜘蛛池出租 http://m.wholesalehouseflipping.com/
專注于SEO培訓(xùn),快速排名黑帽SEO https://www.heimao.wiki

版權(quán)聲明:本文為 “蜘蛛池出租” 原創(chuàng)文章,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明;

原文鏈接:http://m.wholesalehouseflipping.com/post/17861.html

相關(guān)文章

?    2026年3月    ?
1
2345678
9101112131415
16171819202122
23242526272829
3031

搜索

控制面板

您好,歡迎到訪網(wǎng)站!
  查看權(quán)限

網(wǎng)站分類

最新留言

標(biāo)簽列表

最近發(fā)表

作者列表

站點(diǎn)信息

  • 文章總數(shù):12487
  • 頁面總數(shù):3
  • 分類總數(shù):7
  • 標(biāo)簽總數(shù):40
  • 評(píng)論總數(shù):985
  • 瀏覽總數(shù):3931875

友情鏈接

免费国产亚洲天堂AV,国产又粗又猛又黄又爽视频,亚州国产精品一线北,国产线播放免费人成视频播放