Redis掃盲

Redis

緩存中間件

基礎篇

鍵值數據庫 key Value

是NoSql數據庫

非結構化、無關聯的、非SQL、BASE(無法滿足ACID)

命令執行是單線程,符合原子性。

低延遲、速度塊(基于內存,IO多路復用,良好的編碼)

支持數據的持久化(定期把數據寫到磁盤)

支持主從集群、分片集群

支持多語言客戶端

一、常用命令
1.停止服務
停止 Redis 服務
sudo systemctl stop redis檢查服務狀態
sudo systemctl status redis
2.啟動服務
redis-server#指定配置文件啟動
redis-server redis.conf
3.查看運行狀態
ps -ef | grep redis
4.打開客戶端
redis-cli -a 200112
5.通常命令
#查看符合模板的所有key
keys 
#刪除指定的一個key
DEL
#判斷key是否存在
exists
#給key設置一個有效期
EXPIRE
#查看key的剩余有效期
TTL
二、常見數據類型

Redis 支持多種數據類型,每種類型針對不同的使用場景設計,以下是常見的五種核心數據類型及其特點:


String(字符串)

? 特點:二進制安全的字符串,可存儲文本、序列化數據或數字。

? 常用命令:

? SET key value / GET key

? INCR key(原子性遞增)

? MSET / MGET(批量操作)

? 應用場景:

? 緩存HTML片段、用戶會話(Session)。

? 計數器(如文章閱讀量)。

? 分布式鎖(通過 SETNX)。

最大是512M

SET、GET、MSET、MGET。增減刪除

INCR。讓整型key+1

java對象序列化為json字符串,然后存儲。

Hash(哈希表)

? 特點:鍵值對集合,適合存儲對象。

? 常用命令:

? HSET key field value / HGET key field

? HGETALL key(獲取所有字段和值)

? HINCRBY(字段數值增減)

? 應用場景:

? 存儲用戶信息(如用戶ID為Key,字段為姓名、年齡等)。

? 商品詳情頁的屬性存儲。

可以對字段做CRUD

List(列表)

? 特點:有序的字符串列表,支持雙向操作(類似雙向隊列)。

? 常用命令:

? LPUSH key value / RPOP key(左右插入和彈出)

? LRANGE key start end(范圍查詢)

? BLPOP(阻塞式彈出)

? 應用場景:

? 消息隊列(生產者-消費者模型)。

? 最新消息排行(如朋友圈動態)。

? 歷史記錄(如用戶瀏覽日志)。

Set(集合)

? 特點:無序且唯一的字符串集合,支持交并差運算。

? 常用命令:

? SADD key member / SMEMBERS key

? SINTER key1 key2(交集)

? SISMEMBER key member(判斷存在性)

? 應用場景:

? 標簽系統(如文章標簽)。

? 共同好友(交集運算)。

? 去重(如UV統計)。


Sorted Set(有序集合)

? 特點:成員關聯一個分數(score),按分數排序且唯一。

? 常用命令:

? ZADD key score member / ZRANGE key start end

? ZRANK key member(獲取排名)

? ZRANGEBYSCORE(按分數范圍查詢)

? 應用場景:

? 排行榜(如游戲分數排名)。

? 延遲隊列(用時間戳作為分數)。

? 范圍查詢(如價格區間篩選)。


其他擴展類型(需Redis模塊支持)
? Bitmaps:通過位操作實現布隆過濾器、用戶簽到。

? HyperLogLog:基數統計(如UV去重)。

? Streams:消息流(類似Kafka,用于時序數據)。


選擇依據
? 讀寫模式:高頻寫入用List,需排序用Sorted Set。

? 查詢需求:精確查詢用Hash,范圍查詢用Sorted Set。

? 數據量:小對象用String,大對象用Hash分字段存儲。

合理利用這些類型能顯著提升Redis性能和資源利用率。

常見面試題

一、緩存穿透

緩存穿透說簡單點就是大量請求的 key 是不合理的,根本不存在于緩存中,也不存在于數據庫中。這就導致這些請求直接到了數據庫上,根本沒有經過緩存這一層,對數據庫造成了巨大的壓力,可能直接就被這么多請求弄宕機了

解決辦法

1.緩存無效 key

表名:列名:主鍵名:主鍵值作為key

2.布隆過濾器

把所有可能存在的請求的值都存放在布隆過濾器中,當用戶請求過來,先判斷用戶發來的請求的值是否存在于布隆過濾器中。不存在的話,直接返回請求參數錯誤信息給客戶端,存在的話才會走下面的流程。

3.接口限流

二、緩存擊穿

緩存擊穿中,請求的 key 對應的是 熱點數據,該數據 存在于數據庫中,但不存在于緩存中(通常是因為緩存中的那份數據已經過期)。這就可能會導致瞬時大量的請求直接打到了數據庫上,對數據庫造成了巨大的壓力,可能直接就被這么多請求弄宕機了。

舉個例子:秒殺進行過程中,緩存中的某個秒殺商品的數據突然過期,這就導致瞬時大量對該商品的請求直接落到數據庫上,對數據庫造成了巨大的壓力。

