Redis最新入門教程

文章目錄

  • Redis最新入門教程
    • 1.安裝Redis
    • 2.連接Redis
    • 3.Redis環境變量配置
    • 4.入門Redis
      • 4.1 Redis的數據結構
      • 4.2 Redis的Key
      • 4.3 Redis-String
      • 4.4 Redis-Hash
      • 4.5 Redis-List
      • 4.6 Redis-Set
      • 4.7 Redis-Zset
    • 5.在Java中使用Redis
    • 6.緩存雪崩、擊穿、穿透
      • 6.1 緩存雪崩
      • 6.2 緩沖擊穿
      • 6.3 緩沖穿透
      • 6.4 業務可靠性處理
    • 參考

Redis最新入門教程

Redis 是互聯網技術領域中使用最廣泛的存儲中間件,它是 Remote Dictionary Service 三個單詞中加粗字母的組合。它是一個存儲在磁盤上的內存數據庫。數據模型是鍵-值對,但支持許多不同類型的值:Strings, Lists, Sets, Sorted Sets, Hashes

1.安裝Redis

Redis 官方不建議在 windows 下使用 Redis,所以官網沒有 Windows 版本可以下載。但是官方給出了一個在 Windows 下使用Redis的方法:Install Redis on Windows,具體操作就是安裝 WSL,然后在電腦上運行 Ubuntu,大家也可以嘗試。

對于我們本地開發與學習,下載非官方的 Windows 版本就可以。這里推薦兩個 Windows 版本的 Redis 倉庫:

  • 微軟的開源 Windows版本 --> 這個項目已經不再被維護了,最高版本為 3.2.100。
  • redis-windows 項目 --> 借助 GitHub Actions 強大的自動化構建能力,實時編譯最新版本的 Redis for Windows 系統。版本和官方保持一致,推薦👍

note:建議使用 Windows 版本進行本地開發,并按照 Redis 官方指導將其部署在 Linux 上用于生產環境。


安裝流程

  • 下載 Redis Latest for Windows。

    image-20250508112614297

  • 解壓,直接運行項目中的 start.bat 腳本,一鍵啟動。或者使用命令行啟動 redis-server.exe redis.conf

    image-20250508112738342

    note:使用 Redis 時,這個窗口不可以關閉。若想要停止 Redis 服務,直接關閉窗口。

2.連接Redis

Redis 本身就自帶了一個命令行客戶端,可以直接通過 redis-cli 命令來連接 Redis 服務。如下所示,表明連接成功:

image-20250508115228575

這里推薦兩款好用的 Redis 圖形化客戶端,大家可以根據自己喜好下載:

  • AnotherRedisDesktopManager,github 已經有 32k+ 的 star 了。
  • Redis Insight,官方 Redis 數據庫工具。

由于我個人喜歡使用官方版本,所以接下來介紹一下 Redis Insight 的安裝:進入官網 Redis Insight 下載安裝包,然后一直下一步即可安裝成功。第一次打開勾選上 I have read and understood the Terms 點擊 Submit 就好,其他選項(主要是隱私設置以及通知設置)不用勾選。這樣就可以開始使用 Redis Insight了。

3.Redis環境變量配置

每次連接 Redis 都必須到解壓后的目錄,才可以輸入啟動命令。所以通過配置環境變量,解決這一問題。

  • 復制 Redis 的地址。Example: D:\Redis\Redis-8.0.0-Windows-x64-cygwin

    image-20250508140043082

  • 「環境變量」->「系統變量」->「path」->「編輯」->「新建」,粘貼 Redis 路徑。

    image-20250508140553453

這樣在任何位置,打開 cmd 就可以輸入 Redis 的命令了。

  • 啟動 Redis:

    redis-server
    
  • 連接 Redis:

    redis-cli
    

4.入門Redis

4.1 Redis的數據結構

