欧美free性护士vide0shd,老熟女,一区二区三区,久久久久夜夜夜精品国产,久久久久久综合网天天,欧美成人护士h版

目錄

柚子快報(bào)激活碼778899分享:中間件|day1.Redis

柚子快報(bào)激活碼778899分享:中間件|day1.Redis

http://yzkb.51969.com/

Redis

定義

Redis 是一個(gè)開(kāi)源(BSD許可)的,內(nèi)存中的數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)系統(tǒng),它可以用作數(shù)據(jù)庫(kù)、緩存和消息中間件。 它支持多種類(lèi)型的數(shù)據(jù)結(jié)構(gòu),如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 與范圍查詢(xún), bitmaps, hyperloglogs 和 地理空間(geospatial) 索引半徑查詢(xún)。 Redis 內(nèi)置了 復(fù)制(replication),LUA腳本(Lua scripting), LRU驅(qū)動(dòng)事件(LRU eviction),事務(wù)(transactions) 和不同級(jí)別的 磁盤(pán)持久化(persistence), 并通過(guò) Redis哨兵(Sentinel)和自動(dòng) 分區(qū)(Cluster)提供高可用性(high availability)。

Redis(Remote Dictionary Server ),即遠(yuǎn)程字典服務(wù) !是一個(gè)開(kāi)源的使用ANSI C語(yǔ)言編寫(xiě)、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫(kù),并提供多種語(yǔ)言的API。

redis會(huì)周期性的把更新的數(shù)據(jù)寫(xiě)入磁盤(pán)或者把修改操作寫(xiě)入追加的記錄文件,并且在此基礎(chǔ)上實(shí)現(xiàn)了master-slave(主從)同步。

也被人們稱(chēng)之為結(jié)構(gòu)化數(shù)據(jù)庫(kù)!

五大數(shù)據(jù)類(lèi)型

String(字符串)

String是Redis中最常用的一種數(shù)據(jù)類(lèi)型,也是Redis中最簡(jiǎn)單的一種數(shù)據(jù)類(lèi)型。首先,表面上它是字符串,但其實(shí)他可以靈活的表示字符串、整數(shù)、浮點(diǎn)數(shù)3種值。Redis會(huì)自動(dòng)的識(shí)別這3種值。

操作

添加、查詢(xún)、追加、獲取長(zhǎng)度,判斷是否存在的操作自增、自減操作截取、替換字符串操作設(shè)置過(guò)期時(shí)間、不存在設(shè)置操作mset、mget操作添加獲取對(duì)象、getset操作

List(列表)

定義

實(shí)際上是一個(gè)鏈表,before Node after , left,right 都可以插入值

如果key 不存在,創(chuàng)建新的鏈表

如果key存在,新增內(nèi)容

如果移除了所有值,空鏈表,也代表不存在!

在兩邊插入或者改動(dòng)值,效率最高! 中間元素,相對(duì)來(lái)說(shuō)效率會(huì)低一點(diǎn)~

消息排隊(duì)!消息隊(duì)列 (Lpush Rpop), 棧( Lpush Lpop)!

操作

lpush(左插入)、lrange(查詢(xún)集合)、rpush(右插入)操作lpop(左移除)、rpop(右移除)操作lindex(查詢(xún)指定下標(biāo)元素)、llen(獲取集合長(zhǎng)度) 操作lrem(根據(jù)value移除指定的值)ltrim(截取元素)、rpoplpush(移除指定集合中最后一個(gè)元素到一個(gè)新的集合中)操作lset(更新)、linsert操作

Set(集合)

操作

sadd(添加)、smembers(查看所有元素)、sismember(判斷是否存在)、scard(查看長(zhǎng)度)、srem(移除指定元素)操作srandmember(抽隨機(jī))操作spop(隨機(jī)刪除元素)、smove(移動(dòng)指定元素到新的集合中)操作sdiff(差集)、sinter(交集)、sunion(并集)操作

總結(jié)

可實(shí)現(xiàn)共同好友、共同關(guān)注等需求。

Hash(哈希)

操作

hset(添加hash)、hget(查詢(xún))、hgetall(查詢(xún)所有)、hdel(刪除hash中指定的值)、hlen(獲取hash的長(zhǎng)度)、hexists(判斷key是否存在)操作 hkeys(獲取所有key)、hvals(獲取所有value)、hincrby(給值加增量)、hsetnx(存在不添加)操作

總結(jié)

比String更加適合存對(duì)象~

zSet(有序集合)

操作

