關(guān)于分布式鎖原理-redis分布式鎖尼桶,zookeeper分布式鎖

                       來源:[https://www.cnblogs.com/JJJ1990/p/10496850.html](https://www.cnblogs.com/JJJ1990/p/10496850.html)

首先分布式鎖和我們平常講到的鎖原理基本一樣泵督,目的就是確保,在多個(gè)線程并發(fā)時(shí)谤碳,只有一個(gè)線程在同一刻操作這個(gè)業(yè)務(wù)或者說方法溢豆、變量。
在一個(gè)進(jìn)程中搓茬,也就是一個(gè)jvm 或者說應(yīng)用中卷仑,我們很容易去處理控制麸折,在jdk java.util并發(fā)包中已經(jīng)為我們提供了這些方法去加鎖,比如synchronized 關(guān)鍵字 或者Lock 鎖窜锯,都可以處理锚扎。
但是我們現(xiàn)在的應(yīng)用程序如果只部署一臺(tái)服務(wù)器馁启,那并發(fā)量是很差的惯疙,如果同時(shí)有上萬的請(qǐng)求那么很有可能造成服務(wù)器壓力過大,而癱瘓眉菱。
想想雙十一 和三十晚上十點(diǎn)分支付寶紅包等業(yè)務(wù)場(chǎng)景掉分,自然需要用到多臺(tái)服務(wù)器去同時(shí)處理這些業(yè)務(wù)酥郭,那么這些服務(wù)可能會(huì)有上百臺(tái)同時(shí)處理,但是請(qǐng)我們大家想一想惜姐,如果有100臺(tái)服務(wù)器 要處理分紅包的業(yè)務(wù),現(xiàn)在假設(shè)有1億的紅包坷衍,1千萬個(gè)人分枫耳,金額隨機(jī)孟抗,那么這個(gè)業(yè)務(wù)場(chǎng)景下是不是必須確保這1千萬個(gè)人最后分的紅包金額總和等于1億凄硼。如果處理不好~~每人分到100萬,那馬云爸爸估計(jì)大年初一狐史,就得宣布破產(chǎn)了

1预皇,常規(guī)鎖會(huì)造成什么情況婉刀?

首先說一下我們?yōu)槭裁匆慵和患眨?jiǎn)單理解就是律秃,需求量(請(qǐng)求并發(fā)量)變大了,一個(gè)工人處理能力有限糙申,那就多招一些工人來一起處理柜裸。

假設(shè)1千萬個(gè)請(qǐng)求平均分配到100臺(tái)服務(wù)器上疙挺,每個(gè)服務(wù)器 接收10w的請(qǐng)求(這10w個(gè)請(qǐng)求并不是在同一秒中來的怜浅,可能是在1,2個(gè)小時(shí)內(nèi),可以聯(lián)想下我們?nèi)砩祥_紅包,等到10.20開始沥阳,有的人立馬開了沪袭,有的人是不是等到12點(diǎn)了才想起來~)

那這樣的話,平均到每一秒上的請(qǐng)求也就不到1千個(gè)埠啃,這種壓力一般的服務(wù)器還是可以承受的碴开。

第一個(gè)請(qǐng)求到來后博秫,是不是需要在1億里面給他分一部分錢挡育,金額隨機(jī)即寒,假設(shè)第一個(gè)人分到了100母赵,那是不是要在這1億中減去100塊,剩下99999900 塊~

第二個(gè)用戶再來分师倔,金額隨機(jī)周蹭,這次分200塊,那是不是就需要在剩下的99999900塊中再減去200塊谷醉,剩下99999700 塊俱尼。

等到第10w個(gè)用戶來抖单,一看還有1000w,那這1000w全成他的了矛绘。

等于是在每個(gè)服務(wù)器中去分1億货矮,也就是10w個(gè)用戶分了一個(gè)億囚玫,最后總計(jì)有100個(gè)服務(wù)器燃少,要分100億铃在。