Redis 有 5 種基礎數據結構,String、Hash、List、Set、SortedSet。除此之外,還有 HyperLogLog、Geo、Pub/Sub 等高級數據結構。

  • string(字符串): 基本的數據存儲單元,可以存儲字符串、整數或者浮點數。
  • hash(哈希):一個鍵值對集合,可以存儲多個字段。
  • list(列表):一個簡單的列表,可以存儲一系列的字符串元素。
  • set(集合):一個無序集合,可以存儲不重復的字符串元素。
  • zset(sorted set:有序集合): 類似于集合,但是每個元素都有一個分數(score)與之關聯。
  • 位圖(Bitmaps):位數組,可以對字符串進行位操作。常用于實現布隆過濾器等位操作。
  • 超日志(HyperLogLogs):用于基數統計,可以估算集合中的唯一元素數量。
  • 地理空間(Geospatial):用于存儲地理位置信息,支持地理空間索引和半徑查詢。
  • 發布/訂閱(Pub/Sub):一種消息通信模式,允許客戶端訂閱消息通道,并接收發布到該通道的消息。
  • 流(Streams):用于消息隊列和日志存儲,支持消息的持久化和時間排序。
  • 模塊(Modules):Redis 支持動態加載模塊,可以擴展 Redis 的功能。

4.2 Redis的Key

Redis 鍵命令用于管理 redis 的鍵。Redis 鍵命令的基本語法如下:

COMMAND KEY_NAME
127.0.0.1:6379> set name redis
OK
127.0.0.1:6379> del name
(integer) 1
  • del 命令用來刪除一個鍵值對,(integer) 1 表示執行成功,(integer) 0 表示執行失敗。
  • exists 命令用來測試一個鍵值對是否存在,(integer) 1 表示存在,(integer) 0 表示不存在。

4.3 Redis-String

String 類型是 Redis 最基本的數據類型,string 類型的值最大能存儲 512MB。

常用命令:

  • SET key value:設置鍵的值。
  • GET key:獲取鍵的值。
  • INCR key:將鍵的值加 1。
  • DECR key:將鍵的值減 1。
  • APPEND key value:將值追加到鍵的值之后。
127.0.0.1:6379> set name1 xiaoming
OK
127.0.0.1:6379> get name1
"xiaoming"

4.4 Redis-Hash

Hash 是一個 string 類型的 field 和 value 的映射表,hash 特別適合用于存儲對象。每個 hash 最多可以存儲 2 32 ? 1 2^{32}-1 232?1 個鍵值對。

常用命令:

  • HSET key field value:設置哈希表中字段的值。
  • HGET key field:獲取哈希表中字段的值。
  • HGETALL key:獲取哈希表中所有字段和值。
  • HDEL key field:刪除哈希表中的一個或多個字段。
127.0.0.1:6379> hset student id 1 name "zhangsan" gender "男"
(integer) 3
127.0.0.1:6379> hgetall student
1) "id"
2) "1"
3) "name"
4) "zhangsan"
5) "gender"
6) "\xe7\x94\xb7"
127.0.0.1:6379> hget student name
"zhangsan"
127.0.0.1:6379> hget student id
"1"

4.5 Redis-List

List 是簡單的字符串列表,按照插入順序排序。你可以添加一個元素到列表的頭部(左邊)或者尾部(右邊)。列表最多可以存儲 2 32 ? 1 2^{32}-1 232?1 個元素。

常用命令:

  • LPUSH key value:將值插入到列表頭部。
  • RPUSH key value:將值插入到列表尾部。
  • LPOP key:移出并獲取列表的第一個元素。
  • RPOP key:移出并獲取列表的最后一個元素。
  • LRANGE key start stop:獲取列表在指定范圍內的元素。
127.0.0.1:6379> lpush order first second
(integer) 2
127.0.0.1:6379> lrange order 0 1
1) "second"
2) "first"
127.0.0.1:6379> lpush order third
(integer) 3
127.0.0.1:6379> lrange order 0 3
1) "third"
2) "second"
3) "first"
127.0.0.1:6379> lrange order 0 2
1) "third"
2) "second"
3) "first"
127.0.0.1:6379> lrange order 0 1
1) "third"
2) "second"

4.6 Redis-Set