zadd(添加)、zrange(查詢(xún))、zrangebyscore(排序小-大)、zrevrange(排序大-?。?、zrangebyscore withscores(查詢(xún)所有值包含key)操作zrem(移除元素)、zcard(查看元素個(gè)數(shù))、zcount(查詢(xún)指定區(qū)間內(nèi)的元素個(gè)數(shù))操作

總結(jié)

成績(jī)表排序,工資表排序,年齡排序等需求可以用zset來(lái)實(shí)現(xiàn)!

三大特殊類(lèi)型

Geospatial(地理位置)

操作

geoadd(添加)、geopos(查看)、geodist(計(jì)算距離)操作georadius(查詢(xún)附近位置)操作georadiusbymember (查找指定元素指定范圍內(nèi)的元素)、geohash (返回經(jīng)緯度的hash值)、zrange、zrem(使用zset命令操作geo)

注意

兩極無(wú)法直接添加,我們一般會(huì)下載城市數(shù)據(jù),直接通過(guò)java程序一次性導(dǎo)入!有效的經(jīng)度從-180度到180度。有效的緯度從-85.05112878度到85.05112878度。m 為米。km 為千米。mi 為英里。ft 為英尺。

總結(jié)

實(shí)際需求中,我們可以用來(lái)查詢(xún)附近的人、計(jì)算兩人之間的距離等。當(dāng)然,那些所需的經(jīng)緯度我們肯定要結(jié)合java代碼來(lái)一次導(dǎo)入,手動(dòng)查詢(xún)和錄入太過(guò)于浪費(fèi)時(shí)間!

Hyperloglog(基數(shù))

定義

再數(shù)學(xué)層面上可以說(shuō)是:兩個(gè)數(shù)據(jù)集中不重復(fù)的元素~

操作

pfadd(添加數(shù)據(jù)集)、pfcount(統(tǒng)計(jì)數(shù)據(jù)集)、pfmegre(合并數(shù)據(jù)集-自動(dòng)去重)

總結(jié)

如果在實(shí)際業(yè)務(wù)中,允許一定的誤差值,我們可以使用基數(shù)統(tǒng)計(jì)來(lái)計(jì)算~效率非常高!比如:網(wǎng)站的訪(fǎng)問(wèn)量,就可以利用Hyperloglog來(lái)進(jìn)行計(jì)算統(tǒng)計(jì)!

Bitmap(位存儲(chǔ))

定義

Bitmap 位圖,數(shù)據(jù)結(jié)構(gòu)! 都是操作二進(jìn)制位來(lái)進(jìn)行記錄,就只有0 和 1 兩個(gè)狀態(tài)!

操作

setbit(添加)、getset(獲?。itcount(統(tǒng)計(jì))操作

總結(jié)

實(shí)際需求中,可能需要我們統(tǒng)計(jì)用戶(hù)的登陸信息,員工的打卡信息等等。只要是事務(wù)的只有兩個(gè)狀態(tài)的,我們都可以用Bitmap來(lái)進(jìn)行操作?。?!

實(shí)現(xiàn)事務(wù)

正常執(zhí)行事務(wù)放棄事務(wù)編譯時(shí)異常,代碼有問(wèn)題,或者命令有問(wèn)題,所有的命令都不會(huì)被執(zhí)行運(yùn)行時(shí)異常,除了語(yǔ)法錯(cuò)誤不會(huì)被執(zhí)行且拋出異常后,其他的正確命令可以正常執(zhí)行

注意

在Redis事務(wù)沒(méi)有沒(méi)有隔離級(jí)別的概念!

在Redis單條命令式保證原子性的,但是事務(wù)不保證原子性!

總結(jié)

總結(jié):由以上可以得出結(jié)論,Redis是支持單條命令事務(wù)的,但是事務(wù)并不能保證原子性!

實(shí)現(xiàn)樂(lè)觀鎖

操作

watch(監(jiān)視)多線(xiàn)程測(cè)試watch

注意

當(dāng)程序中可能出現(xiàn)并發(fā)的情況時(shí),就需要保證在并發(fā)情況下數(shù)據(jù)的準(zhǔn)確性,以此確保當(dāng)前用戶(hù)和其他用戶(hù)一起操作時(shí),所得到的結(jié)果和他單獨(dú)操作時(shí)的結(jié)果是一樣的。沒(méi)有做好并發(fā)控制,就可能導(dǎo)致臟讀、幻讀和不可重復(fù)讀等問(wèn)題。

總結(jié)

當(dāng)程序中可能出現(xiàn)并發(fā)的情況時(shí),就需要保證在并發(fā)情況下數(shù)據(jù)的準(zhǔn)確性,以此確保當(dāng)前用戶(hù)和其他用戶(hù)一起操作時(shí),所得到的結(jié)果和他單獨(dú)操作時(shí)的結(jié)果是一樣的。沒(méi)有做好并發(fā)控制,就可能導(dǎo)致臟讀、幻讀和不可重復(fù)讀等問(wèn)題。

jedis

定義

Jedis是Redis官方推薦的Java連接開(kāi)發(fā)工具!

總結(jié)

在Jedis中連接使用Redis,和Redis控制臺(tái)命令完全一致

Springboot整合Redis

在1.×版本的時(shí)候,SpringBoot的底層還是使用Jedis來(lái)連接Redis的,但是在2.×版本后,就換成了Lettuce。

兩者的區(qū)別

Jedis: 采用的直連,多個(gè)線(xiàn)程操作的話(huà),是不安全的,如果想要避免不安全的,使用 jedis pool 連接池! 更像 BIO 模式!Lettuce: 采用netty,實(shí)例可以再多個(gè)線(xiàn)程中進(jìn)行共享,不存在線(xiàn)程不安全的情況!可以減少線(xiàn)程數(shù)據(jù)了,更像 NIO 模式!

Redis配置文件

包含

搭建Redis集群時(shí),可以使用includes包含其他配置文件

網(wǎng)絡(luò)

bind 127.0.0.1 # 綁定的ip protected-mode yes # 保護(hù)模式 port 6379 # 端口設(shè)置

通用GENERAL 快照(RDB)

持久化,在規(guī)定的時(shí)間內(nèi),執(zhí)行了多少次操作則會(huì)持久化到文件 .rdb .aof文件Redis是內(nèi)存數(shù)據(jù)庫(kù),如果沒(méi)有持久化,那么數(shù)據(jù)斷電即失!

SECURITY 安全

可以在這里設(shè)置Redis的密碼,默認(rèn)是沒(méi)有密碼的。

限制CLIENTS

限制能連接上Redis數(shù)據(jù)庫(kù)的客戶(hù)端

APPEND ONLY 模式 aof配置(持久化保存)

持久化

定義

在發(fā)生意外時(shí)可以及時(shí)保存數(shù)據(jù),以便于在下次啟動(dòng)中恢復(fù)

原因

Redis 是內(nèi)存數(shù)據(jù)庫(kù),如果不將內(nèi)存中的數(shù)據(jù)庫(kù)狀態(tài)保存到磁盤(pán),那么一旦服務(wù)器進(jìn)程退出,服務(wù)器中的數(shù)據(jù)庫(kù)狀態(tài)也會(huì)消失。所以 Redis 提供了持久化功能 !

種類(lèi)

RDB

定義

RDB(Redis Database)是Redis默認(rèn)采用的持久化方式,它以快照的形式將進(jìn)程數(shù)據(jù)持久化到硬盤(pán)中。

原理

RDB會(huì)創(chuàng)建一個(gè)經(jīng)過(guò)壓縮的二進(jìn)制文件,文件以“.rdb”結(jié)尾,內(nèi)部存儲(chǔ)了各個(gè)數(shù)據(jù)庫(kù)的鍵值對(duì)數(shù)據(jù)等信息。Redis會(huì)單獨(dú)創(chuàng)建(fork)一個(gè)子進(jìn)程來(lái)進(jìn)行持久化,會(huì)先將數(shù)據(jù)寫(xiě)入到一個(gè)臨時(shí)文件中,待持久化過(guò)程都結(jié)束了,再用這個(gè)臨時(shí)文件替換上次持久化好的文件。整個(gè)過(guò)程中,主進(jìn)程是不進(jìn)行任何IO操作的。

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

RDB生成緊湊壓縮的二進(jìn)制文件,體積小,使用該文件恢復(fù)數(shù)據(jù)的速度非??欤?/p>

缺點(diǎn)

BGSAVE每次運(yùn)行都要執(zhí)行fork操作創(chuàng)建子進(jìn)程,屬于重量級(jí)操作,不宜頻繁執(zhí)行,所以RDB持久化沒(méi)辦法做到實(shí)時(shí)的持久化。

觸發(fā)方式

手動(dòng)觸發(fā) 通過(guò)SAVE或BGSAVE命令觸發(fā)RDB持久化操作,創(chuàng)建“.rdb”文件 自動(dòng)觸發(fā) 通過(guò)配置選項(xiàng),讓服務(wù)器在滿(mǎn)足指定條件時(shí)自動(dòng)執(zhí)行BGSAVE命令

命令

SAVE SAVE命令執(zhí)行期間,Redis服務(wù)器將阻塞,直到“.rdb”文件創(chuàng)建完畢為止。 BGSAVE 而B(niǎo)GSAVE命令是異步版本的SAVE命令,它會(huì)使用Redis服務(wù)器進(jìn)程的子進(jìn)程,創(chuàng)建“.rdb”文件。

AOF

定義

AOF(Append Only File),解決了數(shù)據(jù)持久化的實(shí)時(shí)性,是目前Redis持久化的主流方式。

原理

AOF以獨(dú)立日志的方式,記錄了每次寫(xiě)入命令,重啟時(shí)再重新執(zhí)行AOF文件中的命令來(lái)恢復(fù)數(shù)據(jù)。(AOF以文本協(xié)議格式寫(xiě)入命令)

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

與RDB持久化可能丟失大量的數(shù)據(jù)相比,AOF持久化的安全性要高很多。通過(guò)使用everysec選項(xiàng),用戶(hù)可以將數(shù)據(jù)丟失的時(shí)間窗口限制在1秒之內(nèi)。(文件同步機(jī)制改進(jìn))

缺點(diǎn)

AOF文件存儲(chǔ)的是協(xié)議文本,它的體積要比二進(jìn)制格式的”.rdb”文件大很多。AOF需要通過(guò)執(zhí)行AOF文件中的命令來(lái)恢復(fù)數(shù)據(jù)庫(kù),其恢復(fù)速度比RDB慢很多。AOF在進(jìn)行重寫(xiě)時(shí)也需要?jiǎng)?chuàng)建子進(jìn)程,在數(shù)據(jù)庫(kù)體積較大時(shí)將占用大量資源,會(huì)導(dǎo)致服務(wù)器的短暫阻塞。

