大廠 Redis 性能優(yōu)化的 13 條軍規(guī)!收好了

Redis 是基于單線程模型實現(xiàn)的磕洪,也就是 Redis 是使用一個線程來處理所有的客戶端請求的吭练,盡管 Redis 使用了非阻塞式 IO,并且對各種命令都做了優(yōu)化(大部分命令操作時間復(fù)雜度都是 O(1))析显,但由于 Redis 是單線程執(zhí)行的特點鲫咽,因此它對性能的要求更加苛刻,本文我們將通過一些優(yōu)化手段,讓 Redis 更加高效的運行分尸。

本文我們將使用以下手段姊舵,來提升 Redis 的運行速度:

縮短鍵值對的存儲長度;

使用 lazy free(延遲刪除)特性寓落;

設(shè)置鍵值的過期時間;

禁用長耗時的查詢命令荞下;

使用 slowlog 優(yōu)化耗時命令伶选;

使用 Pipeline 批量操作數(shù)據(jù);

避免大量數(shù)據(jù)同時失效尖昏;

客戶端使用優(yōu)化仰税;

限制 Redis 內(nèi)存大小抽诉;

使用物理機而非虛擬機安裝 Redis 服務(wù)陨簇;

檢查數(shù)據(jù)持久化策略;

禁用 THP 特性迹淌;

使用分布式架構(gòu)來增加讀寫速度河绽。

1.縮短鍵值對的存儲長度

鍵值對的長度是和性能成反比的,比如我們來做一組寫入數(shù)據(jù)的性能測試唉窃,執(zhí)行結(jié)果如下:

從以上數(shù)據(jù)可以看出耙饰,在 key 不變的情況下,value 值越大操作效率越慢纹份,因為 Redis 對于同一種數(shù)據(jù)類型會使用不同的內(nèi)部編碼進(jìn)行存儲苟跪,比如字符串的內(nèi)部編碼就有三種:?int(整數(shù)編碼)、raw(優(yōu)化內(nèi)存分配的字符串編碼)蔓涧、embstr(動態(tài)字符串編碼)件已,這是因為 Redis 的作者是想通過不同編碼實現(xiàn)效率和空間的平衡,然而數(shù)據(jù)量越大使用的內(nèi)部編碼就越復(fù)雜元暴,而越是復(fù)雜的內(nèi)部編碼存儲的性能就越低篷扩。

這還只是寫入時的速度,當(dāng)鍵值對內(nèi)容較大時昨寞,還會帶來另外幾個問題:

內(nèi)容越大需要的持久化時間就越長瞻惋,需要掛起的時間越長,Redis 的性能就會越低援岩;

內(nèi)容越大在網(wǎng)絡(luò)上傳輸?shù)膬?nèi)容就越多歼狼,需要的時間就越長,整體的運行速度就越低享怀;

內(nèi)容越大占用的內(nèi)存就越多羽峰,就會更頻繁的觸發(fā)內(nèi)存淘汰機制,從而給 Redis 帶來了更多的運行負(fù)擔(dān)。

因此在保證完整語義的同時梅屉,我們要盡量的縮短鍵值對的存儲長度值纱,必要時要對數(shù)據(jù)進(jìn)行序列化和壓縮再存儲,以 Java 為例坯汤,序列化我們可以使用 protostuff 或 kryo虐唠,壓縮我們可以使用 snappy。

2.使用?lazy free 特性

lazy free 特性是 Redis 4.0 新增的一個非常使用的功能惰聂,它可以理解為惰性刪除或延遲刪除疆偿。意思是在刪除的時候提供異步延時釋放鍵值的功能,把鍵值釋放操作放在 BIO(Background I/O) 單獨的子線程處理中搓幌,以減少刪除刪除對 Redis 主線程的阻塞杆故,可以有效地避免刪除 big key 時帶來的性能和可用性問題。

lazy free 對應(yīng)了 4 種場景溉愁,默認(rèn)都是關(guān)閉的:

lazyfree-lazy-eviction no

lazyfree-lazy-expire no

lazyfree-lazy-server-del no

