Redis入門--進階詳解

Redis

[TOC]

NoSql入門和概述

入門概述

互聯(lián)網(wǎng)時代背景下大機遇,為什么用nosql

1.單機MySQL的美好年代
  • 在90年代她奥,一個網(wǎng)站的訪問量一般都不大凸丸,用單個數(shù)據(jù)庫完全可以輕松應(yīng)付,在那個時候阳堕,更多的都是靜態(tài)網(wǎng)頁愉阎,動態(tài)交互類型的網(wǎng)站不多
  • image-20200819133746031
  • 上述架構(gòu)下触趴,我們來看看數(shù)據(jù)存儲的瓶頸是什么?
    1. 數(shù)據(jù)量的總大小 一個機器放不下時
    2. 數(shù)據(jù)的索引(B+ Tree)一個機器的內(nèi)存放不下時
    3. 訪問量(讀寫混合)一個實例不能承受
2.Memcached(緩存)+MySQL+垂直拆分
  • 后來凡资,隨著訪問量的上升砸捏,幾乎大部分使用MySQL架構(gòu)的網(wǎng)站在數(shù)據(jù)庫上都開始出現(xiàn)了性能問題,web程序不再僅僅專注在功能上隙赁,同時也在追求性能垦藏。程序員們開始大量的使用緩存技術(shù)來緩解數(shù)據(jù)庫的壓力,優(yōu)化數(shù)據(jù)庫的結(jié)構(gòu)和索引伞访。開始比較流行的是通過文件緩存來緩解數(shù)據(jù)庫壓力掂骏,但是當(dāng)訪問量繼續(xù)增大的時候,多臺web機器通過文件緩存不能共享厚掷,大量的小文件緩存也帶了了比較高的IO壓力弟灼。在這個時候级解,Memcached就自然的成為一個非常時尚的技術(shù)產(chǎn)品
  • image-20200819135316004
  • Memcached作為一個獨立的分布式的緩存服務(wù)器,為多個web服務(wù)器提供了一個共享的高性能緩存服務(wù)袜爪,在Memcached服務(wù)器上蠕趁,又發(fā)展了根據(jù)hash算法來進行多臺Memcached緩存服務(wù)的擴展薛闪,然后又出現(xiàn)了一致性hash來解決增加或減少緩存服務(wù)器導(dǎo)致重新hash帶來的大量緩存失效的弊端
3.MySQL主從讀寫分離
  • 由于數(shù)據(jù)庫的寫入壓力增加辛馆,Memcached只能緩解數(shù)據(jù)庫的讀取壓力。讀寫集中在一個數(shù)據(jù)庫上讓數(shù)據(jù)庫不堪重負豁延,大部分網(wǎng)站開始使用主從復(fù)制技術(shù)來達到讀寫分離昙篙,以提高讀寫性能和讀庫的可擴展性。Mysql的master-slave模式成為這個時候的網(wǎng)站標(biāo)配了
  • image-20200819140121843
4.分表分庫+水平拆分+mysql集群
  • 在Memcached的高速緩存诱咏,MySQL的主從復(fù)制苔可,讀寫分離的基礎(chǔ)之上,這時MySQL主庫的寫壓力開始出現(xiàn)瓶頸袋狞,而數(shù)據(jù)量的持續(xù)猛增焚辅,由于MyISAM使用表鎖,在高并發(fā)下會出現(xiàn)嚴(yán)重的鎖問題苟鸯,大量的高并發(fā)MySQL應(yīng)用開始使用InnoDB引擎代替MyISAM

  • 同時同蜻,開始流行使用分表分庫來緩解寫壓力和數(shù)據(jù)增長的擴展問題。這個時候早处,分表分庫成了一個熱門技術(shù)湾蔓,是面試的熱門問題也是業(yè)界討論的熱門技術(shù)問題。也就在這個時候砌梆,MySQL推出了還不太穩(wěn)定的表分區(qū)默责,這也給技術(shù)實力一般的公司帶來了希望。雖然MySQL推出了MySQL Cluster集群咸包,但性能也不能很好滿足互聯(lián)網(wǎng)的要求桃序,只是在高可靠性上提供了非常大的保證

  • image-20200819141000786
5.MySQL的擴展性瓶頸
  • MySQL數(shù)據(jù)庫也經(jīng)常存儲一些大文本字段,導(dǎo)致數(shù)據(jù)庫表非常的大烂瘫,在做數(shù)據(jù)庫恢復(fù)的時候就導(dǎo)致非常的慢媒熊,不容易快速恢復(fù)數(shù)據(jù)庫。比如1000萬4KB大小的文本就接近40GB的大小忱反,如果能把這些數(shù)據(jù)從MySQL省去泛释,MySQL將變得非常的小。關(guān)系數(shù)據(jù)庫很強大温算,但是它并不能很好的應(yīng)付所有的應(yīng)用場景怜校。MySQL的擴展性差(需要復(fù)雜的技術(shù)來實現(xiàn)),大數(shù)據(jù)下IO壓力大注竿,表結(jié)構(gòu)更改困難茄茁,正是當(dāng)前使用MySQL的開發(fā)人員面臨的問題
6.今天系統(tǒng)是什么樣子
  • image-20200819141451036
7.為什么要用NoSQL
  • 今天我們可以通過第三方平臺(如:Google,Facebook等)可以很容易的訪問和抓取數(shù)據(jù)魂贬。用戶的個人信息,社交網(wǎng)絡(luò)裙顽,地理位置付燥,用戶生成的數(shù)據(jù)和用戶操作日志已經(jīng)成倍的增加。我們?nèi)绻獙@些用戶數(shù)據(jù)進行挖掘愈犹,那SQL數(shù)據(jù)庫已經(jīng)不適合這些應(yīng)用了, NoSQL數(shù)據(jù)庫的發(fā)展也卻能很好的處理這些大的數(shù)據(jù)
  • image-20200819141649524

是什么

  • NoSQL(NoSQL = Not Only SQL )键科,意即“不僅僅是SQL”

  • 泛指非關(guān)系型的數(shù)據(jù)庫。隨著互聯(lián)網(wǎng)web2.0網(wǎng)站的興起漩怎,傳統(tǒng)的關(guān)系數(shù)據(jù)庫在應(yīng)付web2.0網(wǎng)站勋颖,特別是超大規(guī)模和高并發(fā)的SNS類型的web2.0純動態(tài)網(wǎng)站已經(jīng)顯得力不從心,暴露了很多難以克服的問題勋锤,而非關(guān)系型的數(shù)據(jù)庫則由于其本身的特點得到了非常迅速的發(fā)展饭玲。NoSQL數(shù)據(jù)庫的產(chǎn)生就是為了解決大規(guī)模數(shù)據(jù)集合多重數(shù)據(jù)種類帶來的挑戰(zhàn),尤其是大數(shù)據(jù)應(yīng)用難題叁执,包括超大規(guī)模數(shù)據(jù)的存儲

  • (例如谷歌或Facebook每天為他們的用戶收集萬億比特的數(shù)據(jù))茄厘。這些類型的數(shù)據(jù)存儲不需要固定的模式無需多余操作就可以橫向擴展

能干嘛

易擴展
  • NoSQL數(shù)據(jù)庫種類繁多谈宛,但是一個共同的特點都是去掉關(guān)系數(shù)據(jù)庫的關(guān)系型特征次哈。數(shù)據(jù)之間無關(guān)系,這樣就非常容易擴展入挣。也無形之間亿乳,在架構(gòu)的層面上帶來了可擴展的能力
大數(shù)據(jù)量高性能
  • NoSQL數(shù)據(jù)庫都具有非常高的讀寫性能,尤其在大數(shù)據(jù)量下径筏,同樣表現(xiàn)優(yōu)秀葛假,這得益于它的無關(guān)系性,數(shù)據(jù)庫的結(jié)構(gòu)簡單
  • 一般MySQL使用Query Cache滋恬,每次表的更新Cache就失效聊训,是一種大粒度的Cache,
    在針對web2.0的交互頻繁的應(yīng)用恢氯,Cache性能不高带斑。而NoSQL的Cache是記錄級的,
    是一種細粒度的Cache勋拟,所以NoSQL在這個層面上來說就要性能高很多
多樣靈活的數(shù)據(jù)模型
  • NoSQL無需事先為要存儲的數(shù)據(jù)建立字段勋磕,隨時可以存儲自定義的數(shù)據(jù)格式。而在關(guān)系數(shù)據(jù)庫里敢靡,
    增刪字段是一件非常麻煩的事情挂滓。如果是非常大數(shù)據(jù)量的表,增加字段簡直就是一個噩夢
傳統(tǒng)RDBMS VS NOSQL
  • RDBMS vs NoSQL

  • RDBMS NoSQL
    高度組織化結(jié)構(gòu)化數(shù)據(jù) 代表著不僅僅是SQL
    結(jié)構(gòu)化查詢語言(SQL) 沒有聲明性查詢語言
    數(shù)據(jù)和關(guān)系都存儲在單獨的表中 沒有預(yù)定義的模式
    數(shù)據(jù)操縱語言啸胧,數(shù)據(jù)定義語言 鍵 - 值對存儲幔虏,列存儲,文檔存儲贝椿,圖形數(shù)據(jù)庫
    嚴(yán)格的一致性 最終一致性想括,而非ACID屬性
    基礎(chǔ)事務(wù) 非結(jié)構(gòu)化和不可預(yù)知的數(shù)據(jù)
    CAP定理
    高性能,高可用性和可伸縮性

去哪里下

  • Redis
  • Memcache
  • Mongdb

怎么玩

  • KV
  • Cache
  • Persistence
  • ......

3V+3高

