Redis--回顧提要

来源:https://www.cnblogs.com/letscrazy/archive/2022/12/04/lets_crazy_redis.html
-Advertisement-
Play Games

一、寫在前 知識學了就忘!不用就忘!我太健忘!特此記錄!用於複習打卡!Redis乾就完事了! 二、來辣! Redis做非同步隊列:一般list結構做隊列,rpush生產消息,lpop消費消息,當lpop沒有消息的時候,要適當sleep一會兒;如果不sleep,就用blpop,會阻塞;生產一次消費多次, ...


一、寫在前

知識學了就忘!不用就忘!我太健忘!特此記錄!用於複習打卡!Redis乾就完事了!

二、來辣!

  1. Redis做非同步隊列:一般list結構做隊列,rpush生產消息,lpop消費消息,當lpop沒有消息的時候,要適當sleep一會兒;如果不sleep,就用blpop,會阻塞;生產一次消費多次,使用pub/sub主題訂閱模式,可以實現1:N的消息隊列,缺點:消費者下線的時候,消息會丟。

  2. 延時隊列:使用sortedset,拿時間戳作為score,消息內容作為key調用zadd來生產消息,消費者用zrangebyscore指令獲取N秒前的數據輪詢處理。

  3. Redis分散式鎖:拿setnx來爭搶鎖,搶到之後再用expire給縮加一個過期時間防止鎖忘記釋放。如果在setnx之後,expire之前進程意外crash或者重要維護了,咋辦:鎖永遠得不到釋放,咋辦:set指令有複雜的參數,可以把setnx和expire合成一條指令執行噠。

  4. memched與redis區別:redis支持string,list,set,zset,hash,HyperLogLog,Geo,Pub/Sub。memcached支持簡單字元串;redis更快;redis支持持久化。

  5. redis沒有使用一致性hash,而是引入哈希槽的概念:redis集群有16384個哈希槽,每個key通過CRC16校驗後對16384取模來決定放哪個槽,集群的每一個節點負責一部分hash槽。

  6. redis集群方案什麼情況下會導致整個集群不可用:三個節點的集群,在沒有複製模型的情況下,如果B節點掛了,整個集群會因為缺少5501-11000這個範圍的槽而不可用。

  7. 為什麼這麼快:完全基於記憶體;數據結構簡單,對數據操作簡單;採用單線程,避免不必要的上下文切換和競爭條件,也不存在多進程和多線程導致的切換而消耗CPU,不存在加鎖釋放鎖操作,也不會死鎖;使用I/O復用模型,非阻塞IO;自己構建了VM機制,一般的系統調用系統函數的話,會浪費一定的時間去移動和請求。

  8. 場景:計數器;緩存;session緩存;全頁緩存(FPC);消息隊列(發佈訂閱);分散式鎖(setnx或RedLock);set交集、並集找共同好友;zset可以實現有序,排行榜等功能。

  9. RDB:預設,將記憶體中的數據以快照方式保存到硬碟,產生dump.rdb文件。優點:只有一個文件,方便持久化;容災性好,一個文件可以保存到安全的磁碟。性能最大化,fork子進程完成寫,主進程繼續處理命令,IO最大化,主進程沒有任何IO,高性能。缺點:安全性低,如果持久化之間掛了,丟一部分數據。

  10. AOF:append-only file。兩種方式同時開啟,恢複數據會先用AOF。優點:數據安全,可以配置appendfsync屬性,有always,每進行一次命令就記錄一次;通過append模式寫文件,即時中途宕機,可以通過redis-check-aof工具解決一致性問題;rewrite模式,(文件過大時會對命令進行合併重寫),沒有rewrite之前,可以刪除某些命令,(比如誤操作的flushall)。缺點:文件大,恢復慢;數據集大的時候,比rdb啟動效率低。

  11. 當做緩存時如何擴容:使用一致性哈希實現動態的擴容縮容。

  12. 當做持久化存儲使用,必須使用固定的keys-to-nodes映射關係,節點的數量一旦確定就不能變。

  13. 過期鍵的刪除策略:1)定時過期:每個設置過期時間的key都要創建一個定時器,到過期時間就會立即清除。立即清除,對記憶體友好。但會占用大量的cpu資源,影響響應時間和吞吐量。2)惰性過期:當訪問的時候,才去判斷是否已過期,過期就清除。可最大化節省cpu資源,對記憶體不友好;但是極端情況下,可能出現大量過期的key未被清理,占用大量記憶體。3)定期過期:折中方案,每隔一定時間,會掃描一定數量的expires字典中一定數量的key,並清除其中過期的。(expires字典會保存所有設置了過期時間的key的過期時間數據,其中,key是指向鍵空間中某個鍵的指針,value是該鍵的毫秒精度的UNIX時間戳表示的過期時間。鍵空間是指redis中存儲的所有鍵。)預設同時使用了惰性過期和定期過期。

  14. expire設置過期時間,persist設置永久有效。

  15. 記憶體淘汰策略:(用於緩存的記憶體不足時,怎麼處理新寫入且需要額外申請空間的數據)。1)noevication,禁止淘汰,寫入會報錯。2)allkeys-lru:全鍵空間內,移除最近最少使用的(常用)。3)allkeys-random:隨機移除。4)volatile-lru:設置了過期的鍵空間中,移除最近最少使用的。5)volatile-random:隨機移除。6)volatile-ttl:設置了過期的鍵空間中,優先移除有更早過期時間的key。

  16. 記憶體優化:合理利用集合類型,小的k/v可以以更緊湊的方式存放,儘可能使用散列表(hashes),散列表使用的記憶體小。儘可能將數據抽象到一個散列表,比如用戶,的名稱,密碼等所有信息存儲到一個散列表。

  17. 事務:事務中的所有命令都會被序列化,就是一次性、順序性、排他性的執行一個隊列中的一系列命令。三個階段:事務開始MULTI-命令入隊-事務執行EXEC。執行過程中,如果服務端收到EXEC、DISCARD、WATCH、MULTI之外的請求,會把請求放入對列中排隊。WATCH命令是一個樂觀鎖,可以為redis事務提供CAS行為。可以監控一個或多個鍵,一旦其中有一個鍵被修改、刪除,之後的事務不會被執行,監控一直持續到EXEC命令。MULTI用於開啟事務,總是返回OK,開啟後,可以繼續向伺服器發送任意多行命令,不會立即執行,被放隊列,當EXEC被調用時才執行。EXEC用於執行事務塊內的命令,返回所有事務塊中命令的返回值,按命令執行的先後順序排序,當操作被打斷,返回空值。DISCARD可以清空事務列表,並放棄執行事務,並且客戶端會從事務狀態中退出。UNWATCH可以取消watch對所有key的監控。

  18. redis的事務總是支持ACID中的一致性和隔離性,其他不支持。當運行在_AOF_持久化模式下,且appendfsyn選項為always時,事務也具有 耐久性。

  19. 單條命令是原子性執行的,基於Lua腳本,可以保證腳本內命令一次性、順序執行完成。但是事務不保證原子性,且沒有回滾。事務的任意命令執行失敗,其餘命令也會繼續執行。