解決辦法

  1. 永不過期(不推薦):設置熱點數據永不過期或者過期時間比較長。
  2. 提前預熱(推薦):針對熱點數據提前預熱,將其存入緩存中并設置合理的過期時間比如秒殺場景下的數據在秒殺結束之前不過期。
  3. 加鎖(看情況):在緩存失效后,通過設置互斥鎖確保只有一個請求去查詢數據庫并更新緩存
三、緩存雪崩

緩存在同一時間大面積的失效,導致大量的請求都直接落到了數據庫上,對數據庫造成了巨大的壓力。 這就好比雪崩一樣,摧枯拉朽之勢,數據庫的壓力可想而知,可能直接就被這么多請求弄宕機了

緩存中的大量數據在同一時間過期,這個時候突然有大量的請求需要訪問這些過期的數據。這就導致大量的請求直接落到數據庫上,對數據庫造成了巨大的壓力。

針對 Redis 服務不可用的情況

  1. Redis 集群:采用 Redis 集群,避免單機出現問題整個緩存服務都沒辦法使用。Redis Cluster 和 Redis Sentinel 是兩種最常用的 Redis 集群實現方案
  2. 多級緩存:設置多級緩存,例如本地緩存+Redis 緩存的二級緩存組合,當 Redis 緩存出現問題時,還可以從本地緩存中獲取到部分數據。

針對大量緩存同時失效的情況

  1. 設置隨機失效時間(可選):為緩存設置隨機的失效時間,例如在固定過期時間的基礎上加上一個隨機值,這樣可以避免大量緩存同時到期,從而減少緩存雪崩的風險。
  2. 提前預熱(推薦):針對熱點數據提前預熱,將其存入緩存中并設置合理的過期時間,比如秒殺場景下的數據在秒殺結束之前不過期。
  3. 持久緩存策略(看情況):雖然一般不推薦設置緩存永不過期,但對于某些關鍵性和變化不頻繁的數據,可以考慮這種策略

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/80655.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/80655.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/80655.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【FMMT】基于模糊多模態變壓器模型的個性化情感分析

遇到很難的文獻看不懂,不應該感到氣餒,應該激動,因為外審估計也看不太懂,那么學明白了可以嚇唬他 缺陷一:輸入依賴性與上下文建模不足?? ??缺陷描述??: 傳統自注意力機制缺乏因果關系,難以捕捉序列歷史背景多模態數據間的復雜依賴關系未被充分建模CNN/RNN類模型在…

Qt Creator 配置 Android 編譯環境

Qt Creator 配置 Android 編譯環境 環境配置流程下載JDK修改Qt Creator默認android配置文件修改sdk_definitions.json配置修改的內容 Qt Creator配置 異常處理刪除提示占用編譯報錯連接安卓機調試APP閃退無法進入 debug 斷點 環境 Qt Creator 版本 qtcreator-16.0.1Win10 嗯, …

使用聊天模型和提示模板構建一個簡單的 LLM 應用程序

官方教程 官方案例 在上面的鏈接注冊后,請確保設置您的環境變量以開始記錄追蹤 export LANGSMITH_TRACING"true" export LANGSMITH_API_KEY"..."或者,如果在筆記本中,您可以使用以下命令設置它們 import getpass imp…

React vs Vue:點擊外部事件處理的對比與實現

React vs Vue:點擊外部事件處理的對比與實現 在 Web 應用中,“點擊外部事件監聽”是一種常見需求,典型應用如:點擊彈窗外部關閉彈窗、點擊下拉菜單外關閉菜單。雖然在 React 和 Vue 中實現的原理類似——都是通過監聽 document 的…

3335. 字符串轉換后的長度 I

3335. 字符串轉換后的長度 I class Solution:def lengthAfterTransformations(self, s: str, t: int) -> int:# 大質數mod 10**97# 創建一個長度為26的數組cnt,對應26個小寫字母cnt [0]*26# 計算出s中26個字符分別有多少個for ch in s:cnt[ord(ch)-ord(a)] 1f…

Java詳解LeetCode 熱題 100(15):LeetCode 189. 輪轉數組(Rotate Array)詳解

文章目錄 1. 題目描述2. 理解題目3. 解法一:使用額外數組3.1 思路3.2 Java代碼實現3.3 代碼詳解3.4 復雜度分析3.5 適用場景 4. 解法二:環狀替換法(原地算法)4.1 思路4.2 Java代碼實現4.3 代碼詳解4.4 復雜度分析4.5 陷阱與注意事…

數據治理域——日志數據采集設計

摘要 本文主要介紹了Web頁面端日志采集的設計。首先闡述了頁面瀏覽日志采集,包括客戶端日志采集的實現方式、采集內容及技術亮點。接著介紹了無線客戶端端日志采集,包括UserTrack的核心設計、移動端與瀏覽器端采集差異以及典型應用場景崩潰分析。最后探…

PYTHON訓練營DAY24

# SO代碼我們的感情好像跳樓機 # 元組創建時,可以省略括號:my_tuple4 10, 20, thirty # 字符串要加“ ” 元組 一、創建 my_tuple1 (1, 2, 3) my_tuple2 (a, b, c) my_tuple3 (1, hello, 3.14, [4, 5]) # 可以包含不同類型的元素 print(my_tupl…