大數(shù)據(jù)時代的3V

  • 海量Volume
  • 多樣Variety
  • 實時Velocity

互聯(lián)網(wǎng)需求的3高

  • 高并發(fā)
  • 高可擴
  • 高性能

當(dāng)下的NoSQL經(jīng)典應(yīng)用

當(dāng)下的應(yīng)用是sql和nosql一起使用

阿里巴巴中文站商品信息如何存放

  • 和我們相關(guān)的烙博,多數(shù)據(jù)源多數(shù)據(jù)類型的存儲問題
    image-20200819170618027
1.商品基本信息
  • 名稱瑟蜈、價格,出廠日期习勤,生產(chǎn)廠商等
  • 關(guān)系型數(shù)據(jù)庫:mysql/oracle目前淘寶在去O化(也即拿掉Oracle)踪栋,注意焙格,淘寶內(nèi)部用的Mysql是里面的大牛自己改造過的
    • 為什么去IOE:2008年图毕,王堅加盟阿里巴巴成為集團首席架構(gòu)師,即現(xiàn)在的首席技術(shù)官眷唉。這位前微軟亞洲研究院常務(wù)副院長被馬云定位為:將幫助阿里巴巴集團建立世界級的技術(shù)團隊予颤,并負責(zé)集團技術(shù)架構(gòu)以及基礎(chǔ)技術(shù)平臺搭建。
      在加入阿里后冬阳,帶著技術(shù)基因和學(xué)者風(fēng)范的王堅就在阿里巴巴集團提出了被稱為“去IOE”(在IT建設(shè)過程中蛤虐,去除IBM小型機、Oracle數(shù)據(jù)庫及EMC存儲設(shè)備)的想法肝陪,并開始把云計算的本質(zhì)驳庭,植入阿里IT基因。
      王堅這樣概括“去IOE”運動和阿里云之間的關(guān)系:“去IOE”徹底改變了阿里集團IT架構(gòu)的基礎(chǔ)氯窍,是阿里擁抱云計算饲常,產(chǎn)出計算服務(wù)的基礎(chǔ)±翘郑“去IOE”的本質(zhì)是分布化贝淤,讓隨處可以買到的Commodity PC架構(gòu)成為可能,使云計算能夠落地的首要條件政供。
2.商品描述播聪、詳情、評價信息(多文字類)
  • 多文字信息描述類布隔,IO讀寫性能變差
  • 文檔數(shù)據(jù)庫MongDB中
3.商品的圖片
  • 商品圖片展示類
  • 分布式的文件系統(tǒng)中
    • 淘寶自己的TFS
    • Google的GFS
    • Hadoop的HDFS
4.商品的關(guān)鍵字
  • 搜索引擎离陶,淘寶內(nèi)用
  • ISearch
5.商品的波段性的熱點高頻信息
  • 內(nèi)存數(shù)據(jù)庫
  • Tair、Redis衅檀、Memcache
6.商品的交易招刨、價格計算、積分累計
  • 外部系統(tǒng)术吝,外部第3方支付接口
  • 支付寶
7.總結(jié)大型互聯(lián)網(wǎng)應(yīng)用(大數(shù)據(jù)计济、高并發(fā)茸苇、多樣數(shù)據(jù)類型)的難點和解決方案
  • 難點
    • 數(shù)據(jù)類型多樣性
    • 數(shù)據(jù)源多樣性和變化重構(gòu)
    • 數(shù)據(jù)源改造而數(shù)據(jù)服務(wù)平臺不需要大面積重構(gòu)
  • 解決辦法
    • EAI和統(tǒng)一數(shù)據(jù)平臺服務(wù)
    • 阿里、淘寶:UDSL
      • 是什么
        image-20200820090726321
      • 什么樣
        image-20200820091124556
        1. 映射
        2. API
        3. 熱點緩存
        4. ......

NoSQL數(shù)據(jù)模型簡介

以一個電商客戶沦寂、訂單学密、訂購、地址模型來對比下關(guān)系型數(shù)據(jù)庫和非關(guān)系型數(shù)據(jù)庫

傳統(tǒng)的關(guān)系型數(shù)據(jù)庫你如何設(shè)計传藏?
  • ER圖(1:1/1:N/N:N,主外鍵等常見)
    image-20200820095922687
NoSQL你如何設(shè)計
  • 什么是BSON:BSON()是一種類json的一種二進制形式的存儲格式腻暮,簡稱Binary JSON,它和JSON一樣毯侦,支持內(nèi)嵌的文檔對象和數(shù)組對象

  • BSON數(shù)據(jù)模型

    • {
       "customer":{
         "id":1136,
         "name":"Z3",
         "billingAddress":[{"city":"beijing"}],
         "orders":[
          {
            "id":17,
            "customerId":1136,
            "orderItems":[{"productId":27,"price":77.5,"productName":"thinking in java"}],
            "shippingAddress":[{"city":"beijing"}]
            "orderPayment":[{"ccinfo":"111-222-333","txnid":"asdfadcd334","billingAddress":{"city":"beijing"}}],
            }
          ]
        }
      }
      
兩者對比哭靖,問題和難點
  • 為什么上述的情況可以用聚合模型來處理
    • 高并發(fā)的操作是不太建議有關(guān)聯(lián)查詢的,互聯(lián)網(wǎng)公司用冗余數(shù)據(jù)來避免關(guān)聯(lián)查詢
    • 分布式事務(wù)是支持不了太多的并發(fā)的
  • 啟發(fā)學(xué)生侈离,想想關(guān)系模型數(shù)據(jù)庫你如何查试幽?如果按照我們新設(shè)計的BSon,是不是查詢起來很可愛

聚合模型

  • KV鍵值對
  • BSON
  • 列族
    • 顧名思義卦碾,是按列存儲數(shù)據(jù)的铺坞。最大的特點是方便存儲結(jié)構(gòu)化和半結(jié)構(gòu)化數(shù)據(jù),方便做數(shù)據(jù)壓縮洲胖,對針對某一列或者某幾列的查詢有非常大的IO優(yōu)勢
      image-20200820104717957
  • 圖形
    image-20200820104751889

NoSQL數(shù)據(jù)庫的四大分類

KV鍵值:典型介紹

  • 新浪:BerkeleyDB+redis
  • 美團:redis+tair
  • 阿里济榨、百度:memcache+redis

文檔型數(shù)據(jù)庫(bson格式比較多):典型介紹

  • CouchDB
  • MongoDB
    • MongoDB 是一個基于分布式文件存儲的數(shù)據(jù)庫。由 C++ 語言編寫绿映。旨在為 WEB 應(yīng)用提供可擴展的高性能數(shù)據(jù)存儲解決方案
    • MongoDB 是一個介于關(guān)系數(shù)據(jù)庫和非關(guān)系數(shù)據(jù)庫之間的產(chǎn)品擒滑,是非關(guān)系數(shù)據(jù)庫當(dāng)中功能最豐富,最像關(guān)系數(shù)據(jù)庫的

列存儲數(shù)據(jù)庫

  • Cassandra叉弦、HBase
  • 分布式文件系統(tǒng)

圖關(guān)系數(shù)據(jù)庫

  • 它不是放圖形的丐一,放的是關(guān)系比如:朋友圈社交網(wǎng)絡(luò)、廣告推薦系統(tǒng)卸奉,社交網(wǎng)絡(luò)钝诚,推薦系統(tǒng)等。專注于構(gòu)建關(guān)系圖譜
  • Neo4j,InfoGrid

四者對比

  • image-20200820111234007

在分布式數(shù)據(jù)庫中CAP原理CAP+BASE

傳統(tǒng)的ACID分別是什么

  • A (Atomicity) 原子性
    原子性很容易理解榄棵,也就是說事務(wù)里的所有操作要么全部做完凝颇,要么都不做,事務(wù)成功的條件是事務(wù)里的所有操作都成功疹鳄,只要有一個操作失敗拧略,整個事務(wù)就失敗,需要回滾瘪弓。比如銀行轉(zhuǎn)賬垫蛆,從A賬戶轉(zhuǎn)100元至B賬戶,分為兩個步驟:1)從A賬戶取100元;2)存入100元至B賬戶袱饭。這兩步要么一起完成川无,要么一起不完成,如果只完成第一步虑乖,第二步失敗懦趋,錢會莫名其妙少了100元。
  • C (Consistency) 一致性
    一致性也比較容易理解疹味,也就是說數(shù)據(jù)庫要一直處于一致的狀態(tài)仅叫,事務(wù)的運行不會改變數(shù)據(jù)庫原本的一致性約束。
  • I (Isolation) 獨立性
    所謂的獨立性是指并發(fā)的事務(wù)之間不會互相影響糙捺,如果一個事務(wù)要訪問的數(shù)據(jù)正在被另外一個事務(wù)修改诫咱,只要另外一個事務(wù)未提交,它所訪問的數(shù)據(jù)就不受未提交事務(wù)的影響洪灯。比如現(xiàn)有有個交易是從A賬戶轉(zhuǎn)100元至B賬戶坎缭,在這個交易還未完成的情況下,如果此時B查詢自己的賬戶婴渡,是看不到新增加的100元的
  • D (Durability) 持久性
    持久性是指一旦事務(wù)提交后幻锁,它所做的修改將會永久的保存在數(shù)據(jù)庫上,即使出現(xiàn)宕機也不會丟失边臼。

CAP

  • C:Consistency(強一致性)
  • A:Availability(可用性)
  • P:Partition tolerance(分區(qū)容錯性)