slave-lazy-flush no

它們代表的含義如下:

lazyfree-lazy-eviction:表示當(dāng) Redis 運行內(nèi)存超過 maxmeory 時处铛,是否開啟 lazy free 機制刪除;

lazyfree-lazy-expire:表示設(shè)置了過期時間的鍵值拐揭,當(dāng)過期之后是否開啟 lazy free 機制刪除撤蟆;

lazyfree-lazy-server-del:有些指令在處理已存在的鍵時,會帶有一個隱式的 del 鍵的操作投队,比如 rename 命令枫疆,當(dāng)目標(biāo)鍵已存在,Redis 會先刪除目標(biāo)鍵敷鸦,如果這些目標(biāo)鍵是一個 big key息楔,就會造成阻塞刪除的問題,此配置表示在這種場景中是否開啟 lazy free 機制刪除扒披;

slave-lazy-flush:針對 slave(從節(jié)點) 進(jìn)行全量數(shù)據(jù)同步值依,slave 在加載 master 的 RDB 文件前,會運行 flushall 來清理自己的數(shù)據(jù)碟案,它表示此時是否開啟 lazy free 機制刪除愿险。

建議開啟其中的 lazyfree-lazy-eviction、lazyfree-lazy-expire价说、lazyfree-lazy-server-del 等配置辆亏,這樣就可以有效的提高主線程的執(zhí)行效率。

3.設(shè)置鍵值的過期時間

我們應(yīng)該根據(jù)實際的業(yè)務(wù)情況鳖目,對鍵值設(shè)置合理的過期時間扮叨,這樣 Redis 會幫你自動清除過期的鍵值對,以節(jié)約對內(nèi)存的占用领迈,以避免鍵值過多的堆積彻磁,頻繁的觸發(fā)內(nèi)存淘汰策略碍沐。

4.禁用長耗時的查詢命令

Redis 絕大多數(shù)讀寫命令的時間復(fù)雜度都在 O(1) 到 O(N) 之間,在官方文檔對每命令都有時間復(fù)雜度說明衷蜓,地址:https://redis.io/commands累提,如下圖所示:

其中 O(1) 表示可以安全使用的,而 O(N) 就應(yīng)該當(dāng)心了磁浇,N 表示不確定斋陪,數(shù)據(jù)越大查詢的速度可能會越慢。因為 Redis 只用一個線程來做數(shù)據(jù)查詢置吓,如果這些指令耗時很長鳍贾,就會阻塞 Redis,造成大量延時交洗。

要避免 O(N) 命令對 Redis 造成的影響,可以從以下幾個方面入手改造:

決定禁止使用 keys 命令橡淑;

避免一次查詢所有的成員构拳,要使用 scan 命令進(jìn)行分批的,游標(biāo)式的遍歷梁棠;

通過機制嚴(yán)格控制 Hash置森、Set、Sorted Set 等結(jié)構(gòu)的數(shù)據(jù)大蟹凫海;

將排序、并集男娄、交集等操作放在客戶端執(zhí)行行贪,以減少 Redis 服務(wù)器運行壓力;

刪除 (del) 一個大數(shù)據(jù)的時候模闲,可能會需要很長時間,所以建議用異步刪除的方式 unlink,它會啟動一個新的線程來刪除目標(biāo)數(shù)據(jù)氧敢,而不阻塞 Redis 的主線程庆冕。

5.使用 slowlog 優(yōu)化耗時命令

我們可以使用 slowlog 功能找出最耗時的 Redis 命令進(jìn)行相關(guān)的優(yōu)化,以提升 Redis 的運行速度实夹,慢查詢有兩個重要的配置項:

slowlog-log-slower-than?:用于設(shè)置慢查詢的評定時間橄浓,也就是說超過此配置項的命令,將會被當(dāng)成慢操作記錄在慢查詢?nèi)罩局辛梁剑鼒?zhí)行單位是微秒 (1 秒等于 1000000 微秒)荸实;

slowlog-max-len?:用來配置慢查詢?nèi)罩镜淖畲笥涗洈?shù)。