工作流程

文本協(xié)議格式

*3\r\n$3\r\nset\r\n$5\r\nhello\r\n$5\r\nworld\r\n

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

文本協(xié)議具有很好的兼容性;直接采用文本協(xié)議格式,可以避免二次處理的開(kāi)銷(xiāo);文本協(xié)議具有可讀性,方便直接修改和處理。

文件同步機(jī)制

特點(diǎn)

為了提高程序的寫(xiě)入性能,現(xiàn)代操作系統(tǒng)會(huì)把針對(duì)硬盤(pán)的多次寫(xiě)操作優(yōu)化為一次寫(xiě)操作。

步驟

當(dāng)程序調(diào)用write對(duì)文件寫(xiě)入時(shí),系統(tǒng)不會(huì)直接把書(shū)記寫(xiě)入硬盤(pán),而是先將數(shù)據(jù)寫(xiě)入內(nèi)存的緩沖區(qū)中;當(dāng)達(dá)到特定的時(shí)間周期或緩沖區(qū)寫(xiě)滿(mǎn)時(shí),系統(tǒng)才會(huì)執(zhí)行flush操作,將緩沖區(qū)中的數(shù)據(jù)沖洗至硬盤(pán)中; 改進(jìn)

這種優(yōu)化機(jī)制雖然提高了性能,但也給程序的寫(xiě)入操作帶來(lái)了不確定性,為了消除上述機(jī)制的不確定性,Redis向用戶(hù)提供了appendfsync選項(xiàng),來(lái)控制系統(tǒng)沖洗AOF的頻率