Set 是 string 類型的無序集合。集合是通過哈希表實現的,所以添加,刪除,查找的復雜度都是 O(1)。集合中最大的成員數為 2 32 ? 1 2^{32}-1 232?1

常用命令:

  • SADD key value:向集合添加一個或多個成員。
  • SREM key value:移除集合中的一個或多個成員。
  • SMEMBERS key:返回集合中的所有成員。
  • SISMEMBER key value:判斷值是否是集合的成員。
127.0.0.1:6379> sadd color red yellow blue
(integer) 3
127.0.0.1:6379> smembers color
1) "red"
2) "yellow"
3) "blue"
127.0.0.1:6379> srem color red
(integer) 1
127.0.0.1:6379> smembers color
1) "yellow"
2) "blue

4.7 Redis-Zset

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

常用命令:

  • ZADD key score value:向有序集合添加一個或多個成員,或更新已存在成員的分數。
  • ZRANGE key start stop [WITHSCORES]:返回指定范圍內的成員。
  • ZREM key value:移除有序集合中的一個或多個成員。
  • ZSCORE key value:返回有序集合中,成員的分數值。
127.0.0.1:6379> zadd class 100 "one" 90 "two" 100 three
(integer) 3
127.0.0.1:6379> zrange class 0 2
1) "two"
2) "one"
3) "three"
127.0.0.1:6379> zscore class two
"90"

5.在Java中使用Redis

  • 第一步,在項目中添加 Jedis(Java 和 Redis 的混拼)依賴:

    <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>8.0.0</version>
    </dependency>
    
  • 第二步,新建 UserInfo(用戶信息)類:

    package org.example;public class UserInfo {private String name;private int age;public UserInfo() {}public UserInfo(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "UserInfo{" +"name='" + name + '\'' +", age=" + age +'}';}
    }
    
  • 第三步,在項目中添加 Gson(用于序列化和反序列化用戶信息)依賴:

    <dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.8.6</version><scope>compile</scope>
    </dependency>
    
  • 第四步,新建測試類 RedisTest:

    public class RedisTest {// 定義 Redis 中存儲用戶信息的鍵private static final String REDIS_KEY = "user";public static void main(String[] args) {// 創建 Jedis 實例,連接到本地 Redis 服務器,端口為 6379Jedis jedis = new Jedis("localhost", 6379);// 創建 Gson 實例,用于 Java 對象和 JSON 字符串之間的轉換Gson gson = new Gson();// 創建 UserInfo 對象,存儲用戶信息UserInfo userInfo = new UserInfo("魚兒也有煩惱", 18);// 將 UserInfo 對象轉換為 JSON 字符串,并存儲到 Redis 中jedis.set(REDIS_KEY, gson.toJson(userInfo));// 從 Redis 中獲取 JSON 字符串,并轉換為 UserInfo 對象UserInfo getUserInfoFromRedis = gson.fromJson(jedis.get(REDIS_KEY), UserInfo.class);// 打印從 Redis 中獲取的用戶信息System.out.println("get:" + getUserInfoFromRedis);// 打印指定鍵是否存在于 Redis 中System.out.println("exists:" + jedis.exists(REDIS_KEY));// 刪除 Redis 中指定鍵對應的值,并打印刪除的鍵的數量System.out.println("del:" + jedis.del(REDIS_KEY));// 嘗試獲取已刪除鍵的值,并打印結果System.out.println("get:" + jedis.get(REDIS_KEY));}
    }
    
  • 輸出結果:

    get:UserInfo{name='魚兒也有煩惱', age=18}
    exists:true
    del:1
    get:null
    

6.緩存雪崩、擊穿、穿透

6.1 緩存雪崩

概念:即緩存同一時間大面積的失效,這個時候來了一大波請求,都懟到數據庫上,最后數據庫處理不過來崩了。

業務場景舉例:APP首頁放著很多熱門數據,大型活動期間,首頁數據得按不同時間更新。就像零點要換一批新數據,舊數據剛過期,新數據還沒完全加載好。偏偏零點又有個小活動啟動,一下子來了好多人打開APP,服務器收到海量請求。可新數據沒加載完,緩存里大多找不到對應內容,這些請求全跑到數據庫那兒去了。數據庫應付不過來這么多請求,最后直接癱瘓了。

