Redis-基本數(shù)據(jù)類型與內(nèi)部存儲(chǔ)結(jié)構(gòu)

1-概覽

Redis是典型的Key-Value類型數(shù)據(jù)庫(kù),Key為字符類型燕偶,Value的類型常用的為五種類型:String侵浸、Hash 旺韭、List 、 Set 掏觉、 Ordered Set

2- Redis內(nèi)部?jī)?nèi)存管理

redisObject 核心對(duì)象

Redis 內(nèi)部使用一個(gè) redisObject 對(duì)象來(lái)表示所有的 key 和 value区端。

  1. type :代表一個(gè) value 對(duì)象具體是何種數(shù)據(jù)類型。

  2. encoding :是不同數(shù)據(jù)類型在 redis 內(nèi)部的存儲(chǔ)方式澳腹,比如:type=string 代表 value 存儲(chǔ)的是一個(gè)普通字符串织盼,那么對(duì)應(yīng)的 encoding 可以是 raw 或者是 int,如果是 int 則代表實(shí)際 redis 內(nèi)部是按數(shù)值型類存儲(chǔ)和表示這個(gè)字符串的酱塔,當(dāng)然前提是這個(gè)字符串本身可以用數(shù)值表示沥邻,比如:"123" "456"這樣的字符串。

  3. vm 字段:只有打開了 Redis 的虛擬內(nèi)存功能羊娃,此字段才會(huì)真正的分配內(nèi)存唐全,該功能默認(rèn)是關(guān)閉狀態(tài)的。 Redis 使用 redisObject 來(lái)表示所有的 key/value 數(shù)據(jù)是比較浪費(fèi)內(nèi)存的蕊玷,當(dāng)然這些內(nèi)存管理成本的付出主要也是為了給 Redis 不同數(shù)據(jù)類型提供一個(gè)統(tǒng)一的管理接口邮利,實(shí)際作者也提供了多種方法幫助我們盡量節(jié)省內(nèi)存使用。

3- Key(鍵值)

官網(wǎng)Key鏈接:https://redis.io/commands#generic

過期刪除

過期數(shù)據(jù)的清除從來(lái)不容易垃帅,為每一條key設(shè)置一個(gè)timer近弟,到點(diǎn)立刻刪除的消耗太大,每秒遍歷所有數(shù)據(jù)消耗也大挺智,Redis使用了一種相對(duì)務(wù)實(shí)的做法: 當(dāng)client主動(dòng)訪問key會(huì)先對(duì)key進(jìn)行超時(shí)判斷,過時(shí)的key會(huì)立刻刪除窗宦。 如果clien永遠(yuǎn)都不再get那條key呢赦颇? 它會(huì)在Master的后臺(tái),每秒10次的執(zhí)行如下操作: 隨機(jī)選取100個(gè)key校驗(yàn)是否過期赴涵,如果有25個(gè)以上的key過期了媒怯,立刻額外隨機(jī)選取下100個(gè)key(不計(jì)算在10次之內(nèi))。可見髓窜,如果過期的key不多扇苞,它最多每秒回收200條左右,如果有超過25%的key過期了寄纵,它就會(huì)做得更多鳖敷,但只要key不被主動(dòng)get,它占用的內(nèi)存什么時(shí)候最終被清理掉只有天知道程拭。

常用操作
  1. Key的長(zhǎng)度限制:Key的最大長(zhǎng)度不能超過1024字節(jié)定踱,在實(shí)際開發(fā)時(shí)不要超過這個(gè)長(zhǎng)度,但是Key的命名不能太短恃鞋,要能唯一標(biāo)識(shí)緩存的對(duì)崖媚,作者建議按照在關(guān)系型數(shù)據(jù)庫(kù)中的庫(kù)表唯一標(biāo)識(shí)字段的方式來(lái)命令Key的值亦歉,用分號(hào)分割不同數(shù)據(jù)域,用點(diǎn)號(hào)作為單詞連接畅哑。

  2. Key的查詢:Keys肴楷,返回匹配的key,支持通配符如 “keys a*” 荠呐、 “keys a?c”赛蔫,但不建議在生產(chǎn)環(huán)境大數(shù)據(jù)量下使用。

  3. 對(duì)Key對(duì)應(yīng)的Value進(jìn)行的排序:Sort命令對(duì)集合按數(shù)字或字母順序排序后返回或另存為list直秆,還可以關(guān)聯(lián)到外部key等濒募。因?yàn)?em>復(fù)雜度是最高的O(N+Mlog(M))*(N是集合大小,M 為返回元素的數(shù)量)圾结,有時(shí)會(huì)安排到slave上執(zhí)行瑰剃。官網(wǎng)鏈接https://redis.io/commands/sort

  4. Key的超時(shí)操作:Expire(指定失效的秒數(shù))/ExpireAt(指定失效的時(shí)間戳)/Persist(持久化)/TTL(返回還可存活的秒數(shù)),關(guān)于Key超時(shí)的操作筝野。默認(rèn)以秒為單位晌姚,也有p字頭的以毫秒為單位的版本