我們可以根據(jù)實際的業(yè)務(wù)情況進(jìn)行相應(yīng)的配置塞赂,其中慢日志是按照插入的順序倒序存入慢查詢?nèi)罩局欣崂眨覀兛梢允褂?slowlog get n?來獲取相關(guān)的慢查詢?nèi)罩局缰僬业竭@些慢查詢對應(yīng)的業(yè)務(wù)進(jìn)行相關(guān)的優(yōu)化。

6.使用 Pipeline 批量操作數(shù)據(jù)

Pipeline (管道技術(shù)) 是客戶端提供的一種批處理技術(shù)圆存,用于一次處理多個 Redis 命令叼旋,從而提高整個交互的性能。

我們使用 Java 代碼來測試一下 Pipeline 和普通操作的性能對比沦辙,Pipeline 的測試代碼如下:

public?class?PipelineExample?{

public?static?void?main?(String[] args)?{

Jedis jedis =?new?Jedis(?"127.0.0.1"?,?6379?);

// 記錄執(zhí)行開始時間

long?beginTime = System.currentTimeMillis();

// 獲取 Pipeline 對象

Pipeline pipe = jedis.pipelined();

// 設(shè)置多個 Redis 命令

for?(?int?i =?0?; i <?100?; i++) {

pipe.set(?"key"?+ i,?"val"?+ i);

pipe.del(?"key"?+i);

}

// 執(zhí)行命令

pipe.sync();

// 記錄執(zhí)行結(jié)束時間

long?endTime = System.currentTimeMillis();

System.out.println(?"執(zhí)行耗時:"?+ (endTime - beginTime) +?"毫秒"?);

}

}

以上程序執(zhí)行結(jié)果為:

執(zhí)行耗時:297毫秒

普通的操作代碼如下:

public?class?PipelineExample?{

public?static?void?main?(String[] args)?{

Jedis jedis =?new?Jedis(?"127.0.0.1"?,?6379?);

// 記錄執(zhí)行開始時間

long?beginTime = System.currentTimeMillis();

for?(?int?i =?0?; i <?100?; i++) {

jedis.set(?"key"?+ i,?"val"?+ i);

jedis.del(?"key"?+i);

}

// 記錄執(zhí)行結(jié)束時間

long?endTime = System.currentTimeMillis();

System.out.println(?"執(zhí)行耗時:"?+ (endTime - beginTime) +?"毫秒"?);

}

}

以上程序執(zhí)行結(jié)果為:

執(zhí)行耗時:17276毫秒

從以上的結(jié)果可以看出夫植,管道的執(zhí)行時間是 297 毫秒,而普通命令執(zhí)行時間是 17276 毫秒油讯,管道技術(shù)要比普通的執(zhí)行大約快了 58 倍详民。

7.避免大量數(shù)據(jù)同時失效

Redis 過期鍵值刪除使用的是貪心策略,它每秒會進(jìn)行 10 次過期掃描陌兑,此配置可在 redis.conf 進(jìn)行配置沈跨,默認(rèn)值是?hz 10?,Redis 會隨機抽取 20 個值兔综,刪除這 20 個鍵中過期的鍵饿凛,如果過期 key 的比例超過 25% ,重復(fù)執(zhí)行此流程软驰,如下圖所示:

如果在大型系統(tǒng)中有大量緩存在同一時間同時過期涧窒,那么會導(dǎo)致 Redis 循環(huán)多次持續(xù)掃描刪除過期字典,直到過期字典中過期鍵值被刪除的比較稀疏為止锭亏,而在整個執(zhí)行過程會導(dǎo)致 Redis 的讀寫出現(xiàn)明顯的卡頓纠吴,卡頓的另一種原因是內(nèi)存管理器需要頻繁回收內(nèi)存頁,因此也會消耗一定的 CPU慧瘤。

為了避免這種卡頓現(xiàn)象的產(chǎn)生戴已,我們需要預(yù)防大量的緩存在同一時刻一起過期,就簡單的解決方案就是在過期時間的基礎(chǔ)上添加一個指定范圍的隨機數(shù)锅减。

8.客戶端使用優(yōu)化

