.NET 8.0 Redis 教程

一、環境準備

1. 安裝 Redis 服務器

  • Windows/macOS/Linux:使用 Docker 快速部署

    bash

    docker run -d --name redis -p 6379:6379 redis
    
  • Linux:直接安裝

    bash

    sudo apt-get install redis-server
    sudo systemctl start redis-server
    

2. 創建 .NET 項目

bash

dotnet new console -n RedisTutorial
cd RedisTutorial

3. 安裝 NuGet 包

bash

dotnet add package StackExchange.Redis

二、基礎操作:連接與數據讀寫

1. 連接 Redis

csharp

using StackExchange.Redis;class Program
{static void Main(){// 連接到本地 Redisusing var redis = ConnectionMultiplexer.Connect("localhost:6379");IDatabase db = redis.GetDatabase();Console.WriteLine("Redis 連接成功!");}
}

2. 基本數據類型操作

字符串(String)

csharp

// 寫入
db.StringSet("name", "John Doe");// 讀取
string name = db.StringGet("name");
Console.WriteLine($"Name: {name}");// 自增計數
db.StringIncrement("counter");
哈希(Hash)

csharp

// 寫入
db.HashSet("user:1", new HashEntry[] {new HashEntry("age", 30),new HashEntry("email", "john@example.com")
});// 讀取
string email = db.HashGet("user:1", "email");
列表(List)

csharp

// 左側插入
db.ListLeftPush("tasks", "task1");
db.ListLeftPush("tasks", "task2");// 獲取列表
RedisValue[] tasks = db.ListRange("tasks");
集合(Set)

csharp

// 添加元素
db.SetAdd("tags", new RedisValue[] { "C#", ".NET", "Redis" });// 判斷元素是否存在
bool hasDotNet = db.SetContains("tags", ".NET");

三、進階操作:過期時間與事務

1. 設置 Key 過期時間

csharp

// 寫入時設置 10 分鐘過期
db.StringSet("cache:data", "value", TimeSpan.FromMinutes(10));// 為已存在的 key 設置過期
db.KeyExpire("counter", TimeSpan.FromHours(1));// 檢查剩余過期時間
TimeSpan? ttl = db.KeyTimeToLive("cache:data");

2. 事務操作

csharp

var transaction = db.CreateTransaction();// 批量操作
transaction.StringSetAsync("key1", "value1");
transaction.StringSetAsync("key2", "value2");// 執行事務
bool committed = await transaction.ExecuteAsync();

四、高級特性:發布訂閱與分布式鎖

1. 發布訂閱(Pub/Sub)

發布者

csharp

var subscriber = redis.GetSubscriber();
subscriber.Publish("news", "Hello, Redis!");

訂閱者

csharp

var subscriber = redis.GetSubscriber();
subscriber.Subscribe("news", (channel, message) => {Console.WriteLine($"收到消息: {message}");
});

2. 分布式鎖

csharp

// 獲取鎖(嘗試 10 秒,持有 30 秒)
bool locked = db.LockTake("resource:lock", Environment.MachineName, TimeSpan.FromSeconds(30));if (locked)
{try{// 執行臨界區代碼}finally{// 釋放鎖db.LockRelease("resource:lock", Environment.MachineName);}
}

五、連接配置最佳實踐

1. 配置連接選項

csharp

var options = ConfigurationOptions.Parse("localhost:6379");
options.AbortOnConnectFail = false;
options.ConnectRetry = 3;
options.SyncTimeout = 5000; // 5 秒超時using var redis = ConnectionMultiplexer.Connect(options);

2. 連接池管理

csharp

// 使用連接池(根據并發量調整大小)
options.PoolSize = 50;

六、實戰案例:緩存實現

1. 緩存優先模式

csharp

string GetDataFromCache(string key)
{// 1. 先從緩存獲取string cacheData = db.StringGet(key);if (!string.IsNullOrEmpty(cacheData)){return cacheData;}// 2. 緩存未命中,從數據庫獲取string dbData = FetchFromDatabase(key);// 3. 寫入緩存(設置 5 分鐘過期)db.StringSet(key, dbData, TimeSpan.FromMinutes(5));return dbData;
}

2. 緩存失效策略

csharp

// 主動更新緩存
async Task RefreshCache(string key)
{string newData = FetchFromDatabase(key);await db.StringSetAsync(key, newData, TimeSpan.FromMinutes(5));
}

七、性能優化與監控

1. 性能優化技巧

  • 使用異步方法(如?StringSetAsync
  • 批量操作(Batch/Transaction)
  • 合理設置超時參數
  • 使用連接池

2. 監控 Redis

csharp

// 獲取服務器信息
var server = redis.GetServer("localhost", 6379);
var info = server.Info();// 打印內存使用情況
Console.WriteLine($"內存使用: {info["memory"]["used_memory_human"]}");

八、常見問題處理

1. 連接超時

  • 增加?ConnectTimeout?和?SyncTimeout
  • 檢查 Redis 服務器負載

2. 緩存穿透

  • 緩存空值:

    csharp

    if (dbData == null)
    {db.StringSet(key, "", TimeSpan.FromMinutes(1)); // 短暫緩存空值
    }
    

3. 緩存雪崩

  • 為不同 key 設置隨機過期時間:

    csharp

    var randomExpiry = TimeSpan.FromMinutes(5 + new Random().Next(10));
    db.StringSet(key, value, randomExpiry);

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

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

相關文章

2025年游戲鼠標推薦,游戲鼠標推薦,打CSGO(羅技、雷蛇、卓威、ROG、漫步者、賽睿、達爾優)

可能很多人對于游戲鼠標的了解還是不夠深,會有很多疑問,比如:“游戲鼠標和辦公鼠標的區別”、“游戲鼠標無線好還是有線好”等等一系列的問題,本文將會介紹游戲鼠標領域處于領先地位的幾個廠家:羅技鼠標、雷蛇鼠標、賽…

OpenCV CUDA模塊設備層-----在 GPU上高效地執行兩個uint類型值的最小值比較函數vmin2()

操作系統:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 編程語言:C11 算法描述 OpenCV 的CUDA模塊(cudev) 中的一個設備端內聯函數,用于在GPU上高效地執行兩個uint類型值的最小值比較。 該函…

Web3與傳統網絡安全模型對比:關鍵差異解析

隨著互聯網技術的飛速發展,Web3的概念逐漸成為人們關注的焦點。Web3代表著一個更加去中心化、安全和用戶友好的網絡環境。與傳統的網絡安全模型相比,Web3在多個方面展現出了其獨特的優勢和特點。本文將深入探討Web3與傳統網絡安全模型之間的關鍵差異。 …

FLAN:微調語言模型是 Zero-Shot 學習者

摘要 本文探討了一種簡單的方法來提升語言模型的零樣本學習能力。我們展示了指令微調——即在通過指令描述的數據集集合上對語言模型進行微調——能夠顯著提升模型在未見任務上的零樣本表現。 我們以一個擁有1370億參數的預訓練語言模型為基礎,在60多個通過自然語…

springboot中的事件發布和監聽

事件定義 創建一個自定義事件類 UserLoginEvent,繼承 ApplicationEvent,用于攜帶用戶登錄信息: import org.springframework.context.ApplicationEvent;public class UserLoginEvent extends ApplicationEvent { //關鍵點1:ext…

“開源雙軌架構+40億參數擴散Transformer——ComfyUI-OmniGen2本地部署教程:重塑多模態生成的效率邊界!

一、簡介 OmniGen2 是由北京智源研究院最新推出的一個強大、高效的開源多模態生成模型。與 OmniGen v1 不同,OmniGen2 具有兩種不同的文本和圖像模態解碼路徑,利用非共享參數和解耦的圖像分詞器。OmniGen2 在四個主要功能方面具有競爭力的性能&#xff…

Java的SpringAI+Deepseek大模型實戰之會話記憶

文章目錄 背景項目環境實現步驟第一步、定義會話存儲方式方式一、定義記憶存儲ChatMemory方式二、注入記憶存儲ChatMemory 第二步、配置會話記憶方式一、老版本實現方式二、新版本實現 第三步、存儲會話信息 異常處理1、InMemoryChatMemory 無法解析 背景 前兩期【環境搭建】和…

RDS MySQL vs. Aurora MySQL:高需求工作負載的終極遷移指南

在 AWS 上,開發團隊最常見且關鍵的決策之一就是選擇合適的關系型數據庫。通常,討論會從 RDS for MySQL 這個可靠且熟悉的“老黃牛”開始。但很快,就會有人提到一個更強大、更云原生的選項:Aurora MySQL。 也許,就像最…

使用倉頡編程語言是一種怎樣的體驗?

2024年6月21日下午,華為終端BG軟件部總裁龔體先生在華為開發者大會主題演講《鴻蒙原生應用,全新出發!》中向全球開發者介紹了華為自研倉頡編程語言,并發布了HarmonyOS NEXT倉頡語言開發者預覽版。這是華為首次公開倉頡編程語言。 …

Qt Creator自定義控件開發流程

Qt Creator自定義控件開發流程 在 Qt 5.9 Creator 中開發自定義控件的完整流程如下,分為設計、實現、集成和測試四個階段: 1. 創建自定義控件類 (1) 新建類文件 右鍵項目 → 添加新文件 → C Class基類選擇 QWidget 或現有控件(如 QPushBu…

翻譯《The Old New Thing》- 如何創建一個與屏幕大小相同的窗口,而不會被當作全屏窗口處理?

How can I create a window the size of the screen without it being treated as a fullscreen window? - The Old New Thinghttps://devblogs.microsoft.com/oldnewthing/20250522-00/?p111211 問題描述 任務欄允許全屏窗口覆蓋它。這樣,當你在放映幻燈片或進行…

深分頁末日救星:MySQL延遲關聯原理與實戰手冊

MySQL 深分頁(如 LIMIT 100000, 10)本質是 高代價的偏移量掃描,可通過以下方案優化,附核心原理和實操示例: 一、深分頁為什么慢? SELECT * FROM orders ORDER BY id DESC LIMIT 100000, 10; 執行過程&…

前端技術棧 —— HTML、CSS和JavaScirpt執行環境

以下內容由GLM回答生成,不保證正確性。 前端技術棧 —— HTML、CSS和JavaScirpt執行環境 JavaScript 的執行環境HTML 和 CSS 的執行環境HTML 和 CSS 是否可以在其他環境中執行?總結 JavaScript 是一種 解釋型語言,但它也可以被編譯。JavaScr…

多項式帶余除法——線性代數題目為例

一、多項式帶余除法的定義 二、例題 使用方法將在例題中展示:

學習日記-spring-day40-7.3

知識點: 1.自動裝配Resource(3) 知識點 核心內容 重點 Autowired與Resource注入規則 默認注入邏輯:未指定參數時,Resource優先按屬性名匹配(by name),失敗后按類型匹配&#xf…

重新認識JNIEnv

引言 拋開一堆概念,我們從本質出發。 java 調用c 我們開發移動端或者后端服務 ,都是用的java 或者kotlin 語言。有時候我們需要用c的一些庫(ocr識別/導航的算法/ 等) 因為一些跟硬件相關的接口或者系統的api 都是c寫的。 C調用J…

人工智能訓練師——智能語音識別ASR

人機對話——ASR 概念 ASR(Automatic Speech Recognition,自動語音識別)是一種將人類語音轉換為文本的技術。它使得計算機能夠“聽”懂人類的語音指令或對話,并將其轉換成可讀、可編輯的文本形式。ASR技術是人機交互領域中的一個…

Compose 常用命令詳解——AI教你學Docker

3.3 Compose 常用命令詳解 Docker Compose 通過一系列命令高效管理多容器應用。理解這些命令,可以讓你靈活地啟動、停止、查看、調試、擴縮容和配置 Compose 項目。 一、核心命令詳解 1. docker compose up 功能:啟動并構建所有服務,生成網…

Mausezahn - 網絡流量生成與測試工具(支持從鏈路層到應用層的協議模擬)

Mausezahn 是一個 網絡流量生成與測試工具,主要用于模擬各種網絡協議行為、測試網絡設備性能、驗證安全策略或進行故障排查。它支持從底層鏈路層(如 Ethernet、VLAN)到高層應用層(如 HTTP、DNS)的協議模擬,…

08-three.js Textures

Three.js Journey — Learn WebGL with Three.jsThe ultimate Three.js course whether you are a beginner or a more advanced developerhttps://threejs-journey.com/?c=p3 使用原生 JavaScript 首先是靜態頁面的放置位置,如果使用Vite模版配置,可以直接放在 /static/ …