4- String(字符串類型的Value)

可以是String,也可是是任意的byte[]類型的數(shù)組歇竟,如圖片等挥唠。String 在 redis 內(nèi)部存儲(chǔ)默認(rèn)就是一個(gè)字符串,被 redisObject 所引用焕议,當(dāng)遇到 incr,decr 等操作時(shí)會(huì)轉(zhuǎn)成數(shù)值型進(jìn)行計(jì)算宝磨,此時(shí) redisObject 的 encoding 字段為int。
https://redis.io/commands#string

  1. 大小限制:最大為512Mb盅安,基本可以存儲(chǔ)任意圖片啦唤锉。

  2. 常用命令的時(shí)間復(fù)雜度為O(1),讀寫一樣的快别瞭。

  3. 對(duì)String代表的數(shù)字進(jìn)行增減操作(沒有指定的Key則設(shè)置為0值窿祥,然后在進(jìn)行操作):Incr/IncrBy/IncrByFloat/Decr/DecrBy(原子性),** 可以用來(lái)做計(jì)數(shù)器蝙寨,做自增序列晒衩,也可以用于限流,令牌桶計(jì)數(shù)等**墙歪。key不存在時(shí)會(huì)創(chuàng)建并貼心的設(shè)原值為0听系。IncrByFloat專門針對(duì)float。箱亿。

  4. 設(shè)置Value的安全性:SetNx命令僅當(dāng)key不存在時(shí)才Set(原子性操作)跛锌。可以用來(lái)選舉Master或做分布式鎖:所有Client不斷嘗試使用SetNx master myName搶注Master,成功的那位不斷使用Expire刷新它的過期時(shí)間。如果Master倒掉了key就會(huì)失效髓帽,剩下的節(jié)點(diǎn)又會(huì)發(fā)生新一輪搶奪菠赚。SetEx, Set + Expire 的簡(jiǎn)便寫法郑藏,p字頭版本以毫秒為單位衡查。

  5. 獲取:GetSet(原子性)必盖, 設(shè)置新值拌牲,返回舊值。比如一個(gè)按小時(shí)計(jì)算的計(jì)數(shù)器歌粥,可以用GetSet獲取計(jì)數(shù)并重置為0塌忽。這種指令在服務(wù)端做起來(lái)是舉手之勞,客戶端便方便很多失驶。MGet/MSet/MSetNx土居, 一次get/set多個(gè)key。

  6. 其他操作:Append/SetRange/GetRange/StrLen嬉探,對(duì)文本進(jìn)行擴(kuò)展擦耀、替換、截取和求長(zhǎng)度涩堤,只對(duì)特定數(shù)據(jù)格式如字段定長(zhǎng)的有用眷蜓,json就沒什么用。

  7. BitMap的用法:GetBit/SetBit/BitOp,與或非/BitCount胎围, BitMap的玩法吁系,比如統(tǒng)計(jì)今天的獨(dú)立訪問用戶數(shù)時(shí),每個(gè)注冊(cè)用戶都有一個(gè)offset白魂,他今天進(jìn)來(lái)的話就把他那個(gè)位設(shè)為1垮抗,用BitCount就可以得出今天的總?cè)藬?shù)

5- Hash(HashMap碧聪,哈希映射表)

Redis 的 Hash 實(shí)際是內(nèi)部存儲(chǔ)的 Value 為一個(gè) HashMap,并提供了直接存取這個(gè) Map 成員的接口液茎。Hash將對(duì)象的各個(gè)屬性存入Map里逞姿,可以只讀取/更新對(duì)象的某些屬性。另外不同的模塊可以只更新自己關(guān)心的屬性而不會(huì)互相并發(fā)覆蓋沖突捆等。


不同程序通過 key(用戶 ID) + field(屬性標(biāo)簽)就可以并發(fā)操作各自關(guān)心的屬性數(shù)據(jù)
https://redis.io/commands#hash