三、寫在後

只是簡要知識點概括,看到就能回憶起相關內容為最妙~~直接評論打卡,開整!!!

作者: letscrazy

出處: https://www.cnblogs.com/letscrazy/

關於作者:letscrazy

本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出, 原文鏈接 如有問題, 可郵件([email protected])咨詢.


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

-Advertisement-
Play Games
更多相關文章
  • Hello,大家好,我是阿粉,對接文檔是每個開發人員不可避免都要寫的,友好的文檔可以大大的提升工作效率。 阿粉最近將項目的文檔基於 Gitbook 和 Gitlab 的 Webhook 功能的在內網部署了一套實時的,使用起來特方便了。跟著阿粉的步驟,教你部署自己的文檔服務。 步驟 安裝 Node 和 ...
  • 序列的修改、散列和切片 from array import array import reprlib, math, numbers from functools import reduce from operator import xor from itertools import chain # ...
  • JZ26 樹的子結構 描述 輸入兩棵二叉樹A,B,判斷B是不是A的子結構。(我們約定空樹不是任意一個樹的子結構) 假如給定A為{8,8,7,9,2,#,#,#,#,4,7},B為{8,9,2},2個樹的結構如下,可以看出B是A的子結構 題解1 深度遍歷 思路 既然是要找到A樹中是否有B樹這樣子樹,如 ...
  • 1、Seata 簡介 1.1 Seata是什麼 Seata 是一款開源的分散式事務解決方案,致力於提供高性能和簡單易用的分散式事務服務。Seata 將為用戶提供了 AT、TCC、SAGA 和 XA 事務模式,為用戶打造一站式的分散式解決方案。AT模式是阿裡首推的模式,阿裡雲上有商用版本的GTS(Gl ...
  • 從藍牙模塊的不同的分類方式上去梳理藍牙模塊的類型,詳細的從分類方式的角度去瞭解藍牙模塊所具備一些特性和功能。 ...
  • 題目:監控記憶體剩餘空間,小於10M則發出信號,給出錯誤代碼,要求調試,如下: #!/bin/bash #mem monitor mem_size=$(free | awk ‘/mem /{print $4}’) if [$mem_size -le 102400] then echo “warning ...
  • 前言 在CAN協議中,CAN匯流排除了眾多優秀的特點外,還具有錯誤監測功能、錯誤通知功能、和錯誤恢復功能、故障封閉功能。下麵系統瞭解以下CAN匯流排上的錯誤幀。 ###錯誤檢測 所有ECU均有可以檢測錯誤的功能。 ###錯誤通知 檢測出錯誤的ECU會立即通知其他ECU ###錯誤恢復 正常發送消息的EC ...
  • 一、塊設備簡介 塊設備驅動是存儲設備驅動,塊設備驅動相比字元設備驅動的主要區別如下: ①、塊設備只能以塊為單位進行讀寫訪問,塊是 linux 虛擬文件系統(VFS)基本的數據傳輸單位。字元設備是以位元組為單位進行數據傳輸的,不需要緩衝。 ②、塊設備在結構上是可以進行隨機訪問的,對於這些設備的讀寫都是按 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...