appendfsync選項(xiàng)的取值

RDB-AOF混合

定義

Redis從4.0開(kāi)始引入RDB-AOF混合持久化模式,這種模式是基于AOF持久化構(gòu)建而來(lái)的。用戶(hù)可以通過(guò)配置文件中的“aof-use-rdb-preamble yes”配置項(xiàng)開(kāi)啟AOF混合持久化。

原理

通過(guò)使用RDB-AOF混合持久化,用戶(hù)可以同時(shí)獲得RDB持久化和AOF持久化的優(yōu)點(diǎn),服務(wù)器既可以通過(guò)AOF文件包含的RDB數(shù)據(jù)來(lái)實(shí)現(xiàn)快速的數(shù)據(jù)恢復(fù)操作,又可以通過(guò)AOF文件包含的AOF數(shù)據(jù)來(lái)將丟失數(shù)據(jù)的時(shí)間窗口限制在1s之內(nèi)。

步驟

像執(zhí)行BGSAVE命令一樣,根據(jù)數(shù)據(jù)庫(kù)當(dāng)前的狀態(tài)生成相應(yīng)的RDB數(shù)據(jù),并將其寫(xiě)入AOF文件中;對(duì)于重寫(xiě)之后執(zhí)行的Redis命令,則以協(xié)議文本的方式追加到AOF文件的末尾,即RDB數(shù)據(jù)之后。

Redis發(fā)布訂閱

定義

Redis發(fā)布訂閱(pub/sub)是一種消息通信模式:發(fā)送者(pub)發(fā)送消息,訂閱者(sub)接受消息。(類(lèi)似于消息隊(duì)列)

圖示

總結(jié)

Pub/Sub 從字面上理解就是發(fā)布(Publish)與訂閱(Subscribe),在Redis中,你可以設(shè)定對(duì)某一個(gè)key值進(jìn)行消息發(fā)布及消息訂閱,當(dāng)一個(gè)key值上進(jìn)行了消息發(fā)布后,所有訂閱它的客戶(hù)端都會(huì)收到相應(yīng)的消息。這一功能最明顯的用法就是用作實(shí)時(shí)消息系統(tǒng),比如普通的即時(shí)聊天,群聊等功能。

主從復(fù)制

定義

是指將一臺(tái)Redis服務(wù)器的數(shù)據(jù),復(fù)制到其他的Redis服務(wù)器。前者稱(chēng)為主節(jié)點(diǎn)(master/leader),后者稱(chēng)為從節(jié)點(diǎn)(slave/follower);數(shù)據(jù)的復(fù)制是單向的,只能由主節(jié)點(diǎn)到從節(jié)點(diǎn)。Master以寫(xiě)為主,Slave 以讀為主。

作用

數(shù)據(jù)冗余 主從復(fù)制實(shí)現(xiàn)了數(shù)據(jù)的熱備份,是持久化之外的一種數(shù)據(jù)冗余方式。 故障恢復(fù) 當(dāng)主節(jié)點(diǎn)出現(xiàn)問(wèn)題時(shí),可以由從節(jié)點(diǎn)提供服務(wù),實(shí)現(xiàn)快速的故障恢復(fù);實(shí)際上是一種服務(wù)的冗余。 負(fù)載均衡 在主從復(fù)制的基礎(chǔ)上,配合讀寫(xiě)分離,可以由主節(jié)點(diǎn)提供寫(xiě)服務(wù),由從節(jié)點(diǎn)提供讀服務(wù)(即寫(xiě)Redis數(shù)據(jù)時(shí)應(yīng)用連接主節(jié)點(diǎn),讀Redis數(shù)據(jù)時(shí)應(yīng)用連接從節(jié)點(diǎn)),分擔(dān)服務(wù)器負(fù)載;尤其是在寫(xiě)少讀多的場(chǎng)景下,通過(guò)多個(gè)從節(jié)點(diǎn)分擔(dān)讀負(fù)載,可以大大提高Redis服務(wù)器的并發(fā)量。 高可用(集群)基石 除了上述作用以外,主從復(fù)制還是哨兵和集群能夠?qū)嵤┑幕A(chǔ),因此說(shuō)主從復(fù)制是Redis高可用的基礎(chǔ)。