實(shí)現(xiàn)原理

Redis Hash 對(duì)應(yīng) Value 內(nèi)部實(shí)際就是一個(gè) HashMap滞造,實(shí)際這里會(huì)有2種不同實(shí)現(xiàn),** 這個(gè) Hash 的成員比較少時(shí) Redis 為了節(jié)省內(nèi)存會(huì)采用類似一維數(shù)組的方式來(lái)緊湊存儲(chǔ)栋烤,而不會(huì)采用真正的 HashMap 結(jié)構(gòu)谒养,對(duì)應(yīng)的 value redisObject 的 encoding 為 zipmap,當(dāng)成員數(shù)量增大時(shí)會(huì)自動(dòng)轉(zhuǎn)成真正的 HashMap明郭,此時(shí) encoding 為 ht**买窟。一般操作復(fù)雜度是O(1)丰泊,要同時(shí)操作多個(gè)field時(shí)就是O(N),N是field的數(shù)量始绍。

常用操作
  1. O(1)操作:hget瞳购、hset等等
  2. O(n)操作:hgetallRedis 可以直接取到全部的屬性數(shù)據(jù),但是如果內(nèi)部 Map 的成員很多亏推,那么涉及到遍歷整個(gè)內(nèi)部 Map 的操作学赛,由于 Redis 單線程模型的緣故,這個(gè)遍歷操作可能會(huì)比較耗時(shí)吞杭,而另其它客戶端的請(qǐng)求完全不響應(yīng)盏浇,這點(diǎn)需要格外注意。

6- List(雙向鏈表)

Redis list 的應(yīng)用場(chǎng)景非常多芽狗,也是 Redis 最重要的數(shù)據(jù)結(jié)構(gòu)之一绢掰,比如 twitter 的關(guān)注列表,粉絲列表等都可以用 Redis 的 list 結(jié)構(gòu)來(lái)實(shí)現(xiàn)译蒂,還提供了生產(chǎn)者消費(fèi)者阻塞模式(B開頭的命令)曼月,常用于任務(wù)隊(duì)列,消息隊(duì)列等柔昼。

實(shí)現(xiàn)方式

Redis list 的實(shí)現(xiàn)為一個(gè)雙向鏈表哑芹,即可以支持反向查找和遍歷,更方便操作捕透,不過帶來(lái)了部分額外的內(nèi)存開銷聪姿,Redis 內(nèi)部的很多實(shí)現(xiàn),包括發(fā)送緩沖隊(duì)列等也都是用的這個(gè)數(shù)據(jù)結(jié)構(gòu)乙嘀。

用作消息隊(duì)列中防止數(shù)據(jù)丟失的解決方法

如果消費(fèi)者把job給Pop走了又沒處理完就死機(jī)了怎么辦末购?

  1. 消息生產(chǎn)者保證不丟失

加多一個(gè)sorted set,分發(fā)的時(shí)候同時(shí)發(fā)到list與sorted set虎谢,以分發(fā)時(shí)間為score盟榴,用戶把job做完了之后要用ZREM消掉sorted set里的job,并且定時(shí)從sorted set中取出超時(shí)沒有完成的任務(wù)婴噩,重新放回list擎场。 如果發(fā)生重復(fù)可以在sorted set中在查詢確認(rèn)一遍,或者將消息的消費(fèi)接口設(shè)計(jì)成冪等性几莽。

  1. 消息消費(fèi)者保證不丟失

為每個(gè)worker多加一個(gè)的list迅办,彈出任務(wù)時(shí)改用RPopLPush,將job同時(shí)放到worker自己的list中章蚣,完成時(shí)用LREM消掉站欺。如果集群管理(如zookeeper)發(fā)現(xiàn)worker已經(jīng)掛掉,就將worker的list內(nèi)容重新放回主list

常用操作
  1. 復(fù)合操作:RPopLPush/ BRPopLPush,彈出來(lái)返回給client的同時(shí)矾策,把自己又推入另一個(gè)list磷账,是原子操作。


  2. 按值進(jìn)行的操作:LRem(按值刪除元素)蝴韭、LInsert(插在某個(gè)值的元素的前后)够颠,復(fù)雜度是O(N),N是List長(zhǎng)度榄鉴,因?yàn)長(zhǎng)ist的值不唯一履磨,所以要遍歷全部元素,而Set只要O(log(N))庆尘。


  3. 按下表進(jìn)行操作(下標(biāo)從0開始剃诅,隊(duì)列從左到右算,下標(biāo)為負(fù)數(shù)時(shí)則從右到左驶忌,-1為右端第一個(gè)元素)