CAP的三選二

  • CAP理論就是說在分布式存儲系統(tǒng)中,最多只能實現(xiàn)上面的兩點假消。而由于當(dāng)前的網(wǎng)絡(luò)硬件肯定會出現(xiàn)延遲丟包等問題柠并,所以分區(qū)容忍性是我們必須需要實現(xiàn)的。所以我們只能在一致性和可用性之間進行權(quán)衡富拗,沒有NoSQL系統(tǒng)能同時保證這三點

  • C:強一致性 臼予、A:高可用性 、P:分布式容忍性

    • CA 傳統(tǒng)Oracle數(shù)據(jù)庫

    • AP 大多數(shù)網(wǎng)站架構(gòu)的選擇

    • CP Redis啃沪、Mongodb

    • 注意:分布式架構(gòu)的時候必須做出取舍粘拾。一致性和可用性之間取一個平衡。多余大多數(shù)web應(yīng)用创千,其實并不需要強一致性缰雇。因此犧牲C換取P,這是目前分布式數(shù)據(jù)庫產(chǎn)品的方向

經(jīng)典CAP圖

  • CAP理論的核心是:一個分布式系統(tǒng)不可能同時很好的滿足一致性追驴,可用性和分區(qū)容錯性這三個需求械哟,
    最多只能同時較好的滿足兩個。因此殿雪,根據(jù) CAP 原理將 NoSQL 數(shù)據(jù)庫分成了滿足 CA 原則暇咆、滿足 CP 原則和滿足 AP 原則三 大類:
  • CA - 單點集群,滿足一致性,可用性的系統(tǒng)爸业,通常在可擴展性上不太強大
  • CP - 滿足一致性其骄,分區(qū)容忍必的系統(tǒng),通常性能不是特別高
  • AP - 滿足可用性扯旷,分區(qū)容忍性的系統(tǒng)年栓,通常可能對一致性要求低一些
  • image-20200820113420911

BASE

  • BASE就是為了解決關(guān)系數(shù)據(jù)庫強一致性引起的問題而引起的可用性降低而提出的解決方案薄霜。

  • BASE其實是下面三個術(shù)語的縮寫:

    • 基本可用(Basically Available)
    • 軟狀態(tài)(Soft state)
    • 最終一致(Eventually consistent)
  • 它的思想是通過讓系統(tǒng)放松對某一時刻數(shù)據(jù)一致性的要求來換取系統(tǒng)整體伸縮性和性能上改觀某抓。為什么這么說呢,緣由就在于大型系統(tǒng)往往由于地域分布和極高性能的要求惰瓜,不可能采用分布式事務(wù)來完成這些指標(biāo)否副,要想獲得這些指標(biāo)捌斧,我們必須采用另外一種方式來完成准浴,這里BASE就是解決這個問題的辦法