如果真這樣了阳液,雖說馬云爸爸不會(huì)破產(chǎn)(據(jù)最新統(tǒng)計(jì)馬云有2300億人民幣)帘皿,那分紅包的開發(fā)項(xiàng)目組矮烹,以及產(chǎn)品經(jīng)理奉狈,可以GG了~

簡(jiǎn)化結(jié)構(gòu)圖如下:


image.png

2,分布式鎖怎么去處理跛蛋?

那么為了解決這個(gè)問題,讓1000萬用戶只分1億理逊,而不是100億晋被,這個(gè)時(shí)候分布式鎖就派上用處了羡洛。

分布式鎖可以把整個(gè)集群就當(dāng)作是一個(gè)應(yīng)用一樣去處理崭闲,那么也就需要這個(gè)鎖镀脂,要獨(dú)立于每一個(gè)服務(wù)之外沙兰,而不是在服務(wù)里面鼎天。

假設(shè)第一個(gè)服務(wù)器接收到用戶1的請(qǐng)求后育勺,那么這個(gè)時(shí)候涧至,他就不能只在自己的應(yīng)用中去判斷還有多少錢可以分了,而需要去外部請(qǐng)求專門負(fù)責(zé)管理這1億紅包的人(服務(wù))赘方,問他:哎,我這里要分100塊跳夭,給我100优妙。

管理紅包的妹子(服務(wù))一看卡辰,還有1個(gè)億九妈,那好,給你100塊,然后剩下99999900塊翠霍。

第二個(gè)請(qǐng)求到來后寒匙,被服務(wù)器2獲取,繼續(xù)去詢問,管理紅包的妹子狈谊,我這邊要分10塊,管理紅包的妹子先查了下還有99999900赎瞎,那就說:好牡辽,給你10塊。那就剩下99999890塊

等到第1000w個(gè)請(qǐng)求到來后奏黑,服務(wù)器100拿到請(qǐng)求窄俏,繼續(xù)去詢問限寞,管理紅包的妹子,你要100,妹子翻了翻白眼,對(duì)你說眷细,就剩1塊了,愛要不要,那這個(gè)時(shí)候就只能給你1塊了(1塊也是錢啊,買根辣條還是可以的)雁芙。

這些請(qǐng)求編號(hào)1,2不代表執(zhí)行的先后順序谎碍,正式的場(chǎng)景下闽晦,應(yīng)該是 100臺(tái)服務(wù)器每個(gè)服務(wù)器持有一個(gè)請(qǐng)求去訪問負(fù)責(zé)管理紅包的妹子(服務(wù))笋敞,那在管紅包的妹子那里同時(shí)會(huì)接收到100個(gè)請(qǐng)求哀墓,這個(gè)時(shí)候就需要在負(fù)責(zé)紅包的妹子那里加個(gè)鎖就可以了(拋繡球)后雷,你們100個(gè)服務(wù)器誰拿到鎖(搶到繡球)贾漏,誰就進(jìn)來和我談梳码,我給你分蜜笤,其他人就等著去吧

經(jīng)過上面的分布式鎖的處理后啊胶,馬云爸爸終于放心了趣倾,決定給紅包團(tuán)隊(duì)每人加一個(gè)雞腿黔漂。

簡(jiǎn)化的結(jié)構(gòu)圖如下:


image.png

3,分布式鎖的實(shí)現(xiàn)有哪些?

說到分布式鎖的實(shí)現(xiàn),還是有很多的,有數(shù)據(jù)庫方式的,有redis分布式鎖智听,有zookeeper分布式鎖等等

我們?nèi)绻捎胷edis作為分布式鎖,那么上圖中負(fù)“責(zé)紅包的妹子(服務(wù))”捣卤,就可以替換成redis,請(qǐng)自行腦補(bǔ)祟绊。

3.1嘉熊,為什么redis可以實(shí)現(xiàn)分布式鎖?