解決方案

  • 給過期時間加個隨機時間。需要注意的是,這里設置的隨機過期時間并非短短幾秒,而是可以長達數分鐘。這是因為當數據量龐大時,再結合上述場景,考慮到Redis采用單線程處理數據的特性,僅僅幾秒的緩沖時間,根本無法確保所有新數據都能加載完畢。 因此,在設置過期時間時,寧長勿短。畢竟無論時間長短,數據最終都會過期,從最終效果來看并無差別。而且,適當擴大過期時間范圍,能讓Redis的key分布得更加分散。這樣一來,Redis在批量處理過期key時,阻塞時間也會相應縮短,有效提升系統運行效率。
  • 加互斥鎖,但這個方案會導致吞吐量明顯下降。(上述例子不合適用)
  • 熱點數據不設置過期。不過期的話,正常業務請求自然就不會打到數據庫了。

6.2 緩沖擊穿

概念:緩存擊穿是指一個熱點 key 過期或被刪除后,導致線上原本能命中該熱點 key 的請求,瞬間大量地打到數據庫上,最終導致數據庫被擊垮。

業務場景舉例:出現情況一般是誤操作,比如設置錯了過期時間、誤刪除導致的。

解決方案

  • 仔細檢查每一處代碼細節,確保沒有潛在問題。對于熱點數據,要明確制定清晰的過期策略:究竟需不需要設置過期時間?如果需要,具體在何時讓數據過期?這些都要有明確的規劃。
  • 線上誤操作問題,需加強權限管理,特別是線上權限必須審核,防止誤操作。

6.3 緩沖穿透

概念:客戶端請求緩存和數據庫中不存在的數據,導致所有的請求都打到數據庫上。如果請求很多,數據庫依舊會掛掉。

業務場景舉例

  • 數據庫主鍵 id 都是正數,然后客戶端發起了 id = -1 的查詢。
  • 一個查詢接口,有一個狀態字段 status,其實 0 表示開始、1 表示結束。結果有請求一直發 status=3 的請求過來。

解決方案

  • 做好參數校驗,對于不合理的參數要及時 return 結束。
  • 對于查不到數據的 key,也將其短暫緩存起來。比如 30s。這樣能避免大量相同請求瞬間打到數據庫上,減輕壓力。
  • 提供一個能迅速判斷請求是否有效的攔截機制,比如布隆過濾器,Redis 本身就具有這個功能。可以利用 Redis 維護所有合法的鍵(key),當有請求到來時,先通過布隆過濾器檢查請求參數中的鍵是否合法。若不合法,就直接返回響應結果;若合法,再從緩存或者數據庫里獲取所需數據。

6.4 業務可靠性處理

  • 提高 Redis 可用性。

    Redis 要么用集群架構,要么用主從 + 哨兵。保證 Redis 的可用性。

    光搞主從架構,沒加哨兵的話,出問題根本不會自動切換。要是趕上業務高峰期或者搞活動的時候服務器掛了,等系統報警、排查問題、跟團隊溝通完,再等運維來修,黃花菜都涼了!

  • 減少對緩存的依賴。

    對于熱點數據,可以考慮加上本地緩存,比如:Guava、Ehcache,更簡單點,hashMap、List 等也可以。減少 Redis 壓力的同時,還能提高性能,一舉兩得。

  • 業務降級。

    從保護下游接口或者數據庫的方面來想,在碰到大流量的情況時,搞個限流措施挺有必要的。就算緩存突然崩了,也不至于讓下游直接全垮掉。還有,那些能降級的功能就降級。提前把降級開關和降級邏輯寫好,到了關鍵時候,全指望著它們來穩住局面呢。

🤗🤗🤗

參考

  • Redis官方Commands查閱

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

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

相關文章

一文讀懂Python之requests模塊(36)

