redis詳解(持續更新)

来源:https://www.cnblogs.com/jzbwust/archive/2017/12/26/8118147.html
-Advertisement-
Play Games

Redis概述 Redis是一種key-value型資料庫,運行於記憶體中,與它相似的資料庫有memcached,現在基本被Redis替代。 Redis適用場景 我們要與傳統的關係型資料庫進行對比才能更好的瞭解與使用Redis 1.高併發場景, redis是個單線程的程式對於純記憶體操作如hash查找可 ...


Redis概述

Redis是一種key-value型資料庫,運行於記憶體中,與它相似的資料庫有memcached,現在基本被Redis替代。

 

Redis適用場景

我們要與傳統的關係型資料庫進行對比才能更好的瞭解與使用Redis

1.高併發場景, redis是個單線程的程式對於純記憶體操作如hash查找可達到每秒百萬次的數量級。

   比如說點贊這個業務,我們在redis中可以這樣用set(關於redis的數據結構下文會詳述)來存,key就是被點贊實體(如問題或評論)的id或唯一標誌,主動點贊的用戶ID都存在這個set裡面, 執行點贊時把用戶ID存在這個set裡面就行了。 我們再看看MySQL里怎麼做,被點贊實體的ID和點贊實體的ID就是一條記錄,第一點由於鎖的存在讀取點贊人數時會對錶加讀鎖,這時候就不能添加記錄,第二點是基於磁碟的,讀寫速率都很慢。

2.列舉最新列表

  redis中可使用list這個數據結構,用來存儲最新的n條記錄(lpush,和trim配合使用),每回取就使用lrange命令就行 。我們再看看MySQL在裡面怎麼做,如下是一個典型的查詢語句:select * from table where.... order by time desc limit n ,隨著數據增多只會越來越慢。

3.排行榜

  redis提供一種數據結構sortset,優先隊列即裡面的元素可以按分值來排序。常用操作zadd等,由於這些信息也是常常跟新的基於磁碟的MySQL顯然性能不夠好。

4.消息隊列,阻塞隊列 

 redis提供阻塞隊列這種數據數據結構常用,命令如brpop。

5.設置過期數據

 redis,的K-V數據結構提供數據過期值,比如對於驗證碼,緩存(基於緩存計劃會再寫一篇詳細的文章)

綜上,在實際開發中我們常常是將MySQL和Redis一起結合來使用的,不同場景使用不同的工具。

 

Redis 常用數據結構及命令 

  • 雙向列表List:    lpush,lpop,brpop,lrange,linsert等等
  • 無序集合Set:     scard,sdiff(A中有B中沒的),smembers,sinter(交集)
  • 有序集合SortedSet:   zadd,zscore
  • 單一數值KV:   set,setex
  • 存儲對象Hash:  hset,hget    

更多詳細信息請見https://redis.io/commands

 

Redis部分數據結構的底層設計

1.動態字元串SDS

     我們執行一個命令,set msg "hello" ,那麼底層就是產生兩個SDS對象。 接下來我們看看SDS與C語言的傳統字元串有什麼區別(Redis使用C語言來編寫)。SDS實則是一個結構體:如下圖

 

 這個結構體有一個位元組數組,當前字元長度,可以數組長度(free)組成,SDS主要在以下兩方面做了優化

  • C語言若字元串溢出,那麼系統將重新分配記憶體(這個可能執行系統調用)並將內容都複製到另一個數組當中,對於高性能的redis來說這是很耗時間的。SDS則在每一次拼接字元串時判斷空間是否夠大,不夠分配1MB記憶體,夠則分配free大小記憶體。
  • 字元串縮短時記憶體先不回收,而是暫時存起來,減少記憶體重分配次數
  • 二進位安全,使用len判斷字元串是否結束,可保存二進位數據

2.鏈表

  • 雙向無環鏈表