首先redis是單線程的扬舒,這里的單線程指的是網(wǎng)絡(luò)請(qǐng)求模塊使用了一個(gè)線程(所以不需考慮并發(fā)安全性)阐肤,即一個(gè)線程處理所有網(wǎng)絡(luò)請(qǐng)求,其他模塊仍用了多個(gè)線程呼巴。

在實(shí)際的操作中過程大致是這樣子的:

服務(wù)器1要去訪問發(fā)紅包的妹子泽腮,也就是redis,那么他會(huì)在redis中通過"setnx key value" 操作設(shè)置一個(gè)key 進(jìn)去衣赶,value是啥不重要诊赊,重要的是要有一個(gè)key,也就是一個(gè)標(biāo)記府瞄,而且這個(gè)key你愛叫啥叫啥碧磅,只要所有的服務(wù)器設(shè)置的key相同就可以。

假設(shè)我們?cè)O(shè)置一個(gè)遵馆,如下圖

###

那么我們可以看到會(huì)返回一個(gè)1鲸郊,那就代表了成功。

如果再來一個(gè)請(qǐng)求去設(shè)置同樣的key货邓,如下圖:

image

這個(gè)時(shí)候會(huì)返回0秆撮,那就代表失敗了。

那么我們就可以通過這個(gè)操作去判斷是不是當(dāng)前可以拿到鎖换况,或者說可以去訪問“負(fù)責(zé)發(fā)紅包的妹子”职辨,如果返回1,那我就開始去執(zhí)行后面的邏輯戈二,如果返回0舒裤,那就說明已經(jīng)被人占用了,我就要繼續(xù)等待觉吭。

當(dāng)服務(wù)器1拿到鎖之后腾供,進(jìn)行了業(yè)務(wù)處理,完成后,還需要釋放鎖伴鳖,如下圖所示:

image

刪除成功返回1节值,那么其他的服務(wù)器就可以繼續(xù)重復(fù)上面的步驟去設(shè)置這個(gè)key,以達(dá)到獲取鎖的目的黎侈。

當(dāng)然以上的操作是在redis客戶端直接進(jìn)行的察署,通過程序調(diào)用的話,肯定就不能這么寫峻汉,比如java 就需要通過jedis 去調(diào)用贴汪,但是整個(gè)處理邏輯基本都是一樣的

通過上面的方式,我們好像是解決了分布式鎖的問題休吠,但是想想還有沒有什么問題呢扳埂??

對(duì)瘤礁,問題還是有的阳懂,可能會(huì)有死鎖的問題發(fā)生,比如服務(wù)器1設(shè)置完之后柜思,獲取了鎖之后岩调,忽然發(fā)生了宕機(jī)。

那后續(xù)的刪除key操作就沒法執(zhí)行赡盘,這個(gè)key會(huì)一直在redis中存在号枕,其他服務(wù)器每次去檢查,都會(huì)返回0陨享,他們都會(huì)認(rèn)為有人在使用鎖葱淳,我需要等。

為了解決這個(gè)死鎖的問題抛姑,我們就就需要給key 設(shè)置有效期了赞厕。

設(shè)置的方式有2種

1,第一種就是在set完key之后定硝,直接設(shè)置key的有效期 "expire key timeout" 皿桑,為key設(shè)置一個(gè)超時(shí)時(shí)間,單位為second蔬啡,超過這個(gè)時(shí)間鎖會(huì)自動(dòng)釋放诲侮,避免死鎖。

這種方式相當(dāng)于星爪,把鎖持有的有效期,交給了redis去控制粉私。如果時(shí)間到了顽腾,你還沒有給我刪除key,那redis就直接給你刪了,其他服務(wù)器就可以繼續(xù)去setnx獲取鎖抄肖。

2久信,第二種方式,就是把刪除key權(quán)利交給其他的服務(wù)器漓摩,那這個(gè)時(shí)候就需要用到value值了裙士,

比如服務(wù)器1,設(shè)置了value 也就是 timeout 為 當(dāng)前時(shí)間+1 秒 管毙,這個(gè)時(shí)候服務(wù)器2 通過get 發(fā)現(xiàn)時(shí)間已經(jīng)超過系統(tǒng)當(dāng)前時(shí)間了腿椎,那就說明服務(wù)器1沒有釋放鎖,服務(wù)器1可能出問題了夭咬,