時(shí)間復(fù)雜度為O(N)

  • LSet :按下標(biāo)設(shè)置元素值矛辕。(N為L(zhǎng)ist的長(zhǎng)度)
  • LIndex:按下標(biāo)返回元素。(N為index的值)
  • LTrim:限制List的大小付魔,保留指定范圍的元素聊品。(N是移除元素的個(gè)數(shù))


  • LRange:返回列表內(nèi)指定范圍下標(biāo)的元素,常用于分頁(yè)几苍。(N = start+range)


7- set(HashSet)

Set就是HashSet翻屈,可以將重復(fù)的元素隨便放入而Set會(huì)自動(dòng)去重,底層實(shí)現(xiàn)也是HashMap妻坝,并且 set 提供了判斷某個(gè)成員是否在一個(gè) set 集合內(nèi)的重要接口伸眶,這個(gè)也是 list 所不能提供的。

實(shí)現(xiàn)原理

set 的內(nèi)部實(shí)現(xiàn)是一個(gè) value 永遠(yuǎn)為 null 的 HashMap刽宪,實(shí)際就是通過計(jì)算 hash 的方式來(lái)快速排重的厘贼,這也是 set 能提供判斷一個(gè)成員是否在集合內(nèi)的原因。

常用操作
  1. 增刪改查:SAdd/SRem/SIsMember/SCard/SMove/SMembers等等圣拄。除了SMembers都是O(1)嘴秸。

  2. 集合操作:SInter/SInterStore/SUnion/SUnionStore/SDiff/SDiffStore,各種集合操作庇谆。交集運(yùn)算可以用來(lái)顯示在線好友(在線用戶 交集 好友列表)赁遗,共同關(guān)注(兩個(gè)用戶的關(guān)注列表的交集)。O(N)族铆,并集和差集的N是集合大小之和,交集的N是小的那個(gè)集合的大小的2倍哭尝。

8- Sorted Set(插入有序Set集合)

set 不是自動(dòng)有序的哥攘,而** sorted set 可以通過用戶額外提供一個(gè)優(yōu)先級(jí)(score)的參數(shù)來(lái)為成員排序并且是插入有序的,即自動(dòng)排序**逝淹。當(dāng)你需要一個(gè)有序的并且不重復(fù)的集合列表耕姊,那么可以選擇 sorted set 數(shù)據(jù)結(jié)構(gòu),比如 twitter 的 public timeline 可以以發(fā)表時(shí)間作為 score 來(lái)存儲(chǔ)栅葡,這樣獲取時(shí)就是自動(dòng)按時(shí)間排好序的茉兰。

實(shí)現(xiàn)方式

內(nèi)部使用 HashMap 和跳躍表(SkipList)來(lái)保證數(shù)據(jù)的存儲(chǔ)和有序

Sorted Set的實(shí)現(xiàn)是HashMap(element->score, 用于實(shí)現(xiàn)ZScore及判斷element是否在集合內(nèi)),和SkipList(score->element,按score排序)的混合體欣簇。SkipList有點(diǎn)像平衡二叉樹那樣规脸,不同范圍的score被分成一層一層,每層是一個(gè)按score排序的鏈表熊咽。

常用操作

ZAdd/ZRem是O(log(N))莫鸭;ZRangeByScore/ZRemRangeByScore是O(log(N)+M),N是Set大小横殴,M是結(jié)果/操作元素的個(gè)數(shù)被因。復(fù)雜度的log取對(duì)數(shù)很關(guān)鍵,可以使衫仑,1000萬(wàn)大小的Set梨与,復(fù)雜度也只是幾十不到。但是文狱,如果一次命中很多元素M很大則復(fù)雜度很高粥鞋。

  1. ZRange/ZRevRange,按排序結(jié)果的范圍返回元素列表如贷,可以為正數(shù)與倒數(shù)陷虎。

  2. ZRangeByScore/ZRevRangeByScore,按score的范圍返回元素杠袱,可以為正數(shù)與倒數(shù)尚猿。

  3. ZRemRangeByRank/ZRemRangeByScore,按排序/按score的范圍限刪除元素楣富。

  4. ZCount凿掂,統(tǒng)計(jì)按score的范圍的元素個(gè)數(shù)。

  5. ZRank/ZRevRank 纹蝴,顯示某個(gè)元素的正/倒序的排名庄萎。

  6. ZScore/ZIncrby,顯示元素的Score值/增加元素的Score塘安。

  7. ZAdd(Add)/ZRem(Remove)/ZCard(Count)糠涛,ZInsertStore(交集)/ZUnionStore(并集),與Set相比兼犯,少了IsMember和差集運(yùn)算忍捡。