分布式+集群簡介

  • 分布式系統(tǒng)(distributed system

    • 由多臺計算機和通信的軟件組件通過計算機網(wǎng)絡(luò)連接(本地網(wǎng)絡(luò)或廣域網(wǎng))組成。分布式系統(tǒng)是建立在網(wǎng)絡(luò)之上的軟件系統(tǒng)感论。正是因為軟件的特性奈揍,所以分布式系統(tǒng)具有高度的內(nèi)聚性和透明性曲尸。因此,網(wǎng)絡(luò)和分布式系統(tǒng)之間的區(qū)別更多的在于高層軟件(特別是操作系統(tǒng))男翰,而不是硬件另患。分布式系統(tǒng)可以應(yīng)用在在不同的平臺上如:Pc、工作站蛾绎、局域網(wǎng)和廣域網(wǎng)上等昆箕。
  • 簡單來講:

    1. 分布式:不同的多臺服務(wù)器上面部署不同的服務(wù)模塊(工程),他們之間通過Rpc/Rmi之間通信和調(diào)用租冠,對外提供服務(wù)和組內(nèi)協(xié)作

    2. 集群:不同的多臺服務(wù)器上面部署相同的服務(wù)模塊鹏倘,通過分布式調(diào)度軟件進行統(tǒng)一的調(diào)度,對外提供服務(wù)和訪問

Redis入門介紹

入門概述

是什么

  • Redis:REmote DIctionary Server(遠程字典服務(wù)器)

  • 是完全開源免費的顽爹,用C語言編寫的纤泵,遵守BSD協(xié)議,是一個高性能的(key/value)分布式內(nèi)存數(shù)據(jù)庫镜粤,基于內(nèi)存運行捏题,并支持持久化的NoSQL數(shù)據(jù)庫,是當(dāng)前最熱門的NoSql數(shù)據(jù)庫之一,也被人們稱為數(shù)據(jù)結(jié)構(gòu)服務(wù)器

  • Redis 與其他 key - value 緩存產(chǎn)品(memcache)有以下三個特點

    1. Redis支持數(shù)據(jù)的持久化繁仁,可以將內(nèi)存中的數(shù)據(jù)保持在磁盤中涉馅,重啟的時候可以再次加載進行使用
    2. Redis不僅僅支持簡單的key-value類型的數(shù)據(jù),同時還提供list黄虱,set稚矿,zset,hash等數(shù)據(jù)結(jié)構(gòu)的存儲
    3. Redis支持數(shù)據(jù)的備份,即master-slave模式的數(shù)據(jù)備份

能干嘛

  • 內(nèi)存存儲和持久化:redis支持異步將內(nèi)存中的數(shù)據(jù)寫到硬盤上晤揣,同時不影響繼續(xù)服務(wù)
  • 取最新N個數(shù)據(jù)的操作桥爽,如:可以將最新的10條評論的ID放在Redis的List集合里面
  • 模擬類似于HttpSession這種需要設(shè)定過期時間的功能
  • 發(fā)布、訂閱消息系統(tǒng)
  • 定時器昧识、計數(shù)器

去哪下

怎么玩

  • 數(shù)據(jù)類型钠四、基本操作和配置
  • 持久化和復(fù)制,RDB/AOF
  • 事務(wù)的控制
  • 復(fù)制
  • ......

Redis的安裝

下載redis到/opt目錄

  • 第三方軟件習(xí)慣放置于/opt目錄下

執(zhí)行make跪楞、make install命令

  • 注意gcc版本

  • 詳細操作參考:升級gcc

Redis啟動

  • 進入默認安裝目錄 /usr/local/bin
  • redis-server redis.conf(自定義的conf文件)
  • redis-cli -p 6379

Redis啟動后雜項基礎(chǔ)知識講解

單進程

  • 單進程模型來處理客戶端的請求缀去。對讀寫等事件的響應(yīng)是通過對epoll函數(shù)的包裝來做到的。Redis的實際處理速度完全依靠主進程的執(zhí)行效率
  • Epoll是Linux內(nèi)核為處理大批量文件描述符而作了改進的epoll甸祭,是Linux下多路復(fù)用IO接口select/poll的增強版本缕碎,它能顯著提高程序在大量并發(fā)連接中只有少量活躍的情況下的系統(tǒng)CPU利用率

默認16個數(shù)據(jù)庫,類似數(shù)組下表從零開始池户,初始默認使用零號庫

  • 設(shè)置數(shù)據(jù)庫的數(shù)量咏雌,默認數(shù)據(jù)庫為0,可以使用SELECT <dbid>命令在連接上指定數(shù)據(jù)庫id
    databases 16

Select命令切換數(shù)據(jù)庫

  • select 0
    

Dbsize查看當(dāng)前數(shù)據(jù)庫的key的數(shù)量

keys列出庫中所有的key

  • keys *
  • keys k校焦? 類似模糊查找

FlushDb:清空當(dāng)前庫

FlushALL:通殺所有庫

統(tǒng)一密碼管理赊抖,16個庫都是同樣密碼,要么都OK要么一個也連接不上

Redis索引都是從零開始

為什么默認端口是6379

Redis數(shù)據(jù)類型

Redis的五大數(shù)據(jù)類型

String(字符串)

  • string是redis最基本的類型寨典,你可以理解成與Memcached一模一樣的類型氛雪,一個key對應(yīng)一個value
  • string類型是二進制安全的。意思是redis的string可以包含任何數(shù)據(jù)凝赛。比如jpg圖片或者序列化的對象
  • string類型是Redis最基本的數(shù)據(jù)類型注暗,一個redis中字符串value最多可以是512M

Hash(哈希,類似java里的Map)

  • Redis hash 是一個鍵值對集合
  • Redis hash是一個string類型的field和value的映射表墓猎,hash特別適合用于存儲對象
  • 類似Java里面的Map<String,Object>

List(列表)

  • Redis 列表是簡單的字符串列表,按照插入順序排序赚楚,你可以添加一個元素到列表的頭部(左邊)或尾部
  • 它的底層實際是個鏈表

Set(集合)

  • Redis的Set是string類型的無序無重復(fù)集合毙沾。它是通過HashTable實現(xiàn)實現(xiàn)的
  • 注意:new HashSet 底層相當(dāng)于new HashMap(詳情查看JDK源碼)

Zset(sorted set :有序集合)

  • Redis zset 和 set 一樣也是string類型元素的集合,且不允許重復(fù)的成員,不同的是每個元素都會關(guān)聯(lián)一個double類型的分數(shù)
  • redis正是通過分數(shù)來為集合中的成員進行從小到大的排序宠页。zset的成員是唯一的,但分數(shù)(score)卻可以重復(fù)左胞。

哪里去獲得redis常見數(shù)據(jù)類型操作命令

redis命令參考大全

  • redis命令
  • image-20200820165059258
  • image-20200820165119310
  • image-20200820165200159
  • image-20200820165214255

Redis鍵(key)

常用

  • image-20200820165303078

案例

  • keys *
  • exists key的名字,判斷某個key是否存在
  • move key db --->當(dāng)前庫就沒有了举户,被移除了
  • expire key 秒鐘:為給定的key設(shè)置過期時間
  • ttl key 查看還有多少秒過期烤宙,-1表示永不過期,-2表示已過期
  • type key 查看你的key是什么類型

Redis字符串(String)

常用

  • image-20200820170745693
  • image-20200820170753026

單值單Value

案例

set/get/del/append/strlen
Incr/decr/incrby/decrby,一定要是數(shù)字才能進行加減
getrange/setrange
  • getrange:獲取指定區(qū)間范圍內(nèi)的值俭嘁,類似between......and的關(guān)系
    image-20200820171427145
  • setrange設(shè)置指定區(qū)間范圍內(nèi)的值躺枕,格式是setrange key值 具體值
    image-20200820171437617
setex(set with expire)鍵秒值/setnx(set if not exist)
  • setex:設(shè)置帶過期時間的key,動態(tài)設(shè)置
  • setex 鍵 秒值 真實值
    • image-20200820171828050
  • setnx:只有在 key 不存在時設(shè)置 key 的值
    • image-20200820171915018
mset/mget/msetnx
  • mset:同時設(shè)置一個或多個 key-value 對
    image-20200820173029642
  • mget:獲取所有(一個或多個)給定 key 的值
    image-20200820173040024
  • msetnx:同時設(shè)置一個或多個 key-value 對,當(dāng)且僅當(dāng)所有給定 key 都不存在
    image-20200820173052240
getset(先get再set)
  • getset:將給定 key 的值設(shè)為 value 拐云,并返回 key 的舊值(old value),簡單一句話罢猪,先get然后立即set
    image-20200820173346485

Redis列表(List)

常用

  • image-20200821092422433
  • image-20200821092433593

單值多Value

案例

lpush(列表頭部)/rpush(尾部)/lrange
lpop/rpop
  • image-20200821094109630
lindex,按照索引下標(biāo)獲得元素(從上到下)
llen
lrem key 刪N個value
  • 從left往right刪除2個值等于v1的元素叉瘩,返回的值為實際刪除的數(shù)量
  • LREM list3 0 值膳帕,表示刪除全部給定的值。零個就是全部值
ltrim key 開始index 結(jié)束index薇缅,截取指定范圍的值后再賦值給key
rpoplpush 源列表 目的列表
lset key index value
linsert key before/after 值1 值2
性能總結(jié)
  • 它是一個字符串鏈表危彩,left、right都可以插入添加泳桦;如果鍵不存在汤徽,創(chuàng)建新的鏈表;如果鍵已存在蓬痒,新增內(nèi)容泻骤;如果值全移除,對應(yīng)的鍵也就消失了梧奢。

  • 鏈表的操作無論是頭和尾效率都極高狱掂,但假如是對中間元素進行操作,效率就很慘淡了亲轨。

Redis集合(Set)

常用

  • image-20200821100807572

單值多Value

案例

sadd/smembers/sismember
  • image-20200821101118880
scard趋惨,獲取集合里面的元素個數(shù)
  • image-20200821101210932
srem key value 刪除集合中元素
srandmember key 某個整數(shù)(隨機出幾個數(shù))
spop key 隨機出棧
smove key1 key2 在key1里某個值 作用是將key1里的某個值賦給key2
數(shù)學(xué)集合類
  1. 差集:sdiff 在第一個set里面而不在后面任何一個set里面的項
  2. 交集:sinter
  3. 并集:sunion

Redis哈希(Hash)

常用

KV模式不變,但V是一個鍵值對

案例

hset/hget/hmset/hmget/hgetall/hdel(*)
  • image-20200821103636188
hlen
hexists key 在key里面的某個值的key
hkeys/hvals
  • image-20200821103904313
hincrby/hincrbyfloat
  • image-20200821104104363
hsetnx
  • 不存在賦值惦蚊,存在了無效

Redis有序集合Zset(sorted set)

常用

  • image-20200821104609766
  • image-20200821104617462

區(qū)別set

  • 在set基礎(chǔ)上器虾,加一個score值,之前set是k1 v1 v2 v3蹦锋,現(xiàn)在zset是k1 score1 v1 score2 v2

案例

zadd/zrange
  • image-20200821105020090
zrangebyscore key 開始score 結(jié)束score
  • withscores
  • ( 不包含
  • Limit 作用是返回限制 limit 開始下標(biāo)步 多少步
  • image-20200821105407685
zrem key 某score下對應(yīng)的value值兆沙,作用是刪除元素
  • 刪除元素,格式是zrem zset的key 項的值莉掂,項的值可以是多個,zrem key score某個對應(yīng)值葛圃,可以是多個值
zcard/zcount key score區(qū)間/zrank key values值,作用是獲得下標(biāo)值/zscore key 對應(yīng)值,獲得分數(shù)
  • zcard :獲取集合中元素個數(shù)
  • zcount :獲取分數(shù)區(qū)間內(nèi)元素個數(shù)憎妙,zcount key 開始分數(shù)區(qū)間 結(jié)束分數(shù)區(qū)間
  • zrank: 獲取value在zset中的下標(biāo)位置
  • zscore:按照值獲得對應(yīng)的分數(shù)
zrevrank key values值库正,作用是逆序獲得下標(biāo)值
zrevrange
  • image-20200821110223102
zrevrangebyscore key 結(jié)束score 開始score
  • zrevrangebyscore zset1 90 60 withscores 分數(shù)是反著來的

解析配置文件redis.conf

Units單位

  • image-20200821112126413
  • 配置大小單位,開頭定義了一些基本的度量單位,只支持bytes厘唾,不支持bit
  • 對大小寫不敏感

INCLUDES包含

  • 可以通過includes包含褥符,redis.conf可以作為總閘,包含其他

GENERAL通用

Daemonize 守護線程方式啟動

Pidfile

Port

Tcp-backlog

  • 設(shè)置tcp的backlog抚垃,backlog其實是一個連接隊列喷楣,backlog隊列總和=未完成三次握手隊列 + 已經(jīng)完成三次握手隊列趟大。
  • 在高并發(fā)環(huán)境下你需要一個高backlog值來避免慢客戶端連接問題。注意Linux內(nèi)核會將這個值減小到/proc/sys/net/core/somaxconn的值抡蛙,所以需要確認增大somaxconn和tcp_max_syn_backlog兩個值
    來達到想要的效果

Timeout

Bind

Tcp-keepalive

  • 單位為秒护昧,如果設(shè)置為0,則不會進行Keepalive檢測粗截,建議設(shè)置成60

Loglevel

  • debug (development/testing)
  • verbose
  • notice (production probably)
  • warning

Logfile

Syslog-enabled

Syslog-ident

Syslog-facility

Databases

SNAPSHOTTING快照(*)

Save

  • 格式: save 秒鐘 寫操作的次數(shù)

    • RDB是整個內(nèi)存的壓縮過的Snapshot惋耙,RDB的數(shù)據(jù)結(jié)構(gòu),可以配置復(fù)合的快照觸發(fā)條件熊昌,

    • 默認是1分鐘內(nèi)改了1萬次绽榛,或5分鐘內(nèi)改了10次,或15分鐘內(nèi)改了1次

    • save 900 1

    • save 300 5

    • save 60 10000

  • 禁用

    • 如果想禁用RDB持久化的策略婿屹,只要不設(shè)置任何save指令灭美,或者給save傳入一個空字符串參數(shù)也可以
    • save “ ”

Stop-writes-on-bgsave-error

  • 如果保存出錯 停止寫操作的意思

  • 如果配置成no,表示你不在乎數(shù)據(jù)不一致或者有其他的手段發(fā)現(xiàn)和控制

rdbcompression

  • rdbcompression:對于存儲到磁盤中的快照昂利,可以設(shè)置是否進行壓縮存儲届腐。如果是的話,redis會采用
    LZF算法進行壓縮蜂奸。如果你不想消耗CPU來進行壓縮的話犁苏,可以設(shè)置為關(guān)閉此功能

rdbchecksum

  • rdbchecksum:在存儲快照后,還可以讓redis使用CRC64算法來進行數(shù)據(jù)校驗扩所,但是這樣做會增加大約
    10%的性能消耗围详,如果希望獲取到最大的性能提升,可以關(guān)閉此功能

dbfilename

dir

  • 獲取目錄:config get dir

REPLICATION復(fù)制

SECURITY安全

  • 訪問密碼的查看祖屏、設(shè)置和取消

LIMITS限制

  • Maxclients
    • 設(shè)置redis同時可以與多少個客戶端進行連接助赞。默認情況下為10000個客戶端。當(dāng)你無法設(shè)置進程文件句柄限制時袁勺,redis會設(shè)置為當(dāng)前的文件句柄限制值減去32雹食,因為redis會為自身內(nèi)部處理邏輯留一些句柄出來。如果達到了此限制期丰,redis則會拒絕新的連接請求婉徘,并且向這些連接請求方發(fā)出“max number of clients reached”以作回應(yīng)。
  • Maxmemory
    • 設(shè)置redis可以使用的內(nèi)存量咐汞。一旦到達內(nèi)存使用上限,redis將會試圖移除內(nèi)部數(shù)據(jù)儒鹿,移除規(guī)則可以通過maxmemory-policy來指定化撕。如果redis無法根據(jù)移除規(guī)則來移除內(nèi)存中的數(shù)據(jù),或者設(shè)置了“不允許移除”约炎,
      那么redis則會針對那些需要申請內(nèi)存的指令返回錯誤信息植阴,比如SET蟹瘾、LPUSH等。
    • 但是對于無內(nèi)存申請的指令掠手,仍然會正常響應(yīng)憾朴,比如GET等。如果你的redis是主redis(說明你的redis有從redis)喷鸽,那么在設(shè)置內(nèi)存使用上限時众雷,需要在系統(tǒng)中留出一些內(nèi)存空間給同步隊列緩存,只有在你設(shè)置的是“不移除”的情況下做祝,才不用考慮這個因素
  • Maxmemory-policy
    • LRU算法:leastest recently use 最近最少使用
    • Volatile-lru:使用LRU算法移除key砾省,只對設(shè)置了過期時間的鍵
    • Allkeys-lru :使用LRU算法移除key
    • Volatile-random :在過期集合中移除隨機的key,只對設(shè)置了過期時間的鍵
    • Allkeys-random :移除隨機的key
    • Volatile-ttl :移除那些TTL值最小的key混槐,即那些最近要過期的key
    • Noeviction :不進行移除编兄,針對寫操作,只是返回錯誤信息
  • Maxmemory-samples
    • 設(shè)置樣本數(shù)量声登,LRU算法和最小TTL算法都并非是精確的算法狠鸳,而是估算值,所以你可以設(shè)置樣本的大小悯嗓,redis默認會檢查這么多個key并選擇其中LRU的那個

APPEND ONLY MODE追加(*)

appendonly

appendfilename

Appendfsync

  • image-20200825112928988
  • 三種策略

    • Always:同步持久化 每次發(fā)生數(shù)據(jù)變更會被立即記錄到磁盤 性能較差但數(shù)據(jù)完整性比較好
    • Everysec:出廠默認推薦件舵,異步操作,每秒記錄 如果一秒內(nèi)宕機绅作,有數(shù)據(jù)丟失
    • No

No-appendfsync-on-rewrite:重寫時是否可以運用Appendfsync芦圾,用默認no即可,保證數(shù)據(jù)安全性

Auto-aof-rewrite-min-size:設(shè)置重寫的基準(zhǔn)值

Auto-aof-rewrite-percentage:設(shè)置重寫的基準(zhǔn)值

常見配置redis.conf介紹(*)

參數(shù)說明

  • redis.conf 配置項說明如下:
    1. Redis默認不是以守護進程的方式運行俄认,可以通過該配置項修改个少,使用yes啟用守護進程
      daemonize no
    2. 當(dāng)Redis以守護進程方式運行時,Redis默認會把pid寫入/var/run/redis.pid文件眯杏,可以通過pidfile指定
      pidfile /var/run/redis.pid
    3. 指定Redis監(jiān)聽端口夜焦,默認端口為6379,作者在自己的一篇博文中解釋了為什么選用6379作為默認端口岂贩,因為6379在手機按鍵上MERZ對應(yīng)的號碼茫经,而MERZ取自意大利歌女Alessia Merz的名字
      port 6379
    4. 綁定的主機地址
      bind 127.0.0.1
    5. 當(dāng) 客戶端閑置多長時間后關(guān)閉連接,如果指定為0萎津,表示關(guān)閉該功能
      timeout 300
    6. 指定日志記錄級別卸伞,Redis總共支持四個級別:debug、verbose锉屈、notice荤傲、warning,默認為verbose
      loglevel verbose
    7. 日志記錄方式颈渊,默認為標(biāo)準(zhǔn)輸出遂黍,如果配置Redis為守護進程方式運行终佛,而這里又配置為日志記錄方式為標(biāo)準(zhǔn)輸出,則日志將會發(fā)送給/dev/null
      logfile stdout
    8. 設(shè)置數(shù)據(jù)庫的數(shù)量雾家,默認數(shù)據(jù)庫為0铃彰,可以使用SELECT <dbid>命令在連接上指定數(shù)據(jù)庫id
      databases 16
    9. 指定在多長時間內(nèi),有多少次更新操作芯咧,就將數(shù)據(jù)同步到數(shù)據(jù)文件牙捉,可以多個條件配合
      save <seconds> <changes>
      Redis默認配置文件中提供了三個條件:
      save 900 1
      save 300 10
      save 60 10000
      分別表示900秒(15分鐘)內(nèi)有1個更改,300秒(5分鐘)內(nèi)有10個更改以及60秒內(nèi)有10000個更改唬党。
    10. 指定存儲至本地數(shù)據(jù)庫時是否壓縮數(shù)據(jù)鹃共,默認為yes,Redis采用LZF壓縮驶拱,如果為了節(jié)省CPU時間霜浴,可以關(guān)閉該選項,但會導(dǎo)致數(shù)據(jù)庫文件變的巨大
      rdbcompression yes
    11. 指定本地數(shù)據(jù)庫文件名蓝纲,默認值為dump.rdb
      dbfilename dump.rdb
    12. 指定本地數(shù)據(jù)庫存放目錄
      dir ./
    13. 設(shè)置當(dāng)本機為slav服務(wù)時阴孟,設(shè)置master服務(wù)的IP地址及端口,在Redis啟動時税迷,它會自動從master進行數(shù)據(jù)同步
      slaveof <masterip> <masterport>
    14. 當(dāng)master服務(wù)設(shè)置了密碼保護時永丝,slav服務(wù)連接master的密碼
      masterauth <master-password>
    15. 設(shè)置Redis連接密碼,如果配置了連接密碼箭养,客戶端在連接Redis時需要通過AUTH <password>命令提供密碼慕嚷,默認關(guān)閉
      requirepass foobared
    16. 設(shè)置同一時間最大客戶端連接數(shù),默認無限制毕泌,Redis可以同時打開的客戶端連接數(shù)為Redis進程可以打開的最大文件描述符數(shù)喝检,如果設(shè)置 maxclients 0,表示不作限制撼泛。當(dāng)客戶端連接數(shù)到達限制時挠说,Redis會關(guān)閉新的連接并向客戶端返回max number of clients reached錯誤信息
      maxclients 128
    17. 指定Redis最大內(nèi)存限制,Redis在啟動時會把數(shù)據(jù)加載到內(nèi)存中愿题,達到最大內(nèi)存后损俭,Redis會先嘗試清除已到期或即將到期的Key,當(dāng)此方法處理 后潘酗,仍然到達最大內(nèi)存設(shè)置杆兵,將無法再進行寫入操作,但仍然可以進行讀取操作仔夺。Redis新的vm機制拧咳,會把Key存放內(nèi)存,Value會存放在swap區(qū)
      maxmemory <bytes>
    18. 指定是否在每次更新操作后進行日志記錄囚灼,Redis在默認情況下是異步的把數(shù)據(jù)寫入磁盤骆膝,如果不開啟,可能會在斷電時導(dǎo)致一段時間內(nèi)的數(shù)據(jù)丟失灶体。因為 redis本身同步數(shù)據(jù)文件是按上面save條件來同步的阅签,所以有的數(shù)據(jù)會在一段時間內(nèi)只存在于內(nèi)存中。默認為no
      appendonly no
    19. 指定更新日志文件名蝎抽,默認為appendonly.aof
      appendfilename appendonly.aof
    20. 指定更新日志條件政钟,共有3個可選值:
      no:表示等操作系統(tǒng)進行數(shù)據(jù)緩存同步到磁盤(快)
      always:表示每次更新操作后手動調(diào)用fsync()將數(shù)據(jù)寫到磁盤(慢,安全)
      everysec:表示每秒同步一次(折衷樟结,默認值)
      appendfsync everysec
    21. 指定是否啟用虛擬內(nèi)存機制养交,默認值為no,簡單的介紹一下瓢宦,VM機制將數(shù)據(jù)分頁存放碎连,由Redis將訪問量較少的頁即冷數(shù)據(jù)swap到磁盤上,訪問多的頁面由磁盤自動換出到內(nèi)存中(在后面的文章我會仔細分析Redis的VM機制)
      vm-enabled no
    22. 虛擬內(nèi)存文件路徑驮履,默認值為/tmp/redis.swap鱼辙,不可多個Redis實例共享
      vm-swap-file /tmp/redis.swap
    23. 將所有大于vm-max-memory的數(shù)據(jù)存入虛擬內(nèi)存,無論vm-max-memory設(shè)置多小,所有索引數(shù)據(jù)都是內(nèi)存存儲的(Redis的索引數(shù)據(jù) 就是keys),也就是說,當(dāng)vm-max-memory設(shè)置為0的時候,其實是所有value都存在于磁盤。默認值為0
      vm-max-memory 0
    24. Redis swap文件分成了很多的page玫镐,一個對象可以保存在多個page上面倒戏,但一個page上不能被多個對象共享,vm-page-size是要根據(jù)存儲的 數(shù)據(jù)大小來設(shè)定的恐似,作者建議如果存儲很多小對象杜跷,page大小最好設(shè)置為32或者64bytes;如果存儲很大大對象矫夷,則可以使用更大的page葛闷,如果不 確定,就使用默認值
      vm-page-size 32
    25. 設(shè)置swap文件中的page數(shù)量口四,由于頁表(一種表示頁面空閑或使用的bitmap)是在放在內(nèi)存中的孵运,,在磁盤上每8個pages將消耗1byte的內(nèi)存蔓彩。
      vm-pages 134217728
    26. 設(shè)置訪問swap文件的線程數(shù),最好不要超過機器的核數(shù),如果設(shè)置為0,那么所有對swap文件的操作都是串行的治笨,可能會造成比較長時間的延遲。默認值為4
      vm-max-threads 4
    27. 設(shè)置在向客戶端應(yīng)答時赤嚼,是否把較小的包合并為一個包發(fā)送旷赖,默認為開啟
      glueoutputbuf yes
    28. 指定在超過一定的數(shù)量或者最大的元素超過某一臨界值時,采用一種特殊的哈希算法
      hash-max-zipmap-entries 64
      hash-max-zipmap-value 512
    29. 指定是否激活重置哈希更卒,默認為開啟(后面在介紹Redis的哈希算法時具體介紹)
      activerehashing yes
    30. 指定包含其它的配置文件紧憾,可以在同一主機上多個Redis實例之間使用同一份配置文件蝌蹂,而同時各個實例又擁有自己的特定配置文件
      include /path/to/local.conf

Redis持久化(*)

總體介紹

官網(wǎng)

RDB(Redis DataBase)

是什么

  • 指定的時間間隔內(nèi)將內(nèi)存中的數(shù)據(jù)集快照寫入磁盤,也就是行話講的Snapshot快照侧啼,它恢復(fù)時是將快照文件直接讀到內(nèi)存里
  • Redis會單獨創(chuàng)建(fork)一個子進程來進行持久化,會先將數(shù)據(jù)寫入到一個臨時文件中悟民,待持久化過程都結(jié)束了,再用這個臨時文件替換上次持久化好的文件。整個過程中弱恒,主進程是不進行任何IO操作的,這就確保了極高的性能如果需要進行大規(guī)模數(shù)據(jù)的恢復(fù)棋恼,且對于數(shù)據(jù)恢復(fù)的完整性不是非常敏感返弹,那RDB方式要比AOF方式更加的高效。RDB的缺點是最后一次持久化后的數(shù)據(jù)可能丟失

Fork

  • Fork的作用是復(fù)制一個與當(dāng)前進程一樣的進程爪飘,新進程的多有數(shù)據(jù)(變量义起、環(huán)境變量、程序計數(shù)器等)數(shù)值都和原進程一致师崎,但是是一個全新的進程默终,并作為原進程的子進程

Rdb 保存的是dump.rdb文件

  • save 命令 迅速備份 快速生成rdb文件

配置文件的位置(參照解析配置文件的快照)

如何觸發(fā)RDB快照

配置文件默認的快照配置
  • 默認是1分鐘內(nèi)改了1萬次,或5分鐘內(nèi)改了10次抡诞,或15分鐘內(nèi)改了1次
  • save 900 1
  • save 300 5
  • save 60 10000
命令save或者是bgsave
  • 都可以迅速 立刻生成dump.rdb文件
  • Save:save時只管保存穷蛹,其它不管,全部阻塞
  • BGSAVE:Redis會在后臺異步進行快照操作昼汗,快照同時還可以響應(yīng)客戶端請求肴熏。可以通過lastsave
    命令獲取最后一次成功執(zhí)行快照的時間
執(zhí)行flushall命令顷窒,也會產(chǎn)生dump.rdb文件蛙吏,但里面是空的,無意義

如何恢復(fù)

  • 將備份文件 (dump.rdb) 移動到 redis 安裝目錄并啟動服務(wù)即可
  • CONFIG GET dir獲取目錄

優(yōu)勢

適合大規(guī)模的數(shù)據(jù)恢復(fù)
對數(shù)據(jù)完整性和一致性要求不高

劣勢

在一定間隔時間做一次備份鞋吉,所以如果redis意外down掉的話鸦做,就會丟失最后一次快照后的所有修改
Fork的時候,內(nèi)存中的數(shù)據(jù)被克隆了一份谓着,大致2倍的膨脹性需要考慮

如何停止

動態(tài)所有停止RDB保存規(guī)則的方法:redis-cli config set save ""

小總結(jié)

  • image-20200824163646437

AOF(Append Only File)

官網(wǎng)

是什么

  • 以日志的形式來記錄每個寫操作泼诱,將Redis執(zhí)行過的所有寫指令記錄下來(讀操作不記錄),只許追加文件但不可以改寫文件赊锚,redis啟動之初會讀取該文件重新構(gòu)建數(shù)據(jù)治筒,換言之,redis重啟的話就根據(jù)日志文件的內(nèi)容將寫指令從前到后執(zhí)行一次以完成數(shù)據(jù)的恢復(fù)工作

AOF保存的是appendonly.aof文件

配置位置

  • image-20200824165305534
  • 見解析配置文件---APPEND ONLY MODE追加

AOF啟動/修復(fù)/恢復(fù)

正诚掀眩恢復(fù)
  • 啟動:設(shè)置Yes,修改默認的appendonly no耸袜,改為yes
  • 將有數(shù)據(jù)的aof文件復(fù)制一份保存到對應(yīng)目錄(config get dir)
  • 恢復(fù):重啟redis然后重新加載
異常恢復(fù)
  • 啟動:設(shè)置Yes,修改默認的appendonly no牲平,改為yes

  • 備份被寫壞的AOF文件

  • 修復(fù):Redis-check-aof --fix aof文件 進行修復(fù)

  • 恢復(fù):重啟redis然后重新加載

Rewrite

是什么
  • image-20200825145521166
  • AOF采用文件追加方式堤框,文件會越來越大為避免出現(xiàn)此種情況,新增了重寫機制,當(dāng)AOF文件的大小超過所設(shè)定的閾值時,Redis就會啟動AOF文件的內(nèi)容壓縮蜈抓,只保留可以恢復(fù)數(shù)據(jù)的最小指令集.可以使用命令bgrewriteaof

重寫原理
  • AOF文件持續(xù)增長而過大時启绰,會fork出一條新進程來將文件重寫(也是先寫臨時文件最后再rename),遍歷新進程的內(nèi)存中數(shù)據(jù)资昧,每條記錄有一條的Set語句酬土。重寫aof文件的操作,并沒有讀取舊的aof文件格带,而是將整個內(nèi)存中的數(shù)據(jù)庫內(nèi)容用命令的方式重寫了一個新的aof文件,這點和快照有點類似
觸發(fā)機制
  • Redis會記錄上次重寫時的AOF大小刹枉,默認配置是當(dāng)AOF文件大小是上次rewrite后大小的一倍且文件大于64M時觸發(fā)

優(yōu)勢

  • 每修改同步:appendfsync always 同步持久化 每次發(fā)生數(shù)據(jù)變更會被立即記錄到磁盤 性能較差但數(shù)據(jù)完整性比較好
  • 每秒同步:appendfsync everysec 異步操作叽唱,每秒記錄 如果一秒內(nèi)宕機,有數(shù)據(jù)丟失
  • 不同步:appendfsync no 從不同步

劣勢

  • 相同數(shù)據(jù)集的數(shù)據(jù)而言aof文件要遠大于rdb文件微宝,恢復(fù)速度慢于rdb
  • Aof運行效率要慢于rdb,每秒同步策略效率較好棺亭,不同步效率和rdb相同

小總結(jié)

  • image-20200825150532205

總結(jié)(Which one)

官網(wǎng)建議

  • image-20200825150754530

比較:

  • RDB持久化方式能夠在指定的時間間隔能對你的數(shù)據(jù)進行快照存儲

  • AOF持久化方式記錄每次對服務(wù)器寫的操作,當(dāng)服務(wù)器重啟的時候會重新執(zhí)行這些命令來恢復(fù)原始的數(shù)據(jù),AOF命令以redis協(xié)議追加保存每次寫的操作到文件末尾,Redis還能對AOF文件進行后臺重寫,使得AOF文件的體積不至于過大

  • 只做緩存:如果你只希望你的數(shù)據(jù)在服務(wù)器運行的時候存在,你也可以不使用任何持久化方式.

同時開啟兩種持久化方式

  • 在這種情況下,當(dāng)redis重啟的時候會優(yōu)先載入AOF文件來恢復(fù)原始的數(shù)據(jù),因為在通常情況下AOF文件保存的數(shù)據(jù)集要比RDB文件保存的數(shù)據(jù)集要完整
  • RDB的數(shù)據(jù)不實時蟋软,同時使用兩者時服務(wù)器重啟也只會找AOF文件镶摘。那要不要只使用AOF呢?作者建議不要岳守,因為RDB更適合用于備份數(shù)據(jù)庫(AOF在不斷變化不好備份)凄敢,快速重啟,而且不會有AOF可能潛在的bug湿痢,留著作為一個萬一的手段涝缝。

性能建議

  • 因為RDB文件只用作后備用途,建議只在Slave上持久化RDB文件譬重,而且只要15分鐘備份一次就夠了拒逮,只保留save 900 1這條規(guī)則。
  • 如果Enalbe AOF臀规,好處是在最惡劣情況下也只會丟失不超過兩秒數(shù)據(jù)滩援,啟動腳本較簡單只load自己的AOF文件就可以了。代價一是帶來了持續(xù)的IO塔嬉,二是AOF rewrite的最后將rewrite過程中產(chǎn)生的新數(shù)據(jù)寫到新文件造成的阻塞幾乎是不可避免的玩徊。只要硬盤許可,應(yīng)該盡量減少AOF rewrite的頻率邑遏,AOF重寫的基礎(chǔ)大小默認值64M太小了佣赖,可以設(shè)到5G以上。默認超過原大小100%大小時重寫可以改到適當(dāng)?shù)臄?shù)值记盒。
  • 如果不Enable AOF 憎蛤,僅靠Master-Slave Replication 實現(xiàn)高可用性也可以。能省掉一大筆IO也減少了rewrite時帶來的系統(tǒng)波動。代價是如果Master/Slave同時倒掉俩檬,會丟失十幾分鐘的數(shù)據(jù)萎胰,啟動腳本也要比較兩個Master/Slave中的RDB文件,載入較新的那個棚辽。新浪微博就選用了這種架構(gòu)