實(shí)現(xiàn)

Redis使用psync命令完成主從數(shù)據(jù)同步,同步過(guò)程分為全量復(fù)制和部分復(fù)制。全量復(fù)制一般用于初次復(fù)制的場(chǎng)景,部分復(fù)制則用于處理因網(wǎng)絡(luò)中斷等原因造成數(shù)據(jù)丟失的場(chǎng)景。 psync命令參數(shù)

復(fù)制偏移量積壓緩沖區(qū)主節(jié)點(diǎn)運(yùn)行ID 返回結(jié)果

哨兵模式

定義

Redis Sentinel(哨兵)是一個(gè)分布式架構(gòu),它包含若干個(gè)哨兵節(jié)點(diǎn)和數(shù)據(jù)節(jié)點(diǎn)。每個(gè)哨兵節(jié)點(diǎn)會(huì)對(duì)數(shù)據(jù)節(jié)點(diǎn)和其余的哨兵節(jié)點(diǎn)進(jìn)行監(jiān)控,當(dāng)發(fā)現(xiàn)節(jié)點(diǎn)不可達(dá)時(shí),會(huì)對(duì)節(jié)點(diǎn)做下線(xiàn)標(biāo)識(shí)。如果被標(biāo)識(shí)的是主節(jié)點(diǎn),它就會(huì)與其他的哨兵節(jié)點(diǎn)進(jìn)行協(xié)商,當(dāng)多數(shù)哨兵節(jié)點(diǎn)都認(rèn)為主節(jié)點(diǎn)不可達(dá)時(shí),它們便會(huì)選舉出一個(gè)哨兵節(jié)點(diǎn)來(lái)完成自動(dòng)故障轉(zhuǎn)移的工作,同時(shí)還會(huì)將這個(gè)變化實(shí)時(shí)地通知給應(yīng)用方。整個(gè)過(guò)程是自動(dòng)的,不需要人工介入,有效地解決了Redis的高可用問(wèn)題!

原理

哨兵模式是一種特殊的模式,首先Redis提供了哨兵的命令,哨兵是一個(gè)獨(dú)立的 進(jìn)程 ,作為進(jìn)程,它會(huì)獨(dú)立運(yùn)行。其原理是哨兵通過(guò)發(fā)送命令,等待Redis服務(wù)器響應(yīng),從而監(jiān)控運(yùn)行的多個(gè)Redis實(shí)例。

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

哨兵集群,基于主從復(fù)制模式 ,所有的主從配置優(yōu)點(diǎn),它全有主從可以切換,故障可以轉(zhuǎn)移 ,系統(tǒng)的 可用性 就會(huì)更好哨兵模式就是主從模式的升級(jí),手動(dòng)到自動(dòng),更加健壯!

缺點(diǎn)

Redis 不好在線(xiàn)擴(kuò)容 的,集群容量一旦到達(dá)上限,在線(xiàn)擴(kuò)容就十分麻煩?、趯?shí)現(xiàn)哨兵模式的配置其實(shí)是很 麻煩 的,里面有很多選擇!

圖示

特征

哨兵節(jié)點(diǎn)會(huì)定期監(jiān)控?cái)?shù)據(jù)節(jié)點(diǎn),其他哨兵節(jié)點(diǎn)是否可達(dá);哨兵節(jié)點(diǎn)會(huì)將故障轉(zhuǎn)移的結(jié)果通知給應(yīng)用方;哨兵節(jié)點(diǎn)可以將從節(jié)點(diǎn)晉升為主節(jié)點(diǎn),并維護(hù)后續(xù)正確的主從關(guān)系;哨兵模式下,客戶(hù)端連接的是哨兵節(jié)點(diǎn)集合,從中獲取主節(jié)點(diǎn)信息;節(jié)點(diǎn)的故障判斷是由多個(gè)哨兵節(jié)點(diǎn)共同完成的,可有效地防止誤判;哨兵節(jié)點(diǎn)集合是由多個(gè)哨兵節(jié)點(diǎn)組成的,即使個(gè)別哨兵節(jié)點(diǎn)不可用,整個(gè)集合依然是健壯的;哨兵節(jié)點(diǎn)也是獨(dú)立的Redis節(jié)點(diǎn),是特殊的Redis節(jié)點(diǎn),它們不存儲(chǔ)數(shù)據(jù),只支持部分命令。

緩存問(wèn)題

緩存穿透

定義

用戶(hù)需要查詢(xún)一個(gè)數(shù)據(jù),但是redis中沒(méi)有(比如說(shuō)mysql中id=-1的數(shù)),直接去請(qǐng)求MySQL,當(dāng)很多用戶(hù)同時(shí)請(qǐng)求并且都么有命中!于是都去請(qǐng)求了持久層的數(shù)據(jù)庫(kù),那么這樣會(huì)給持久層數(shù)據(jù)庫(kù)帶來(lái)非常大的壓力。一般出現(xiàn)這樣的情況都不是正常用戶(hù),基本上都是惡意用戶(hù)!