3.字典

  • 廣泛用於redis各種功能,一個字典有兩個哈希表,一個平時使用一個rehash時使用
  • hash衝突時一個索引上的多個鍵連接成一個單項列表(加在表頭)
  • 根據負載因數(記憶體與時間的平衡,已保存節點數/哈希表大小,臨界值分別是0.1,5)決定是否rehash。採用漸進式rehash(保證性能,和寫時複製技術思路相似),主要為以下幾個步驟
        • 為上面說的另一個hash h1表分配空間
        • 字典內維持一個索引計數器,每次執行添加,刪除,查找或更新時除指定操作後還將相應鍵值對rehash到h1上,直至操作完成(每個哈希表會標有已存在的實體數)

     

Redis持久性

Redis提供兩種持久化方式:快照(RDB),和AOF(記錄每一個操作)

  • RDB每隔一個特定的時間保存那個時間點的一個數據快照
  • AOF保存每一個操作,Redis重啟時逐條執行每個操作重建原來的數據
  • 兩種持久化方式可以同時存在,Redis重啟時優先使用AOF

 

RDB

原理

  • Redis調用Fork()創建子進程
  • 子進程將數據寫入到一個RDB文件里
  • 替換舊的RDB文件
  • 文件存放在當前目錄的dump.rdb文件內,可以通過redis.conf修改文件名及目錄

 

缺點

  • 由於每隔一段時間執行,,可能會造成數據丟失。
  • 使用Fork()創建子進程時,如果數據量很大Fork()造作會造成Redis暫停服務幾秒鐘。

優點

  • RDB文件易於做備份,數據量大時啟動速度快

常見配件信息(redis.conf中)

 

AOF

優點

  • 丟失數據的可能性減少

 缺點

  • AOF文件比RDB大

 

未完待續。。。

參考資料

https://www.zhihu.com/question/19764056

https://segmentfault.com/a/1190000002906345

http://blog.csdn.net/hguisu/article/details/8836819

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 很無語,CentOS居然php版本才5.1.6,很多開源的CMS無法安裝。 查看php版本命令: #php -v 下麵的命令是刪除不幹凈的 #yum remove php 因為使用這個命令以後再用 #php -v 還是會看到有版本信息的。。。。。 必須強制刪除,使用下麵命令查看全部php軟體包 #r ...
  • echo:Display a line of text,預設會加換行。 -e:escape轉義特殊字元 -n:不要在最後自動換行 no LR cp:文件複製,規則:只有最後一個為目標,複製一個文件到一個文件 或者 多個文件到一個目錄! -r:遞歸複製目錄 -i:互動式顯示覆制 -f:強制複製,覆蓋 ...
  • [20171225]變態的windows批處理4.txt--//昨天學習windows 批處理的echo &.使用它可以實現類似回車換行的功能.例子:1.echo &.R:\>echo 1111 & echo 222211112222--//但是如果寫成如下:R:\>echo 1111 & echo ...
  • 一、yum 簡介 yum,是Yellow dog Updater, Modified 的簡稱,是杜克大學為了提高RPM 軟體包安裝性而開發的一種軟體包管理器。起初是由yellow dog 這一發行版的開發者Terra Soft 研發,用python 寫成,那時還叫做yup(yellow dog up ...
  • http://hadoop.apache.org/docs/r2.9.0/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithQJM.html 背景 在Hadoop 2.0.0以前,在一個HDFS集群中NameNode存在單點故障。每個集群 ...
  • http://hadoop.apache.org/docs/r2.9.0/hadoop-project-dist/hadoop-hdfs/Federation.html Background HDFS有兩個主要的層: Namespace 由目錄、文件和塊組成 它支持所有的文件系統命名空間操作,比如, ...
  • 這邊將日誌信息記入資料庫時,發現資料庫日誌具體時間丟失,只保留了日期。 我這邊環境是(SRPINGMVC+Mybatis,mysql版本5.6.28以上),java層使用類型為java.util.Date,數據欄位類型為date 參考了一些網上的說法,基本描述是說: date:只有日期,沒有時間,2 ...
  • 需要查兩個表之間的差集 首先,想到的是主鍵直接not in 好吧!這個是可以,但是數據多了的話,想到這個查詢的邏輯有點受不住 於是再改為下麵的這樣: 利用了left join的,然後進行對比,並且利用where進行篩選。 後面也在網上找了這條: 概念上與第二條同理。 好吧! 回顧了一下left jo ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...