一、requests模塊簡介 requests模塊是python中原生的一款基于網絡請求的模塊&#xff0c;功能強大&#xff0c;簡單便捷且高效 &#xff0c;該模塊可以模擬瀏覽器發送請求&#xff0c;主要包括指定url、發起請求、獲取響應數據和持久化存儲&#xff0c;包括 GET、POST、PUT、…

WPF之布局流程

文章目錄 1. 概述2. 布局元素的邊界框3. 布局系統原理3.1 布局流程時序圖 4. 測量階段(Measure Phase)4.1 測量過程4.2 MeasureOverride方法 5. 排列階段(Arrange Phase)5.1 排列過程5.2 ArrangeOverride方法 6. 渲染階段(Render Phase)7. 布局事件7.1 主要布局事件7.2 布局事件…

uniapp|獲取當前用戶定位、與系統設定位置計算相隔米數、實現打卡簽到(可自定義設定位置、位置有效范圍米數)

基于UniApp闡述移動應用開發中定位功能的實現全流程,涵蓋實時定位獲取、動態距離計算與自定義位置、有效范圍設定等功能。文章提供完整的代碼示例與適配方案,適用于社交簽到、課堂教室打卡等場景。 目錄 引言定位功能在移動應用中的價值(社交、導航、O2O等場景)UniApp跨平臺…

Yii2.0 模型規則(rules)詳解