服務(wù)器2就開始執(zhí)行刪除key操作啃炸,并且繼續(xù)執(zhí)行setnx 操作。

但是這塊有一個(gè)問題卓舵,也就是南用,不光你服務(wù)器2可能會(huì)發(fā)現(xiàn)服務(wù)器1超時(shí)了,服務(wù)器3也可能會(huì)發(fā)現(xiàn)掏湾,如果剛好裹虫,服務(wù)器2,setnx操作完成融击,服務(wù)器3就接著刪除筑公,是不是服務(wù)器3也可以setnx成功了?

那就等于是服務(wù)器2和服務(wù)器3都拿到鎖了砚嘴,那就問題大了十酣。這個(gè)時(shí)候怎么辦呢?

這個(gè)時(shí)候需要用到 “GETSET key value” 命令了际长。這個(gè)命令的意思就是獲取當(dāng)前key的值耸采,并且設(shè)置新的值。

假設(shè)服務(wù)器2發(fā)現(xiàn)key過期了工育,開始調(diào)用 getset 命令虾宇,然后用獲取的時(shí)間判斷是否過期,如果獲取的時(shí)間仍然是過期的如绸,那就說明拿到鎖了嘱朽。

如果沒有,則說明在服務(wù)2執(zhí)行g(shù)etset之前怔接,服務(wù)器3可能也發(fā)現(xiàn)鎖過期了搪泳,并且在服務(wù)器2之前執(zhí)行了getset操作,重新設(shè)置了過期時(shí)間扼脐。

那么服務(wù)器2就需要放棄后續(xù)的操作岸军,繼續(xù)等待服務(wù)器3釋放鎖或者去監(jiān)測(cè)key的有效期是否過期奋刽。

這塊其實(shí)有一個(gè)小問題是,服務(wù)器3已經(jīng)修改了有效期艰赞,拿到鎖之后佣谐,服務(wù)器2,也修改了有效期方妖,但是沒能拿到鎖狭魂,但是這個(gè)有效期的時(shí)間已經(jīng)被在服務(wù)器3的基礎(chǔ)上有增加一些,但是這種影響其實(shí)還是很小的党觅,幾乎可以忽略不計(jì)雌澄。

3.2,為什么zookeeper可以實(shí)現(xiàn)分布式鎖仔役?

百度百科是這么介紹的:ZooKeeper是一個(gè)分布式的掷伙,開放源碼的分布式應(yīng)用程序協(xié)調(diào)服務(wù),是Google的Chubby一個(gè)開源的實(shí)現(xiàn)又兵,是Hadoop和Hbase的重要組件任柜。

那對(duì)于我們初次認(rèn)識(shí)的人,可以理解成ZooKeeper就像是我們的電腦文件系統(tǒng)沛厨,我們可以在d盤中創(chuàng)建文件夾a宙地,并且可以繼續(xù)在文件夾a中創(chuàng)建 文件夾a1,a2逆皮。

那我們的文件系統(tǒng)有什么特點(diǎn)宅粥??那就是同一個(gè)目錄下文件名稱不能重復(fù)电谣,同樣ZooKeeper也是這樣的秽梅。

在ZooKeeper所有的節(jié)點(diǎn),也就是文件夾稱作 Znode剿牺,而且這個(gè)Znode節(jié)點(diǎn)是可以存儲(chǔ)數(shù)據(jù)的企垦。

我們可以通過“ create /zkjjj nice” 來創(chuàng)建一個(gè)節(jié)點(diǎn),這個(gè)命令就表示晒来,在跟目錄下創(chuàng)建一個(gè)zkjjj的節(jié)點(diǎn)钞诡,值是nice。同樣這里的值湃崩,和我在前面說的redis中的一樣荧降,沒什么意義,你隨便給攒读。