在客戶端的使用上我們除了要盡量使用 Pipeline 的技術(shù)外恭陡,還需要注意要盡量使用 Redis 連接池,而不是頻繁創(chuàng)建銷毀 Redis 連接上煤,這樣就可以減少網(wǎng)絡(luò)傳輸次數(shù)和減少了非必要調(diào)用指令休玩。

9.限制 Redis 內(nèi)存大小

在 64 位操作系統(tǒng)中 Redis 的內(nèi)存大小是沒有限制的,也就是配置項?maxmemory <bytes>?是被注釋掉的劫狠,這樣就會導(dǎo)致在物理內(nèi)存不足時拴疤,使用 swap 空間既交換空間,而當(dāng)操心系統(tǒng)將 Redis 所用的內(nèi)存分頁移至 swap 空間時独泞,將會阻塞 Redis 進(jìn)程呐矾,導(dǎo)致 Redis 出現(xiàn)延遲,從而影響 Redis 的整體性能懦砂。因此我們需要限制 Redis 的內(nèi)存大小為一個固定的值蜒犯,當(dāng) Redis 的運行到達(dá)此值時會觸發(fā)內(nèi)存淘汰策略组橄,?內(nèi)存淘汰策略在 Redis 4.0 之后有 8 種?:

noeviction:不淘汰任何數(shù)據(jù),當(dāng)內(nèi)存不足時罚随,新增操作會報錯玉工,Redis 默認(rèn)內(nèi)存淘汰策略;

allkeys-lru:淘汰整個鍵值中最久未使用的鍵值淘菩;

allkeys-random:隨機淘汰任意鍵值;

volatile-lru:淘汰所有設(shè)置了過期時間的鍵值中最久未使用的鍵值遵班;

volatile-random:隨機淘汰設(shè)置了過期時間的任意鍵值;

volatile-ttl:優(yōu)先淘汰更早過期的鍵值潮改。

在 Redis 4.0?版本中又新增了 2 種淘汰策略:

volatile-lfu:淘汰所有設(shè)置了過期時間的鍵值中狭郑,最少使用的鍵值;

allkeys-lfu:淘汰整個鍵值中最少使用的鍵值汇在。

其中 allkeys-xxx 表示從所有的鍵值中淘汰數(shù)據(jù)翰萨,而 volatile-xxx 表示從設(shè)置了過期鍵的鍵值中淘汰數(shù)據(jù)。

我們可以根據(jù)實際的業(yè)務(wù)情況進(jìn)行設(shè)置糕殉,默認(rèn)的淘汰策略不淘汰任何數(shù)據(jù)缨历,在新增時會報錯。

10.使用物理機而非虛擬機

在虛擬機中運行 Redis 服務(wù)器糙麦,因為和物理機共享一個物理網(wǎng)口,并且一臺物理機可能有多個虛擬機在運行丛肮,因此在內(nèi)存占用上和網(wǎng)絡(luò)延遲方面都會有很糟糕的表現(xiàn)赡磅,我們可以通過?./redis-cli --intrinsic-latency 100?命令查看延遲時間,如果對 Redis 的性能有較高要求的話宝与,應(yīng)盡可能在物理機上直接部署 Redis 服務(wù)器焚廊。

11.檢查數(shù)據(jù)持久化策略

Redis 的持久化策略是將內(nèi)存數(shù)據(jù)復(fù)制到硬盤上,這樣才可以進(jìn)行容災(zāi)恢復(fù)或者數(shù)據(jù)遷移习劫,但維護(hù)此持久化的功能咆瘟,需要很大的性能開銷。

在 Redis 4.0 之后诽里,Redis 有 3 種持久化的方式:

RDB(Redis DataBase袒餐,快照方式)將某一個時刻的內(nèi)存數(shù)據(jù),以二進(jìn)制的方式寫入磁盤谤狡;

AOF(Append Only File灸眼,文件追加方式),記錄所有的操作命令墓懂,并以文本的形式追加到文件中焰宣;