一、基本語法結構 public function rules() {return [// 規則1[[attribute1, attribute2], validator, options > value, ...],// 規則2[attribute, validator, options > value, ...],// 規則3...]; }二、規則類型分類 1、核心驗證器&#xff08;內置驗證器&#xff0…

數據結構(三)——棧和隊列

一、棧和隊列的定義和特點 棧&#xff1a;受約束的線性表&#xff0c;只允許棧頂元素入棧和出棧 對棧來說&#xff0c;表尾端稱為棧頂&#xff0c;表頭端稱為棧底&#xff0c;不含元素的空表稱為空棧 先進后出&#xff0c;后進先出 隊列&#xff1a;受約束的線性表&#xff0…

SQL Server 存儲過程開發三層結構規范

以下是《SQL Server 存儲過程開發三層結構規范》的正式文檔結構&#xff0c;適用于企業級數據庫應用開發場景&#xff0c;有助于團隊協作、代碼審查與自動化運維&#xff1a; &#x1f4d8; SQL Server 存儲過程開發三層結構規范 一、架構設計總覽 三層結構簡介 層級命名約定…

接上篇,解決FramePack啟動報錯:“httpx.ReadError: [WinError 10054] 遠程主機強迫關閉了一個現有的連接。“的問題

#工作記錄 FramePack部署&#xff08;從PyCharm解釋器創建和使用開始&#xff09;保姆級教程-CSDN博客 上篇我們記錄到FramePack從克隆到啟動調試的保姆級教程&#xff0c;關于啟動時會報以下錯誤的問題&#xff0c;已作出解決&#xff1a; 報錯摘錄&#xff1a; (.venv) PS F…

ping_test_parallel.sh 并行網絡掃描腳本

并行網絡掃描腳本分析&#xff1a;提高網絡探測效率 引言腳本概述核心代碼分析顏色定義與初始化并行處理機制并行執行與進程控制結果處理與統計 技術亮點性能分析結論附錄&#xff1a;完整腳本 引言 在網絡管理和運維過程中&#xff0c;快速檢測網段內主機的在線狀態是一項常見…

leetcode 3342. 到達最后一個房間的最少時間 II 中等

有一個地窖&#xff0c;地窖中有 n x m 個房間&#xff0c;它們呈網格狀排布。 給你一個大小為 n x m 的二維數組 moveTime &#xff0c;其中 moveTime[i][j] 表示在這個時刻 以后 你才可以 開始 往這個房間 移動 。你在時刻 t 0 時從房間 (0, 0) 出發&#xff0c;每次可以移…

關于vue-office在vue3工程中的引用報錯問題

在vue3項目工程中&#xff0c;根據vue-office文檔在vue2中的引用&#xff1a; //引入VueOfficeDocx組件 相關樣式import VueOfficeDocx from vue-office/docx;import vue-office/docx/lib/index.css; 報錯信息&#xff1a; [plugin:vite:import-analysis] Failed to resolve …

【macOS常用快捷鍵】

以下是 macOS 最常用快捷鍵列表&#xff0c;按使用頻率由高到低分類整理&#xff0c;涵蓋日常操作、效率工具及系統控制&#xff0c;助你快速提升使用效率&#xff1a; 一、基礎高頻操作 快捷鍵功能說明Command C復制選中內容Command V粘貼Command X剪切Command Z撤銷上一…

mdadm 報錯: buffer overflow detected

最近跑 blktest (https://github.com/osandov/blktests) 時發現 md/001 的測試失敗了 單獨執行&#xff0c;最后定位到是 mdadm 命令報錯: buffer overflow detected 這個 bug 目前已經修復: https://git.kernel.org/pub/scm/utils/mdadm/mdadm.git/commit/?id827e1870f3205…

查看jdk是否安裝并且配置成功?(Android studio安裝前的準備)

WinR輸入cmd打開命令提示窗口 輸入命令 java -version 回車顯示如下&#xff1a;

STM32智能刷卡消費系統(uC/OS-III)

一、項目概述與開發背景 本系統是一款基于STM32微控制器的智能刷卡消費終端&#xff0c;集成RFID識別、OLED顯示、Flash存儲、藍牙通信等核心模塊。項目采用uC/OS-III實時操作系統實現多任務并發處理&#xff0c;適用于校園一卡通、企業食堂等小額支付場景。系統支持定額扣款、…

[人機交互]以用戶為中心的交互設計

一.以用戶為中心設計的兩個特征 ? 理解和指定產品的使用上下文 &#xff0c;并用于指導設計 ? 用戶參與式開發 ? 參與 評估研究 &#xff08;第十 — 十四章&#xff09; ? 參與 設計過程 &#xff1a;用戶作為合作設計人員 二.用戶參與設計的重要性 ? 需求的獲取主要來源…

Abaqus學習筆記

目錄 Abaqus介紹 學習資源 ?編輯Abaqus/CAE abaqus下載安裝 abaqus基本操作 Abaqus啟動 新建模型 ?編輯 ?編輯修改界面背景 ?編輯?編輯結果信息的顯示與否 ?編輯計算結果信息字體設置 ?編輯允許多繪圖狀態 單位量綱 視圖操作 事前說明 ODB文件 本構關系…

論壇系統開發(0-1) (上 前置知識介紹)

前置知識 1. 軟件的生命周期 生命周期: 對事物進行定義(描述) -> 創建 -> 使用 -> 銷毀的過程 軟件?命周期中以劃分為可?性研究、需求分析、概要設計、詳細設計、實現、組裝(集成)測試、確認測試、使?、維護、退役10個階段&#xff0c;如下圖&#xff1a; a. 可…

架構師面試(三十七):監控系統架構模式

題目 監控是在產品生命周期的運維環節&#xff0c;能對產品的關鍵指標數據進行【實時跟蹤】并對異常數據進行【實時報警】。 一句話描述&#xff0c;監控系統可以幫我們【主動預防和發現】業務系統中的問題。 我們常說&#xff0c;監控系統是 “糧草”&#xff0c;業務系統是…

【面試 · 二】JS個別重點整理

目錄 數組方法 字符串方法 遍歷 es6 構造函數及原型 原型鏈 this指向 修改 vue事件循環Event Loop FormData 數組方法 改變原數組&#xff1a;push、pop、shift、unshift、sort、splice、reverse不改變原屬組&#xff1a;concat、join、map、forEach、filter、slice …

深度學習里程碑:AlexNet 架構解析與核心技術詳解

內容摘要 本文深度解析2012年ILSVRC冠軍模型AlexNet&#xff0c;全面闡述其在深度學習發展中的關鍵突破。從模型架構出發&#xff0c;詳細解析卷積層、池化層、全連接層的數學原理&#xff0c;重點分析ReLU激活函數、LRN局部歸一化、重疊池化等創新技術的數學表達與工程價值。…