另外ZooKeeper可以創(chuàng)建4種類型的節(jié)點(diǎn)朵诫,分別是:

  • 1,持久性節(jié)點(diǎn)
  • 2薄扁,持久性順序節(jié)點(diǎn)
  • 3剪返,臨時(shí)性節(jié)點(diǎn)
  • 4瞎领,臨時(shí)性順序節(jié)點(diǎn)

首先說下持久性節(jié)點(diǎn)和臨時(shí)性節(jié)點(diǎn)的區(qū)別,持久性節(jié)點(diǎn)表示只要你創(chuàng)建了這個(gè)節(jié)點(diǎn)随夸,那不管你ZooKeeper的客戶端是否斷開連接,ZooKeeper的服務(wù)端都會(huì)記錄這個(gè)節(jié)點(diǎn)震放。

臨時(shí)性節(jié)點(diǎn)剛好相反宾毒,一旦你ZooKeeper客戶端斷開了連接,那ZooKeeper服務(wù)端就不再保存這個(gè)節(jié)點(diǎn)殿遂。

再說下順序性節(jié)點(diǎn)诈铛,順序性節(jié)點(diǎn)是指,在創(chuàng)建節(jié)點(diǎn)的時(shí)候墨礁,ZooKeeper會(huì)自動(dòng)給節(jié)點(diǎn)編號(hào)比如0000001 幢竹,0000002 這種的。

最后說下恩静,zookeeper有一個(gè)監(jiān)聽機(jī)制焕毫,客戶端注冊(cè)監(jiān)聽它關(guān)心的目錄節(jié)點(diǎn),當(dāng)目錄節(jié)點(diǎn)發(fā)生變化(數(shù)據(jù)改變驶乾、被刪除邑飒、子目錄節(jié)點(diǎn)增加刪除)等,zookeeper會(huì)通知客戶端级乐。

下面我們繼續(xù)結(jié)合我們上面的分紅包場(chǎng)景疙咸,描述下在zookeeper中如何加鎖。

假設(shè)服務(wù)器1风科,創(chuàng)建了一個(gè)節(jié)點(diǎn) /zkjjj ,成功了撒轮,那服務(wù)器1就獲取了鎖,服務(wù)器2再去創(chuàng)建相同的鎖贼穆,那么他就會(huì)失敗题山,這個(gè)時(shí)候他就就只能監(jiān)聽這個(gè)節(jié)點(diǎn)的變化。

等到服務(wù)器1扮惦,處理完業(yè)務(wù)臀蛛,刪除了節(jié)點(diǎn)后,他就會(huì)得到通知崖蜜,然后去創(chuàng)建同樣的節(jié)點(diǎn)浊仆,獲取鎖處理業(yè)務(wù),再刪除節(jié)點(diǎn)豫领,后續(xù)的100臺(tái)服務(wù)器與之類似

注意這里的100臺(tái)服務(wù)器并不是挨個(gè)去執(zhí)行上面的創(chuàng)建節(jié)點(diǎn)的操作抡柿,而是并發(fā)的,當(dāng)服務(wù)器1創(chuàng)建成功等恐,那么剩下的99個(gè)就都會(huì)注冊(cè)監(jiān)聽這個(gè)節(jié)點(diǎn)洲劣,等通知备蚓,以此類推。

但是大家有沒有注意到囱稽,這里還是有問題的郊尝,還是會(huì)有死鎖的情況存在,對(duì)不對(duì)战惊?

當(dāng)服務(wù)器1創(chuàng)建了節(jié)點(diǎn)后掛了流昏,沒能刪除,那其他99臺(tái)服務(wù)器就會(huì)一直等通知吞获,那就完蛋了况凉。。各拷。

這個(gè)時(shí)候呢刁绒,就需要用到臨時(shí)性節(jié)點(diǎn)了,我們前面說過了烤黍,臨時(shí)性節(jié)點(diǎn)的特點(diǎn)是客戶端一旦斷開知市,就會(huì)丟失,也就是當(dāng)服務(wù)器1創(chuàng)建了節(jié)點(diǎn)后速蕊,如果掛了初狰。