Redis的事務(wù)

是什么

官網(wǎng)

概述

  • 可以一次執(zhí)行多個命令技竟,本質(zhì)是一組命令的集合。一個事務(wù)中的所有命令都會序列化屈藐,按順序地串行化執(zhí)行而不會被其它命令插入榔组,不許加塞

能干嘛

  • 一個隊列中,一次性联逻、順序性搓扯、排他性的執(zhí)行一系列命令

怎么玩

  • image-20200825152828326

常用命令

  • image-20200825154559232

Case1:正常執(zhí)行

  • image-20200825160149485

Case2:放棄事務(wù)

  • image-20200825160247490

Case3:全體連坐

  • image-20200825160548308

Case4:冤頭債主

  • 即使錯了,但是加入進隊列了queued 包归,而不是像case3在運行時直接報錯并沒有加入隊列

  • image-20200825161143350

Case5:watch監(jiān)控

悲觀鎖/樂觀鎖/CAS(Check And Set)
  • 悲觀鎖
    • 悲觀鎖(Pessimistic Lock), 顧名思義锨推,就是很悲觀,每次去拿數(shù)據(jù)的時候都認為別人會修改公壤,所以每次在拿數(shù)據(jù)的時候都會上鎖换可,這樣別人想拿這個數(shù)據(jù)就會block直到它拿到鎖。傳統(tǒng)的關(guān)系型數(shù)據(jù)庫里邊就用到了很多這種鎖機制厦幅,比如行鎖沾鳄,表鎖等,讀鎖慨削,寫鎖等洞渔,都是在做操作之前先上鎖
  • 樂觀鎖
    • 樂觀鎖(Optimistic Lock), 顧名思義,就是很樂觀缚态,每次去拿數(shù)據(jù)的時候都認為別人不會修改磁椒,所以不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個數(shù)據(jù)玫芦,可以使用版本號等機制浆熔。樂觀鎖適用于多讀的應(yīng)用類型,這樣可以提高吞吐量
    • 樂觀鎖策略:提交版本必須大于記錄當(dāng)前版本才能執(zhí)行更新
  • CAS