解決方案

布隆過(guò)濾器

布隆過(guò)濾器可以用很低的代價(jià),估算出數(shù)據(jù)是否真實(shí)存在。例如:給用戶(hù)推薦新聞時(shí),要去掉重復(fù)的新聞,就可以利用布隆過(guò)濾器,判斷該新聞是否已經(jīng)推薦過(guò)。核心

一個(gè)大型的位數(shù)組若干個(gè)不一樣的哈希函數(shù),每個(gè)哈希函數(shù)都能將哈希值算的比較均勻 工作原理

添加key時(shí),每個(gè)哈希函數(shù)都利用這個(gè)key計(jì)算出一個(gè)哈希值,再根據(jù)哈希值計(jì)算一個(gè)位置,并將位數(shù)組中這個(gè)位置的值設(shè)置為1。詢(xún)問(wèn)key時(shí),每個(gè)哈希函數(shù)都利用這個(gè)key計(jì)算出一個(gè)哈希值,再根據(jù)哈希值計(jì)算一個(gè)位置。然后對(duì)比這些哈希函數(shù)在位數(shù)組中對(duì)應(yīng)位置的數(shù)值:

如果這幾個(gè)位置中,有一個(gè)位置的值是0,就說(shuō)明這個(gè)布隆過(guò)濾器中,不存在這個(gè)key。如果這幾個(gè)位置中,所有位置的值都是1,就說(shuō)明這個(gè)布隆過(guò)濾器中,極有可能存在這個(gè)key。之所以不是百分之百確定,是因?yàn)橐部赡苁瞧渌膋ey運(yùn)算導(dǎo)致該位置為1。 緩存空對(duì)象

原理

當(dāng)存儲(chǔ)層查不到,即使是空值,我們也將其存儲(chǔ)起來(lái)并且在Redis中設(shè)置一個(gè)過(guò)期時(shí)間,之后再訪(fǎng)問(wèn)這個(gè)數(shù)據(jù)將會(huì)從Redis中訪(fǎng)問(wèn),保護(hù)了持久層的數(shù)據(jù)庫(kù)! 問(wèn)題

如果空值能夠被緩存起來(lái),這就意味著緩存需要更多的空間存儲(chǔ)更多的鍵,因?yàn)檫@當(dāng)中可能會(huì)有很多的空值的鍵;即使對(duì)空值設(shè)置了過(guò)期時(shí)間,還是會(huì)存在緩存層和存儲(chǔ)層的數(shù)據(jù)會(huì)有一段時(shí)間窗口的不一致,這對(duì)于需要保持一致性的業(yè)務(wù)會(huì)有影響。 圖示

緩存擊穿

定義

是指一個(gè)非常熱點(diǎn)的key,在不停的扛著大并發(fā),當(dāng)這個(gè)key失效時(shí),一瞬間大量的請(qǐng)求沖到持久層的數(shù)據(jù)庫(kù)中,就像在一堵墻上某個(gè)點(diǎn)鑿開(kāi)了一個(gè)洞!

解決方案

設(shè)置熱點(diǎn)key永不過(guò)期

從緩存層面來(lái)看,沒(méi)有設(shè)置過(guò)期時(shí)間,所以不會(huì)出現(xiàn)熱點(diǎn) key 過(guò)期后產(chǎn)生的問(wèn)題。其實(shí)設(shè)置永不過(guò)期不合理! 加互斥鎖

在查詢(xún)持久層數(shù)據(jù)庫(kù)時(shí),保證了只有一個(gè)線(xiàn)程能夠進(jìn)行持久層數(shù)據(jù)查詢(xún),其他的線(xiàn)程讓它睡眠幾百毫秒,等待第一個(gè)線(xiàn)程查詢(xún)完會(huì)回寫(xiě)到Redis緩存當(dāng)中,剩下的線(xiàn)程可以正常查詢(xún)Redis緩存,就不存在大量請(qǐng)求去沖擊持久層數(shù)據(jù)庫(kù)了!

熱點(diǎn)Key問(wèn)題

定義

熱key問(wèn)題就是某個(gè)瞬間有大量的請(qǐng)求去訪(fǎng)問(wèn)Redis上某個(gè)固定的key,導(dǎo)致緩存擊穿,請(qǐng)求都打到了DB上,壓垮了緩存服務(wù)和DB服務(wù),從而影響到應(yīng)用服務(wù)可用的可用性;

熱點(diǎn)key判斷

通常以Key被請(qǐng)求頻率來(lái)判定,目前沒(méi)有很具體的數(shù)值來(lái)定義熱keyQPS集中在特定的Key:Redis實(shí)例的總QPS(每秒查詢(xún)率)為2W,而其中一個(gè)Key的每秒訪(fǎng)問(wèn)量達(dá)到了1W以上帶寬使用率集中在特定的Key:對(duì)一個(gè)擁有上千個(gè)成員且總大小為1MB以上的HASH Key,每秒發(fā)送大量的HGETALL操作請(qǐng)求CPU使用時(shí)間占比集中在特定的Key:對(duì)一個(gè)擁有數(shù)萬(wàn)個(gè)成員的Key(ZSET類(lèi)型)每秒發(fā)送大量的ZRANGE操作請(qǐng)求