混合持久化方式,Redis 4.0 之后新增的方式捕仔,混合持久化是結(jié)合了 RDB 和 AOF 的優(yōu)點匕积,在寫入的時候盈罐,先把當(dāng)前的數(shù)據(jù)以 RDB 的形式寫入文件的開頭,再將后續(xù)的操作命令以 AOF 的格式存入文件闪唆,這樣既能保證 Redis 重啟時的速度盅粪,又能減低數(shù)據(jù)丟失的風(fēng)險。

RDB 和 AOF 持久化各有利弊苞氮,RDB 可能會導(dǎo)致一定時間內(nèi)的數(shù)據(jù)丟失湾揽,而 AOF 由于文件較大則會影響 Redis 的啟動速度,為了能同時擁有 RDB 和 AOF 的優(yōu)點笼吟,Redis 4.0 之后新增了混合持久化的方式库物,因此我們在必須要進(jìn)行持久化操作時,應(yīng)該選擇混合持久化的方式贷帮。

查詢是否開啟混合持久化可以使用?config get aof-use-rdb-preamble?命令戚揭,執(zhí)行結(jié)果如下圖所示:

其中 yes 表示已經(jīng)開啟混合持久化,no 表示關(guān)閉撵枢,Redis 5.0 默認(rèn)值為 yes民晒。如果是其他版本的 Redis 首先需要檢查一下,是否已經(jīng)開啟了混合持久化锄禽,如果關(guān)閉的情況下潜必,可以通過以下兩種方式開啟:

通過命令行開啟

通過修改 Redis 配置文件開啟

① 通過命令行開啟

使用命令?config set aof-use-rdb-preamble yes?執(zhí)行結(jié)果如下圖所示:

命令行設(shè)置配置的缺點是重啟 Redis 服務(wù)之后,設(shè)置的配置就會失效沃但。

② 通過修改 Redis 配置文件開啟

在 Redis 的根路徑下找到 redis.conf 文件磁滚,把配置文件中的?aof-use-rdb-preamble no?改為?aof-use-rdb-preamble yes?如下圖所示:

配置完成之后,需要重啟 Redis 服務(wù)器宵晚,配置才能生效垂攘,但修改配置文件的方式,在每次重啟 Redis 服務(wù)之后淤刃,配置信息不會丟失晒他。

需要注意的是,在非必須進(jìn)行持久化的業(yè)務(wù)中逸贾,可以關(guān)閉持久化陨仅,這樣可以有效的提升 Redis 的運行速度,不會出現(xiàn)間歇性卡頓的困擾铝侵。

12.禁用 THP 特性

Linux kernel 在 2.6.38 內(nèi)核增加了 Transparent Huge Pages (THP) 特性 掂名,支持大內(nèi)存頁 2MB 分配,默認(rèn)開啟哟沫。

當(dāng)開啟了 THP 時饺蔑,fork 的速度會變慢,fork 之后每個內(nèi)存頁從原來 4KB 變?yōu)?2MB嗜诀,會大幅增加重寫期間父進(jìn)程內(nèi)存消耗猾警。同時每次寫命令引起的復(fù)制內(nèi)存頁單位放大了 512 倍孔祸,會拖慢寫操作的執(zhí)行時間,導(dǎo)致大量寫操作慢查詢发皿。例如簡單的 incr 命令也會出現(xiàn)在慢查詢中崔慧,因此 Redis 建議將此特性進(jìn)行禁用,禁用方法如下:

echo never > ?/sys/kernel/mm/transparent_hugepage/enabled

為了使機器重啟后 THP 配置依然生效穴墅,可以在 /etc/rc.local 中追加?echo never > /sys/kernel/mm/transparent_hugepage/enabled?惶室。

13.使用分布式架構(gòu)來增加讀寫速度

Redis 分布式架構(gòu)有三個重要的手段:

主從同步

哨兵模式

Redis Cluster 集群

使用主從同步功能我們可以把寫入放到主庫上執(zhí)行,把讀功能轉(zhuǎn)移到從服務(wù)上玄货,因此就可以在單位時間內(nèi)處理更多的請求皇钞,從而提升的 Redis 整體的運行速度。