8- Redis使用與內(nèi)存優(yōu)化

上面的一些實(shí)現(xiàn)上的分析可以看出 redis 實(shí)際上的內(nèi)存管理成本非常高集漾,即占用了過多的內(nèi)存,屬于用空間換時(shí)間砸脊。作者對(duì)這點(diǎn)也非常清楚具篇,所以提供了一系列的參數(shù)和手段來(lái)控制和節(jié)省內(nèi)存

建議不要開啟VM(虛擬內(nèi)存)選項(xiàng)

VM 選項(xiàng)是作為 Redis 存儲(chǔ)超出物理內(nèi)存數(shù)據(jù)的一種數(shù)據(jù)在內(nèi)存與磁盤換入換出的一個(gè)持久化策略,將嚴(yán)重地拖垮系統(tǒng)的運(yùn)行速度凌埂,所以要關(guān)閉 VM 功能驱显,請(qǐng)檢查你的 redis.conf 文件中 vm-enabled 為 no。

設(shè)置最大內(nèi)存選項(xiàng)

最好設(shè)置下 redis.conf 中的 maxmemory 選項(xiàng)瞳抓,該選項(xiàng)是告訴 Redis 當(dāng)使用了多少物理內(nèi)存后就開始拒絕后續(xù)的寫入請(qǐng)求埃疫,該參數(shù)能很好的保護(hù)好你的 Redis 不會(huì)因?yàn)槭褂昧诉^多的物理內(nèi)存而導(dǎo)致 swap,最終嚴(yán)重影響性能甚至崩潰挨下。

一般還需要設(shè)置內(nèi)存飽和回收策略

  1. volatile-lru:從已設(shè)置過期時(shí)間的數(shù)據(jù)集(server.db[i].expires)中挑選最近最少使用的數(shù)據(jù)淘汰
  2. volatile-ttl:從已設(shè)置過期時(shí)間的數(shù)據(jù)集(server.db[i].expires)中挑選將要過期的數(shù)據(jù)淘汰
  3. volatile-random:從已設(shè)置過期時(shí)間的數(shù)據(jù)集(server.db[i].expires)中任意選擇數(shù)據(jù)淘汰
  4. allkeys-lru:從數(shù)據(jù)集(server.db[i].dict)中挑選最近最少使用的數(shù)據(jù)淘汰
  5. allkeys-random:從數(shù)據(jù)集(server.db[i].dict)中任意選擇數(shù)據(jù)淘汰
  6. no-enviction(驅(qū)逐):禁止驅(qū)逐數(shù)據(jù)
控制內(nèi)存使用的參數(shù)

Redis 為不同數(shù)據(jù)類型分別提供了一組參數(shù)來(lái)控制內(nèi)存使用

  1. Hash

redis.conf 配置文件中下面2項(xiàng)

  • **hash-max-zipmap-entries 64 **

含義是當(dāng) value 這個(gè) Map 內(nèi)部不超過多少個(gè)成員時(shí)會(huì)采用線性緊湊格式存儲(chǔ)熔恢,默認(rèn)是64,即 value 內(nèi)部有64個(gè)以下的成員就是使用線性緊湊存儲(chǔ)zipmap臭笆,超過該值自動(dòng)轉(zhuǎn)成真正的 HashMap(ht)叙淌。

  • hash-max-zipmap-value 512

hash-max-zipmap-value 含義是當(dāng) value 這個(gè) Map 內(nèi)部的每個(gè)成員值長(zhǎng)度不超過
多少字節(jié)就會(huì)采用線性緊湊存儲(chǔ)zipmap來(lái)節(jié)省空間。