那這個(gè)節(jié)點(diǎn)會(huì)自動(dòng)被刪除,這樣后續(xù)的其他服務(wù)器互例,就可以繼續(xù)去創(chuàng)建節(jié)點(diǎn)奢入,獲取鎖了。

但是我們可能還需要注意到一點(diǎn)媳叨,就是驚群效應(yīng):舉一個(gè)很簡(jiǎn)單的例子,當(dāng)你往一群鴿子中間扔一塊食物,雖然最終只有一個(gè)鴿子搶到食物,但所有鴿子都會(huì)被驚動(dòng)來爭(zhēng)奪,沒有搶到..

就是當(dāng)服務(wù)器1節(jié)點(diǎn)有變化腥光,會(huì)通知其余的99個(gè)服務(wù)器,但是最終只有1個(gè)服務(wù)器會(huì)創(chuàng)建成功糊秆,這樣98還是需要等待監(jiān)聽武福,那么為了處理這種情況,就需要用到臨時(shí)順序性節(jié)點(diǎn)

大致意思就是痘番,之前是所有99個(gè)服務(wù)器都監(jiān)聽一個(gè)節(jié)點(diǎn)捉片,現(xiàn)在就是每一個(gè)服務(wù)器監(jiān)聽自己前面的一個(gè)節(jié)點(diǎn)。

假設(shè)100個(gè)服務(wù)器同時(shí)發(fā)來請(qǐng)求汞舱,這個(gè)時(shí)候會(huì)在 /zkjjj 節(jié)點(diǎn)下創(chuàng)建 100 個(gè)臨時(shí)順序性節(jié)點(diǎn) /zkjjj/000000001, /zkjjj/000000002,一直到 /zkjjj/000000100,這個(gè)編號(hào)就等于是已經(jīng)給他們?cè)O(shè)置了獲取鎖的先后順序了伍纫。

當(dāng)001節(jié)點(diǎn)處理完畢,刪除節(jié)點(diǎn)后昂芜,002收到通知莹规,去獲取鎖,開始執(zhí)行泌神,執(zhí)行完畢良漱,刪除節(jié)點(diǎn)舞虱,通知003~以此類推。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末母市,一起剝皮案震驚了整個(gè)濱河市矾兜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌患久,老刑警劉巖焕刮,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異墙杯,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)括荡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門高镐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人畸冲,你說我怎么就攤上這事嫉髓。” “怎么了邑闲?”我有些...
    開封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵算行,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我苫耸,道長(zhǎng)州邢,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任褪子,我火速辦了婚禮量淌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘嫌褪。我一直安慰自己呀枢,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開白布笼痛。 她就那樣靜靜地躺著裙秋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪缨伊。 梳的紋絲不亂的頭發(fā)上摘刑,一...
    開封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音刻坊,去河邊找鬼泣侮。 笑死,一個(gè)胖子當(dāng)著我的面吹牛紧唱,可吹牛的內(nèi)容都是我干的活尊。 我是一名探鬼主播隶校,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼蛹锰!你這毒婦竟也來了深胳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤铜犬,失蹤者是張志新(化名)和其女友劉穎舞终,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體癣猾,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡敛劝,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了纷宇。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片夸盟。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖像捶,靈堂內(nèi)的尸體忽然破棺而出上陕,到底是詐尸還是另有隱情,我是刑警寧澤拓春,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布释簿,位于F島的核電站,受9級(jí)特大地震影響硼莽,放射性物質(zhì)發(fā)生泄漏庶溶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一懂鸵、第九天 我趴在偏房一處隱蔽的房頂上張望渐尿。 院中可真熱鬧,春花似錦矾瑰、人聲如沸砖茸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽凉夯。三九已至,卻和暖如春采幌,著一層夾襖步出監(jiān)牢的瞬間劲够,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來泰國打工休傍, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留征绎,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像人柿,于是被迫代替她去往敵國和親柴墩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355