超聲波傳感器模塊

歡迎來到 破曉的歷程的 博客 ??不負時光,不負己?? 文章目錄 1.HC-SR04介紹2.HC-SR04原理介紹2.1原理概述3.2原理詳解 4驅動代碼編寫4.1寫前思考4.2硬件連線 5.總結hcsr04.hhcsr04.c 1.HC-SR04介紹 超聲波傳感器有很多種類的型號:HC-SR04、UC-025、…

《Effective Python》第2章 字符串和切片操作——深入理解Python 中的字符數據類型(bytes 與 str)的差異

引言 本篇博客基于學習《Effective Python》第三版 Chapter 2: Strings and Slicing 中的 Item 10: Know the Differences Between bytes and str 的總結與延伸。在 Python 編程中,字符串處理是幾乎每個開發者都會頻繁接觸的基礎操作。然而,Python 中的…

py7zr解壓文件時報錯CrcError(crc32, f.crc32, f.filename)

報錯信息 Traceback (most recent call last):File "/home/hp/project/test/file_util.py", line 130, in extract_archive_7zarchive.extract(targets[fixed_file], pathoutput_dir, recursiveTrue)File "/home/hp/miniconda3/envs/celery/lib/python3.10/sit…

物理:由基本粒子組成的個體能否提煉和重組?

個體差異源于基本粒子組合的復雜性與隨機性,這一假設若成立,確實可能為生物醫學帶來革命性突破——但需要突破技術、理論與系統層級的多重壁壘。以下從科學邏輯與技術路徑展開分析: 一、隨機組合中的共性與穩定結構 1. 自然界的自組織規律 涌現性(Emergence):盡管粒子組…

動態路由EIGRP的配置

動態路由EIGRP的配置 動態路由EIGRP:增強內部網關協議 為何收斂快、不成環? 路由計算的無環路和路由的收斂速度是路由計算的重要指標。EIGRP協議由于使用了DUAL算法,使得EIGRP協議在路由計算中不可能有環路路由產生,同時路由計…

組合問題(多條件)

39. 組合總和 - 力扣&#xff08;LeetCode&#xff09; class Solution { private:vector<vector<int>>result;vector<int>path;void backtracking(vector<int>& candidates, int target,int sum,int startIndex){if(sum>target){return;}if(…

SimScape物理建模實例2--帶控制的單質量彈簧阻尼系統

模型下載&#xff1a; 基于simscape&#xff0c;單質量系統帶位置控制資源-CSDN文庫 在實例1中&#xff0c;我們搭建了不帶控制的單質量彈簧阻尼系統&#xff0c;該系統沒有外界力量介入&#xff0c;只有彈簧的初始彈力&#xff0c;帶著彈簧使勁彈來彈去。 SimScape物理建模實…

OpenAI Text 模型與 Chat 模型調用實戰指南:從基礎配置到創意花店命名

在 AI 應用開發的浪潮中&#xff0c;OpenAI 的大語言模型成為開發者實現創新功能的得力工具。其中&#xff0c;Text 模型和 Chat 模型作為核心接口&#xff0c;被廣泛應用于文本生成、對話交互等場景。本文將以 “為花店起名” 為實際需求&#xff0c;手把手教你如何安全調用這…

網頁常見水印實現方式

文章目錄 1 明水印技術實現1.1 DOM覆蓋方案1.2 Canvas動態渲染1.3 CSS偽元素方案2 暗水印技術解析2.1 空域LSB算法2.2 頻域傅里葉變換3 防篡改機制設計3.1 MutationObserver防護3.2 Canvas指紋追蹤4 前后端實現對比5 攻防博弈深度分析5.1 常見破解手段5.2 進階防御策略6 選型近…

現代化QML組件開發教程

現代化QML組件開發教程 目錄 QML基礎介紹QML項目結構基本組件詳解自定義組件開發狀態與過渡高級主題最佳實踐 QML基礎介紹 什么是QML QML (Qt Meta Language) 是一種聲明式語言&#xff0c;專為用戶界面設計而創建。它是Qt框架的一部分&#xff0c;讓開發者能夠創建流暢、…

C/C++ 程序執行的主要過程

預處理&#xff08;Preprocessing&#xff09; 任務&#xff1a; 處理源代碼中以 # 開頭的預處理指令&#xff0c;包括&#xff1a; 頭文件包含&#xff08;#include&#xff09;&#xff1a;將頭文件&#xff08;如 stdio.h&#xff09;的內容直接插入到源文件中。宏替換&…

時間序列預測建模的完整流程以及數據分析【學習記錄】

文章目錄 1.時間序列建模的完整流程2. 模型選取的和數據集2.1.ARIMA模型2.2.數據集介紹 3.時間序列建模3.1.數據獲取3.2.處理數據中的異常值3.2.1.Nan值3.2.2.異常值的檢測和處理&#xff08;Z-Score方法&#xff09; 3.3.離散度3.4.Z-Score3.4.1.概述3.4.2.公式3.4.3.Z-Score與…