以上2個(gè)條件任意一個(gè)條件超過設(shè)置值都會(huì)轉(zhuǎn)換成真正的 HashMap愁铺,也就不會(huì)再節(jié)省內(nèi)存了鹰霍,但是也不是越大越好(空間和查改效率需要根據(jù)實(shí)際情況來(lái)權(quán)衡)

  1. List
  • list-max-ziplist-entries 512
    list 數(shù)據(jù)類型多少節(jié)點(diǎn)以下會(huì)采用去指針的緊湊存儲(chǔ)格式ziplist
  • list-max-ziplist-value 64
    list 數(shù)據(jù)類型節(jié)點(diǎn)值大小小于多少字節(jié)會(huì)采用緊湊存儲(chǔ)格式ziplist。
  1. Set
  • set-max-intset-entries 512
    set 數(shù)據(jù)類型內(nèi)部數(shù)據(jù)如果全部是數(shù)值型茵乱,且包含多少節(jié)點(diǎn)以下會(huì)采用緊湊格式存儲(chǔ)
Redis內(nèi)部的優(yōu)化
  1. Redis 內(nèi)部實(shí)現(xiàn)沒有對(duì)內(nèi)存分配方面做過多的優(yōu)化茂洒,在一定程度上會(huì)存在內(nèi)存碎片,不過大多數(shù)情況下這個(gè)不會(huì)成為 Redis 的性能瓶頸瓶竭。

  2. Redis 緩存了一定范圍的常量數(shù)字作為資源共享督勺,在很多數(shù)據(jù)類型是數(shù)值型則能極大減少內(nèi)存開銷,默認(rèn)為1-10000斤贰,可以重新編譯配置修改源代碼中的一行宏定義 REDIS_SHARED_INTEGERS智哀。

9- 總結(jié)

  1. 根據(jù)業(yè)務(wù)需要選擇合適的數(shù)據(jù)類型,并為不同的應(yīng)用場(chǎng)景設(shè)置相應(yīng)的緊湊存儲(chǔ)參數(shù)荧恍。

  2. 當(dāng)業(yè)務(wù)場(chǎng)景不需要數(shù)據(jù)持久化時(shí)瓷叫,關(guān)閉所有的持久化方式可以獲得最佳的性能以及最大的內(nèi)存使用量。

  3. 如果需要使用持久化送巡,根據(jù)是否可以容忍重啟丟失部分?jǐn)?shù)據(jù)在快照方式與語(yǔ)句追加方式之間選擇其一摹菠,不要使用虛擬內(nèi)存以及 diskstore 方式。

  4. 不要讓你的 Redis 所在機(jī)器物理內(nèi)存使用超過實(shí)際內(nèi)存總量的3/5骗爆。

Redis 的持久化使用了 Buffer IO 次氨,所謂 Buffer IO 是指 Redis 對(duì)持久化文件的寫入和讀取操作都會(huì)使用物理內(nèi)存的 Page Cache,而當(dāng) Redis 的持久化文件過大操作系統(tǒng)會(huì)進(jìn)行Swap摘投,這時(shí)你的系統(tǒng)就會(huì)有內(nèi)存還有余量但是系統(tǒng)不穩(wěn)定或者崩潰的風(fēng)險(xiǎn)煮寡。

參考鏈接
Java消息隊(duì)列任務(wù)的平滑關(guān)閉
redis消息隊(duì)列性能測(cè)試及知識(shí)點(diǎn)整理

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末屉佳,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子洲押,更是在濱河造成了極大的恐慌,老刑警劉巖圆凰,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件杈帐,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡专钉,警方通過查閱死者的電腦和手機(jī)挑童,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)跃须,“玉大人站叼,你說我怎么就攤上這事」矫瘢” “怎么了尽楔?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)第练。 經(jīng)常有香客問我阔馋,道長(zhǎng),這世上最難降的妖魔是什么娇掏? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任呕寝,我火速辦了婚禮,結(jié)果婚禮上婴梧,老公的妹妹穿的比我還像新娘下梢。我一直安慰自己,他們只是感情好塞蹭,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布孽江。 她就那樣靜靜地躺著,像睡著了一般浮还。 火紅的嫁衣襯著肌膚如雪竟坛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天钧舌,我揣著相機(jī)與錄音担汤,去河邊找鬼。 笑死洼冻,一個(gè)胖子當(dāng)著我的面吹牛崭歧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播撞牢,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼率碾,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼叔营!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起所宰,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤绒尊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后仔粥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體婴谱,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年躯泰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了谭羔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡麦向,死狀恐怖瘟裸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情诵竭,我是刑警寧澤话告,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站秀撇,受9級(jí)特大地震影響超棺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜呵燕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一棠绘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧再扭,春花似錦氧苍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至罢荡,卻和暖如春赡突,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背区赵。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工惭缰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人笼才。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓漱受,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親骡送。 傳聞我的和親對(duì)象是個(gè)殘疾皇子昂羡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

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