初始化信用卡可用余額和欠額
  • image-20200825163006942
無加塞篡改桥帆,先監(jiān)控再開啟multi医增,保證兩筆金額變動在同一個事務(wù)內(nèi)
  • image-20200825163528898
有加塞篡改
  • 監(jiān)控了key,如果key被修改了老虫,后面一個事務(wù)的執(zhí)行失效
  • image-20200825164416433
unwatch
  • 取消監(jiān)控

  • image-20200825164449923
一旦執(zhí)行了exec之前加的監(jiān)控鎖都會被取消掉了
小結(jié)
  • Watch指令叶骨,類似樂觀鎖,事務(wù)提交時祈匙,如果Key的值已被別的客戶端改變忽刽,比如某個list已被別的客戶端push/pop過了天揖,整個事務(wù)隊列都不會被執(zhí)行

  • 通過WATCH命令在事務(wù)執(zhí)行之前監(jiān)控了多個Keys,倘若在WATCH之后有任何Key的值發(fā)生了變化跪帝,EXEC命令執(zhí)行的事務(wù)都將被放棄今膊,同時返回Nullmulti-bulk應(yīng)答以通知調(diào)用者事務(wù)執(zhí)行失敗

3階段

開啟

  • 以MULTI開始一個事務(wù)

入隊

  • 將多個命令入隊到事務(wù)中,接到這些命令并不會立即執(zhí)行伞剑,而是放到等待執(zhí)行的事務(wù)隊列里面