危害

流量集中,達(dá)到物理網(wǎng)卡上限

當(dāng)某一熱點(diǎn)Key的請(qǐng)求在某一節(jié)點(diǎn)所在的主機(jī)上超過(guò)該主機(jī)網(wǎng)卡流量上限時(shí),由于流量的過(guò)度集中,會(huì)導(dǎo)致該節(jié)點(diǎn)的服務(wù)器中其它服務(wù)無(wú)法進(jìn)行; 請(qǐng)求過(guò)多,緩存分片服務(wù)被打垮

Redis單點(diǎn)查詢(xún)性能是有限的,當(dāng)熱點(diǎn)key的查詢(xún)超過(guò)Redis節(jié)點(diǎn)的性能閾值時(shí),請(qǐng)求會(huì)占用大量的CPU資源,影響其他請(qǐng)求并導(dǎo)致整體性能降低;嚴(yán)重時(shí)會(huì)導(dǎo)致緩存分片服務(wù)被打垮,表現(xiàn)形式之一就是Redis節(jié)點(diǎn)自重啟,此時(shí)該節(jié)點(diǎn)存儲(chǔ)的所有key的查詢(xún)都是不可用狀態(tài),會(huì)把影響輻射到其他業(yè)務(wù)上; 集群架構(gòu)下,產(chǎn)生訪(fǎng)問(wèn)傾斜

即某個(gè)數(shù)據(jù)分片被大量訪(fǎng)問(wèn),而其他數(shù)據(jù)分片處于空閑狀態(tài),可能引起該數(shù)據(jù)分片的連接數(shù)被耗盡,新的連接建立請(qǐng)求被拒絕等問(wèn)題; DB 擊穿,引起業(yè)務(wù)雪崩

發(fā)現(xiàn)熱點(diǎn)key

憑借業(yè)務(wù)經(jīng)驗(yàn),進(jìn)行預(yù)估哪些是熱key 比如某一個(gè)整點(diǎn)秒殺活動(dòng),活動(dòng)信息的key、存放頭部樓層的秒殺商品的信息的key一般就是熱點(diǎn)key;但是并不是每個(gè)熱key都能被準(zhǔn)確的預(yù)測(cè),如對(duì)于電商平臺(tái)來(lái)說(shuō),商家什么時(shí)候會(huì)上架相對(duì)火爆的秒殺活動(dòng)就很難預(yù)測(cè)了,但是可以借助對(duì)不同商家的歷史活動(dòng)的數(shù)據(jù)分析來(lái)做一定的參考; 業(yè)務(wù)側(cè)自行監(jiān)控和收集 這個(gè)方式就是在操作redis之前,加入一行代碼進(jìn)行數(shù)據(jù)統(tǒng)計(jì),異步上報(bào)行為;如類(lèi)似日志采集,將單次redis命令的操作/結(jié)果/耗時(shí)等統(tǒng)計(jì),異步消息發(fā)送給采集消息隊(duì)列, 一般可以交給中間件加在自己包的redis二方包中;如果有做的好一點(diǎn)的Daas平臺(tái),可以在proxy層做監(jiān)控,業(yè)務(wù)無(wú)需感知,統(tǒng)一在Daas平臺(tái)查看redis監(jiān)控; 用redis自帶命令

monitor命令:該命令可以實(shí)時(shí)抓取出redis服務(wù)器接收到的命令,然后寫(xiě)代碼統(tǒng)計(jì)出熱key是啥;當(dāng)然,也有現(xiàn)成的分析工具可以給你使用,比如redis-faina;但是該命令在高并發(fā)的條件下,有內(nèi)存增暴增的隱患,還會(huì)降低redis的性能。hotkeys參數(shù):redis 4.0.3提供了redis-cli的熱點(diǎn)key發(fā)現(xiàn)功能,執(zhí)行redis-cli時(shí)加上–hotkeys選項(xiàng)即可;但是該參數(shù)在執(zhí)行的時(shí)候,如果key比較多,執(zhí)行起來(lái)比較慢;參考:Redis 4.0熱點(diǎn)Key查詢(xún)方法;但是一般公司是不允許直接連接redis節(jié)點(diǎn)自己輸入命令的,而是直接通過(guò)Daas平臺(tái)查看熱點(diǎn)key的分析和監(jiān)控;

解決方案

使用二級(jí)緩存

使用本地緩存,如利用ehcache、GuavaCache等,甚至是一個(gè)HashMap都可以;在發(fā)現(xiàn)熱key以后,把熱key加載到系統(tǒng)的JVM中,針對(duì)這種熱key請(qǐng)求,會(huì)直接從本地緩存中取,而不會(huì)直接請(qǐng)求redis;本地緩存天然的將同一個(gè)key的大量請(qǐng)求,根據(jù)網(wǎng)絡(luò)層的負(fù)載均衡,均勻分散到了不同的機(jī)器節(jié)點(diǎn)上,避免了對(duì)于固定key全部打到單個(gè)redis節(jié)點(diǎn)的情況,并且減少了1次網(wǎng)絡(luò)交互;使用本地緩存不可避免的遇到的問(wèn)題就是,對(duì)于要求緩存強(qiáng)一致性的業(yè)務(wù)來(lái)說(shuō),需要花費(fèi)更多的精力在保證分布式緩存一致性上,會(huì)增加系統(tǒng)的復(fù)雜度; 將熱key分散到不同的服務(wù)器中