而哨兵模式是對于主從功能的升級松捉,但當(dāng)主節(jié)點奔潰之后夹界,無需人工干預(yù)就能自動恢復(fù) Redis 的正常使用。

Redis Cluster 是 Redis 3.0 正式推出的隘世,Redis 集群是通過將數(shù)據(jù)庫分散存儲到多個節(jié)點上來平衡各個節(jié)點的負(fù)載壓力可柿。

Redis Cluster 采用虛擬哈希槽分區(qū),所有的鍵根據(jù)哈希函數(shù)映射到 0 ~ 16383 整數(shù)槽內(nèi)丙者,計算公式:slot = CRC16(key) & 16383复斥,每一個節(jié)點負(fù)責(zé)維護(hù)一部分槽以及槽所映射的鍵值數(shù)據(jù)。這樣 Redis 就可以把讀寫壓力從一臺服務(wù)器械媒,分散給多臺服務(wù)器了目锭,因此性能會有很大的提升。

在這三個功能中滥沫,我們只需要使用一個就行了,毫無疑問 Redis Cluster 應(yīng)該是首選的實現(xiàn)方案键俱,它可以把讀寫壓力自動的分擔(dān)給更多的服務(wù)器兰绣,并且擁有自動容災(zāi)的能力。



原文鏈接:https://mp.weixin.qq.com/s/JVTtowoqsIixiaK8WL7wgQ

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末编振,一起剝皮案震驚了整個濱河市缀辩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌踪央,老刑警劉巖臀玄,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異畅蹂,居然都是意外死亡健无,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門液斜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來累贤,“玉大人叠穆,你說我怎么就攤上這事【矢啵” “怎么了硼被?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長渗磅。 經(jīng)常有香客問我嚷硫,道長,這世上最難降的妖魔是什么始鱼? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任仔掸,我火速辦了婚禮,結(jié)果婚禮上风响,老公的妹妹穿的比我還像新娘嘉汰。我一直安慰自己,他們只是感情好状勤,可當(dāng)我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布鞋怀。 她就那樣靜靜地躺著,像睡著了一般持搜。 火紅的嫁衣襯著肌膚如雪密似。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天葫盼,我揣著相機與錄音残腌,去河邊找鬼。 笑死贫导,一個胖子當(dāng)著我的面吹牛抛猫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播孩灯,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼闺金,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了峰档?” 一聲冷哼從身側(cè)響起败匹,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎讥巡,沒想到半個月后掀亩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡欢顷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年槽棍,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡刹泄,死狀恐怖外里,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情特石,我是刑警寧澤盅蝗,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站姆蘸,受9級特大地震影響墩莫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜逞敷,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一狂秦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧推捐,春花似錦裂问、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至皮壁,卻和暖如春椭更,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蛾魄。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工虑瀑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人滴须。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓舌狗,卻偏偏與公主長得像,于是被迫代替她去往敵國和親扔水。 傳聞我的和親對象是個殘疾皇子痛侍,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載自微信公眾號“Java中文社群” Redis 是基于單線程模型實現(xiàn)的,也就是 Redis 是使用一個線程來處理...
    EricTao2閱讀 345評論 0 0
  • 轉(zhuǎn)載鏈接:https://juejin.im/post/5e79702af265da570c75580a Redi...
    zww007閱讀 469評論 0 1
  • 一铭污、Redis高可用概述 在介紹Redis高可用之前恋日,先說明一下在Redis的語境中高可用的含義膀篮。 我們知道嘹狞,在w...
    空語閱讀 1,597評論 0 2
  • 【你安好,我無恙】 “你安好誓竿,我無恙”磅网,這是最流行的祝福! 疫情之下筷屡,照顧好自已和家人涧偷,讓我們彼此都安康簸喂! 陽光總...
    望魚河閱讀 131評論 0 0
  • 今天經(jīng)過樓梯口确封,看到地上一小堆顏色亮麗的黃色電線頭丟在地上除呵,可能是上午修電表的電工剩下的吧。 一向愛拾荒的我爪喘,因為...
    兔巴葛閱讀 178評論 0 2