執(zhí)行

  • 執(zhí)行:由EXEC命令觸發(fā)事務(wù)

3特性

  • 單獨的隔離操作:事務(wù)中的所有命令都會序列化斑唬、按順序地執(zhí)行。事務(wù)在執(zhí)行的過程中黎泣,不會被其他客戶端發(fā)送來的命令請求所打斷

  • 沒有隔離級別的概念:隊列中的命令沒有提交之前都不會實際的被執(zhí)行恕刘,因為事務(wù)提交前任何指令都不會被實際執(zhí)行,也就不存在”事務(wù)內(nèi)的查詢要看到事務(wù)里的更新抒倚,在事務(wù)外查詢不能看到”這個讓人萬分頭痛的問題

  • 不保證原子性:redis同一個事務(wù)中如果有一條命令執(zhí)行失敗雪营,其后的命令仍然會被執(zhí)行,沒有回滾---部分支持事務(wù)

Redis的發(fā)布和訂閱

是什么

概述

  • 進程間的一種消息通信模式:發(fā)送者(pub)發(fā)送消息衡便,訂閱者(sub)接收消息

訂閱/發(fā)布消息圖

  • image-20200825170025577

命令

  • image-20200825171423258

案例

先訂閱后發(fā)布后才能收到消息

操作

1.1.可以一次性訂閱多個,SUBSCRIBE c1 c2 c3
1.2 消息發(fā)布洋访,PUBLISH c2 hello-redis
2.1 訂閱多個镣陕,通配符, PSUBSCRIBE new
2.2 收取消息姻政, PUBLISH new1 redis2015
image-20200825172439405

Redis的復(fù)制(Master/Slave)

是什么

官網(wǎng)

  • redis主從復(fù)制
  • 行話:也就是我們所說的主從復(fù)制呆抑,主機數(shù)據(jù)更新后根據(jù)配置和策略,自動同步到備機的master/slaver機制汁展,Master以寫為主鹊碍,Slave以讀為主

能干嘛

讀寫分離

容災(zāi)恢復(fù)

怎么玩

1.配從(庫)不配主(庫)

2.從庫配置:slaveof 主庫IP 主庫端口

  • 每次與master斷開之后,都需要重新連接食绿,除非你配置進redis.conf文件
  • Info replication

3.修改配置文件細節(jié)操作

3.1 拷貝多個redis.conf文件
  • image-20200826091338977
3.2 開啟daemonize yes
  • image-20200826091353854
3.3 Pid文件名字
3.4 指定端口
3.5 Log文件名字
  • image-20200826091407130
3.6 Dump.rdb名字
  • image-20200826091437126

4.常用3招

一主二仆
  • Init

    • info replication 查看信息

    • image-20200826093819448
  • 一個Master兩個Slave

    • image-20200826102020559
  • 日志查看

    • 主機日志
      image-20200826102345554
    • 從機日志
      image-20200826102358780
    • info replication
      image-20200826102406629
  • 主從問題演示

    • 1.切入點問題侈咕?slave1、slave2是從頭開始復(fù)制還是從切入點開始復(fù)制?比如從k4進來器紧,那之前的123是否也可以復(fù)制

      答:切入點復(fù)制耀销,不需要從頭復(fù)制

    • 2.從機是否可以寫?set可否铲汪?

      答:從機只讀熊尉,不可set

    • 3.主機shutdown后情況如何?從機是上位還是原地待命

      答:原地待命掌腰,不上位

    • 4.主機又回來了后狰住,主機新增記錄,從機還能否順利復(fù)制

      答:可以順利復(fù)制

    • 5.其中一臺從機down后情況如何齿梁?依照原有它能跟上大部隊嗎催植?

      答:恢復(fù)后,會取消之前的主從設(shè)置,變?yōu)閙aster查邢。 重新slaveof即可