不要讓固定key老是走到同一臺(tái)redis節(jié)點(diǎn)上;我們把這個(gè)key,在多個(gè)redis節(jié)點(diǎn)上都備份一份即可,在有熱key請(qǐng)求進(jìn)來(lái)的時(shí)候,我們就在有備份的redis上隨機(jī)選取一臺(tái),進(jìn)行訪(fǎng)問(wèn)取值,返回?cái)?shù)據(jù),就能緩解redis單點(diǎn)熱key的查詢(xún)壓力;因?yàn)閞edis是根據(jù)key分配哈希槽,因此在初始化時(shí),可以將key拼接上隨機(jī)尾綴,如下圖的0-2N,生成的多個(gè)備份key散落在各個(gè)redis節(jié)點(diǎn)上,查詢(xún)的時(shí)候也是隨機(jī)拼接成這多個(gè)備份key中的一個(gè),進(jìn)行查詢(xún),從而讓讀寫(xiě)都不再集中于單個(gè)redis節(jié)點(diǎn); 熱key拆分

因此解決熱key的思路之一就是能否想辦法把這個(gè)key給細(xì)化拆分,讓不同用戶(hù)請(qǐng)求的key是不一樣的如秒殺活動(dòng)場(chǎng)景,不同用戶(hù)根據(jù)人群規(guī)則命中的活動(dòng)策略ID可能是不同的,因此我們可以將整個(gè)活動(dòng)元信息拆分成以策略為維度,把活動(dòng)信息的key細(xì)化;這樣請(qǐng)求過(guò)來(lái)時(shí),根據(jù)用戶(hù)人群策略,只會(huì)去找該策略綁定的活動(dòng)信息的key, 將核心/非核心業(yè)務(wù)做Redis的隔離

當(dāng)熱點(diǎn)key的查詢(xún)超過(guò)Redis節(jié)點(diǎn)的性能閾值時(shí),會(huì)導(dǎo)致緩存分片服務(wù)被打垮現(xiàn)象的產(chǎn)生,此時(shí)當(dāng)前節(jié)點(diǎn)上的所有業(yè)務(wù)的redis的讀寫(xiě)都是不可用的;為了防止熱點(diǎn)key引發(fā)問(wèn)題時(shí),核心業(yè)務(wù)不受影響,應(yīng)當(dāng)提前做好核心/非核心業(yè)務(wù)的Redis的隔離,至少熱點(diǎn)key存在的redis集群應(yīng)當(dāng)與核心業(yè)務(wù)隔離開(kāi)來(lái);

緩存雪崩

定義

在某一個(gè)時(shí)間段,緩存的key大量集中同時(shí)過(guò)期了,所有的請(qǐng)求全部沖到持久層數(shù)據(jù)庫(kù)上,導(dǎo)致持久層數(shù)據(jù)庫(kù)掛掉!

舉例

雙十一零點(diǎn)搶購(gòu),這波商品比較集中的放在緩存,設(shè)置了失效時(shí)間為1個(gè)小時(shí),那么到了零點(diǎn),這批緩存全部失效了,而大量的請(qǐng)求過(guò)來(lái)時(shí),全部沖過(guò)了緩存,沖到了持久層數(shù)據(jù)庫(kù)!

解決方案

Redis高可用

搭建Redis集群,既然redis有可能掛掉,那我多增設(shè)幾臺(tái)redis,這樣一臺(tái)掛掉之后其他的還可以繼續(xù)工作,其實(shí)就是搭建的集群。(異地多活?。?限流降級(jí)

在緩存失效后,通過(guò)加鎖或者隊(duì)列來(lái)控制讀數(shù)據(jù)庫(kù)寫(xiě)緩存的線(xiàn)程數(shù)量。比如對(duì)某個(gè)key只允許一個(gè)線(xiàn)程查詢(xún)數(shù)據(jù)和寫(xiě)緩存,其他線(xiàn)程等待。 數(shù)據(jù)預(yù)熱

數(shù)據(jù)加熱的含義就是在正式部署之前,我先把可能的數(shù)據(jù)先預(yù)先訪(fǎng)問(wèn)一遍,這樣部分可能大量訪(fǎng)問(wèn)的數(shù)據(jù)就會(huì)加載到緩存中。在即將發(fā)生大并發(fā)訪(fǎng)問(wèn)前手動(dòng)觸發(fā)加載緩存不同的key,設(shè)置不同的過(guò)期時(shí)間,讓緩存失效的時(shí)間點(diǎn)盡量均勻

柚子快報(bào)激活碼778899分享:中間件|day1.Redis

http://yzkb.51969.com/

相關(guān)鏈接

評(píng)論可見(jiàn),查看隱藏內(nèi)容

本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。

轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。

本文鏈接:http://gantiao.com.cn/post/19585119.html

發(fā)布評(píng)論

您暫未設(shè)置收款碼

請(qǐng)?jiān)谥黝}配置——文章設(shè)置里上傳

掃描二維碼手機(jī)訪(fǎng)問(wèn)

文章目錄