薪火相傳
  • 上一個Slave可以是下一個slave的Master蔗崎,Slave同樣可以接收其他slaves的連接和同步請求,那么該slave作為了鏈條中下一個的master,可以有效減輕master的寫壓力(去中心化

  • 中途變更轉(zhuǎn)向:會清除之前的數(shù)據(jù)扰藕,重新建立拷貝最新的

  • Slaveof 新主庫IP 新主庫端口

反客為主
  • SLAVEOF no one
    • 使當(dāng)前數(shù)據(jù)庫停止與其他數(shù)據(jù)庫的同步缓苛,轉(zhuǎn)成主數(shù)據(jù)庫

復(fù)制原理

復(fù)制流程
  1. Slave啟動成功連接到master后會發(fā)送一個sync命令
  2. Master接到命令啟動后臺的存盤進程,同時收集所有接收到的用于修改數(shù)據(jù)集命令邓深,在后臺進程執(zhí)行完畢之后未桥,master將傳送整個數(shù)據(jù)文件到slave,以完成一次完全同步
  3. 全量復(fù)制:而slave服務(wù)在接收到數(shù)據(jù)庫文件數(shù)據(jù)后,將其存盤并加載到內(nèi)存中
  4. 增量復(fù)制:Master繼續(xù)將新的所有收集到的修改命令依次傳給slave,完成同步
  5. 但是只要是重新連接master,一次完全同步(全量復(fù)制)將被自動執(zhí)行

哨兵模式(Sentinel)

是什么

  • 反客為主的自動版芥备,能夠后臺監(jiān)控主機是否故障冬耿,如果故障了根據(jù)投票數(shù)自動將從庫轉(zhuǎn)換為主庫

使用步驟

1.調(diào)整結(jié)構(gòu),6379帶著80萌壳、81
2.新建sentinel.conf文件亦镶,名字絕不能錯
3.配置哨兵,填寫內(nèi)容
  • sentinel monitor 被監(jiān)控數(shù)據(jù)庫名字(自己起名字) 127.0.0.1 6379 1
    image-20200826114111819
  • 上面最后一個數(shù)字1,表示主機掛掉后salve投票看讓誰接替成為主機袱瓮,得票數(shù)多少后成為主機
4.啟動哨兵
  • Redis-sentinel /opt/redis-6.0.6/sentinel.conf

  • image-20200826131456634
5.正常主從演示
6.原有的master掛了
7.投票新選
  • 哨兵監(jiān)控到原有的主節(jié)點失效缤骨,自動投票選舉新主節(jié)點
    image-20200826131717334
8.重新主從繼續(xù)開工,info replication查看
  • image-20200826131754157
9.問題:如果之前的master重啟回來,會不會雙master沖突尺借?
  • 不會
  • 保持新選舉的master绊起,原先宕機的master,會變成新master的子節(jié)點
  • image-20200826131904566

一組sentinel能同時監(jiān)控多個Master

復(fù)制的缺點

復(fù)制延時

  • 由于所有的寫操作都是先在Master上操作燎斩,然后同步更新到Slave上虱歪,所以從Master同步到Slave機器有一定的延遲,當(dāng)系統(tǒng)很繁忙的時候栅表,延遲問題會更加嚴(yán)重笋鄙,Slave機器數(shù)量的增加也會使這個問題更加嚴(yán)重

Redis的Java客戶端Jedis

Jedis官網(wǎng)

基礎(chǔ)用法

高級用法

Jedis常用API

測試連通性

  • image-20200826134620655

5+1

一個key
五大數(shù)據(jù)類型
  • image-20200826134659501
  • image-20200826134718606
  • image-20200826134800726

事務(wù)提交

日常
  • image-20200826135550088
加鎖
  • 通俗點講,watch命令就是標(biāo)記一個鍵谨读,如果標(biāo)記了一個鍵局装, 在提交事務(wù)前如果該鍵被別人修改過,那事務(wù)就會失敗劳殖,這種情況通愁砩校可以在程序中重新再嘗試一次

    • 首先標(biāo)記了鍵balance,然后檢查余額是否足夠哆姻,不足就取消標(biāo)記宣增,并不做扣減; 足夠的話矛缨,就啟動事務(wù)進行更新操作
    • 如果在此期間鍵balance被其它人修改爹脾, 那在提交事務(wù)(執(zhí)行exec)時就會報錯帖旨, 程序中通常可以捕獲這類錯誤再重新執(zhí)行一次灵妨,直到成功
  • image-20200826135626627

主從復(fù)制

  1. 6379,6380啟動解阅,先各自先獨立

  2. 主寫

  3. 從讀

  4. image-20200826135752167

JedisPool

獲取Jedis實例需要從JedisPool中獲取

用完Jedis實例需要返還給JedisPool

如果Jedis在使用過程中出錯,則也需要還給JedisPool

案例

JedisPoolUtil
  • image-20200826141642380
JedisPool.getResource()
  • image-20200826141553090

配置總結(jié)all

JedisPool的配置參數(shù)大部分是由JedisPoolConfig的對應(yīng)項來賦值的泌霍。
  1. maxActive:控制一個pool可分配多少個jedis實例货抄,通過pool.getResource()來獲取朱转;如果賦值為-1蟹地,則表示不限制;如果pool已經(jīng)分配了maxActive個jedis實例藤为,則此時pool的狀態(tài)為exhausted

  2. maxIdle:控制一個pool最多有多少個狀態(tài)為idle(空閑)的jedis實例

  3. whenExhaustedAction:表示當(dāng)pool中的jedis實例都被allocated完時怪与,pool要采取的操作;

    默認有三種:

    • WHEN_EXHAUSTED_FAIL:表示無jedis實例時缅疟,直接拋出NoSuchElementException
    • WHEN_EXHAUSTED_BLOC:則表示阻塞住分别,或者達到maxWait時拋出JedisConnectionException;
    • WHEN_EXHAUSTED_GROW:則表示新建一個jedis實例存淫,也就說設(shè)置的maxActive無用茎杂;
  4. maxWait:表示當(dāng)borrow一個jedis實例時,最大的等待時間纫雁,如果超過等待時間,則直接拋JedisConnectionException倾哺;

  5. testOnBorrow:獲得一個jedis實例的時候是否檢查連接可用性(ping())轧邪;如果為true,則得到的jedis實例均是可用的羞海;

  6. testOnReturn:return 一個jedis實例給pool時忌愚,是否檢查連接可用性(ping())

  7. testWhileIdle:如果為true,表示有一個idle object evitor線程對idle object進行掃描却邓,如果validate失敗硕糊,此object會被從pool中drop掉;這一項只有在timeBetweenEvictionRunsMillis大于0時才有意義腊徙;

  8. timeBetweenEvictionRunsMillis:表示idle object evitor兩次掃描之間要sleep的毫秒數(shù)简十;

  9. numTestsPerEvictionRun:表示idle object evitor每次掃描的最多的對象數(shù);

  10. minEvictableIdleTimeMillis:表示一個對象至少停留在idle狀態(tài)的最短時間撬腾,然后才能被idle object evitor掃描并驅(qū)逐螟蝙;這一項只有在timeBetweenEvictionRunsMillis大于0時才有意義;

  11. softMinEvictableIdleTimeMillis:在minEvictableIdleTimeMillis基礎(chǔ)上民傻,加入了至少minIdle個對象已經(jīng)在pool里面了胰默。如果為-1场斑,evicted不會根據(jù)idle time驅(qū)逐任何對象。如果minEvictableIdleTimeMillis>0牵署,則此項設(shè)置無意義漏隐,且只有在timeBetweenEvictionRunsMillis大于0時才有意義;

  12. lifo:borrowObject返回對象時奴迅,是采用DEFAULT_LIFO(last in first out青责,即類似cache的最頻繁使用隊列),如果為False半沽,則表示FIFO隊列爽柒;

  13. 其中JedisPoolConfig對一些參數(shù)的默認設(shè)置如下:
    testWhileIdle=true
    minEvictableIdleTimeMills=60000
    timeBetweenEvictionRunsMillis=30000
    numTestsPerEvictionRun=-1

Redis集群(簡略)

是什么

  • Redis集群實現(xiàn)了對Redis的水平擴容,即啟動N個redis節(jié)點者填,將整個數(shù)據(jù)庫分布存儲在這N個節(jié)點中浩村,每個節(jié)點存儲總數(shù)據(jù)的1/N
  • Redis集群通過分區(qū)(partition)來提供一定程度的可用性(availability):即使集群中有一部分節(jié)點失效或者無法進行通訊,集群也可以繼續(xù)處理命令請求

集群配置

redis cluster配置修改

  • cluster-enabled yes 打開集群模式
  • cluster-config-file node-6379.conf 設(shè)定節(jié)點配置文件名
  • cluster-node-timeout 15000 設(shè)定節(jié)點失聯(lián)時間占哟,超過該時間(毫秒)心墅,集群自動進行主從切換

整合redis實例

  • cd /opt/redis-6.0.6/src
  • ./redis-trib.rb create --replicas 1 xxx:6379 xxx:6380 xxx:6381

集群分配規(guī)則

  • 一個集群至少要有三個節(jié)點
  • 選項 --replicas 1 表示我們希望為集群中的每個主節(jié)點創(chuàng)建一個從節(jié)點
  • 分配原則盡量保證每個主數(shù)據(jù)庫運行在不同的IP地址,每個從庫和主庫不再一個IP地址上

什么是slots

  • 一個Redis集群包含16384個插槽(hash slot)榨乎,數(shù)據(jù)庫中每個鍵都屬于這16384個插槽的其中一個怎燥,集群使用公式CRC16(key) % 16384 來計算鍵key屬于哪個槽,其中CRC16(key)用于計算鍵key的CRC16校驗和

  • 集群中的每個節(jié)點負責(zé)處理一部分插槽蜜暑,舉個例子铐姚,如果一個集群可以有主節(jié)點,其中:

    • 節(jié)點A負責(zé)處理0至5500號插槽
    • 節(jié)點B負責(zé)處理5501號至11000號插槽
    • 節(jié)點C負責(zé)處理11001號至16383號插槽

集群常用指令

  • 集群模式下啟動客戶端: redis-cli -c -p 6379
  • 查看集群信息 :cluster nodes
  • 計算鍵key應(yīng)該被放置在哪個槽上: CLUSTER KEYSLOT <key>
  • 返回槽slot目前包含的鍵值對數(shù)量:CLUSTER COUNTKEYSINSLOT <slot>
  • 返回count個slot槽中的鍵:CLUSTER GETKEYSINSLOT <slot> <count>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末肛捍,一起剝皮案震驚了整個濱河市隐绵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拙毫,老刑警劉巖依许,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異缀蹄,居然都是意外死亡峭跳,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進店門缺前,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蛀醉,“玉大人,你說我怎么就攤上這事衅码≈颓罚” “怎么了?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵肆良,是天一觀的道長筛璧。 經(jīng)常有香客問我逸绎,道長,這世上最難降的妖魔是什么夭谤? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任棺牧,我火速辦了婚禮,結(jié)果婚禮上朗儒,老公的妹妹穿的比我還像新娘颊乘。我一直安慰自己,他們只是感情好醉锄,可當(dāng)我...
    茶點故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布乏悄。 她就那樣靜靜地躺著,像睡著了一般恳不。 火紅的嫁衣襯著肌膚如雪檩小。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天烟勋,我揣著相機與錄音规求,去河邊找鬼。 笑死卵惦,一個胖子當(dāng)著我的面吹牛阻肿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播沮尿,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼丛塌,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了畜疾?” 一聲冷哼從身側(cè)響起姨伤,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎庸疾,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體当编,經(jīng)...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡届慈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了忿偷。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片金顿。...
    茶點故事閱讀 40,567評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖鲤桥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤马绝,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站播揪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏筒狠。R本人自食惡果不足惜猪狈,卻給世界環(huán)境...
    茶點故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望辩恼。 院中可真熱鬧雇庙,春花似錦、人聲如沸灶伊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽聘萨。三九已至竹椒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間匈挖,已是汗流浹背碾牌。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留儡循,地道東北人舶吗。 一個月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像择膝,于是被迫代替她去往敵國和親誓琼。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,585評論 2 359