二:Redis快速入門及應用

来源:http://www.cnblogs.com/NiceCui/archive/2017/11/07/7797558.html
-Advertisement-
Play Games

轉載:https://mp.weixin.qq.com/s/exE_UmZDeeWZKGNhbOFJMQ 作者|張輝清、楊麗編輯|雨多田光 文末有 demo 下載 Redis的使用難嗎?不難,Redis用好容易嗎?不容易。Redis的使用雖然不難,但與業務結合的應用場景特別多、特別緊,用好並不容易。 ...


 轉載:https://mp.weixin.qq.com/s/exE_UmZDeeWZKGNhbOFJMQ

 

作者|張輝清、楊麗編輯|雨多田光

 

文末有 demo 下載


Redis的使用難嗎?不難,Redis用好容易嗎?不容易。Redis的使用雖然不難,但與業務結合的應用場景特別多、特別緊,用好並不容易。我們希望通過一篇文章及Demo,即可輕鬆、快速入門並學會應用。一、Redis 簡介

Redis是一個開源的Key-Value存儲,但又不僅僅是Key-Value存儲,用官網上的話來說,Redis是一個數據結構存儲,可用作資料庫、緩存和消息中間件。相對於傳統的Key-Value存儲Memcached來說,Redis具有如下特點:

 

  • 速度快

  • 豐富的數據結構,除String之外,還有List、Hash、Set、Sorted Set

  • 單線程,避免了線程切換和鎖的性能消耗

  • 原子操作

  • 可持久化(RDB與AOF)

  • 發佈/訂閱

  • 支持Lua腳本

  • 分散式鎖

  • 事務

  • 主從複製與高可用(Redis Sentinel)

  • 集群(3.0版本以上)

二、Redis 數據結構

1、String

這是最簡單的Redis類型。如果只使用這種類型,Redis就像一個可持久化的Memcached伺服器。

 

2、List

Redis的List是基於雙向鏈表實現的,可以支持反向查找和遍歷。

常用案例:聊天系統、社交網路中獲取用戶最新發表的帖子、簡單的消息隊列、新聞的分頁列表、博客的評論系統。

 

3、Hash

Hash是一個String類型的field和value之間的映射表,請見下圖,類似於.NET中的Hashtable和Dictionary。主要用來存儲對象,可以避免序列化的開銷和併發修改控制的問題。

4、Set

Set也是一個列表,不過它的特殊之處在於它是可以自動排重的:當需要存儲一個列表數據,而又不希望出現重覆的時候,Set是一個很好的選擇(比如ID的集合)。並且Set提供了判斷某個成員是否在一個Set集合內的介面,這也是List所沒有的。

 

5、Sorted Set

Sorted Set和Set的使用場景類似,區別是Sorted Set會根據提供的score參數來進行自動排序。當你需要一個有序的並且不重覆的集合列表,那麼就可以選擇Sorted Set數據結構。常用案例:游戲中的排行榜。

三、 Redis 重要特性

以下特性請重點看管道和事務。

 

1、管道

Redis管道是指客戶端可以將多個命令一次性發送到伺服器,然後由伺服器一次性返回所有結果。管道技術在批量執行命令的時候可以大大減少網路傳輸的開銷,提高性能。

 

2、事務

Redis事務是一組命令的集合。一個事務中的命令要麼都執行,要麼都不執行。如果命令在運行期間出現錯誤,不會自動回滾。

 

管道與事務的區別:管道主要是網路上的優化,客戶端緩衝一組命令,一次性發送到伺服器端執行,但是並不能保證命令是在同一個事務裡面執行;而事務是原子性的,可以確保命令執行的時候不會有來自其他客戶端的命令插入到命令序列中。

 

3、分散式鎖

分散式鎖是控制分散式系統之間同步訪問共用資源的一種方式。在分散式系統中,常常需要協調他們的動作,如果不同的系統或是同一個系統的不同主機之間共用了一個或一組資源,那麼訪問這些資源的時候,往往需要互斥來防止彼此干擾來保證一致性,在這種情況下,便需要使用到分散式鎖。

 

4、地理信息

從Redis 3.2版本開始,新增了地理信息相關的命令,可以將用戶給定的地理位置信息(經緯度)存儲起來,並對這些信息進行操作。

四、 使用方法

 

步驟1、在需要使用Redis的項目中引用FxCommon.dll和Redis.dll

 

步驟2、在App.config或Web.config文件中添加如下配置

 

<add key="RedisServerIP" value="redis:[email protected]:4125"/>
<!-- 提供的 Redis 環境是單機版配置。如果 Redis 是主從配置,則還需設置 RedisSlaveServerIP-->
<!--<add key="RedisSlaveServerIP" value="redis:[email protected]:4125"/>--> 

<!--Redis 資料庫。如果不需要指定 Redis 資料庫,就配置預設值 0-->     
<add key="RedisDefaultDb" value="0"/>

 

步驟 3、使用 PooledRedisClientManager 類創建 Redis 連接池:

// 讀取 Redis 主機 IP 配置信息
string[] redisMasterHosts = ConfigurationManager.ConnectionStrings["RedisServerIP"].ConnectionString.Split(','); 

// 如果 Redis 伺服器是主從配置,那麼還需要讀取 Redis Slave 機的 IP 配置信息
string[] redisSlaveHosts = null;
var slaveConnection = ConfigurationManager.ConnectionStrings["RedisSlaveServerIP"];
if (slaveConnection != null && !string.IsNullOrWhiteSpace(slaveConnection.ConnectionString))
{    
    string redisSlaveHostConfig = slaveConnection.ConnectionString;    
    redisSlaveHosts = redisSlaveHostConfig.Split(',');
} 

// 讀取 RedisDefaultDb 配置
int defaultDb = 0;
string defaultDbSetting = ConfigurationManager.AppSettings["RedisDefaultDb"];
if (!string.IsNullOrWhiteSpace(defaultDbSetting))
{    
    int.TryParse(defaultDbSetting, out defaultDb);
} 

var redisClientManagerConfig = new RedisClientManagerConfig
{    
    MaxReadPoolSize = 50,    
    MaxWritePoolSize = 50,    
    DefaultDb = defaultDb
};

// 創建 Redis 連接池
Manager = new PooledRedisClientManager(redisMasterHosts, redisSlaveHosts, redisClientManagerConfig)
{    
    PoolTimeout = 2000,    
    ConnectTimeout = 500                
};

 

步驟4、通過PooledRedisClientManager的實例獲取Redis客戶端,然後就可以開始通過Redis客戶端的API進行操作。

五、其它

 

 

5.1、 Redis Key命名規範

Redis Key命名規範:AppID:KeyName。

 

可能有很多人習慣用英文狀態的點號來作為AppID和KeyName的分隔符,而筆者建議使用冒號作為AppID和KeyName的分隔符,其原因是:這麼寫會使Redis Key會以AppID作為分類顯示在Redis Desktop Manager中,方便你能夠快速查到要查閱的Redis Key對應的Redis Value值,請見下圖:

但如果使用英文狀態的點號來作為分隔符的話,那麼在Redis Desktop Manager中,Redis Key就不會被分類了,請見下圖:

5.2、常見應用問題

  • 緩存穿透處理什麼是緩存穿透?當根據Redis key在緩存中查詢後,不存在對應Value,就應該會在後端系統如DB中去查找,該Key的併發請求量一旦變大,那麼就會對DB造成很大的壓力。解決辦法有:a.前端風險控制,將惡意穿透情況排除在外;b.對查詢結果為空的情況依然進行緩存,但緩存時間會設置得很短,一般是幾分鐘。

  • 緩存雪崩處理什麼是緩存雪崩?當緩存伺服器重啟或者大量緩存集中在某一個時間段失效,這樣在失效的時候,也會給後端系統(比如DB)帶來很大壓力。解決辦法有:後端連接數限制,錯誤閾值限制,超時處理,緩存失效時間均勻分佈,前端永不失效及後端主動更新。

  • 緩存時長:策略定位複雜,需要多維度的計算。

  • 緩存失效:按時失效,事件失效,後端主動更新。

  • 緩存Key:Hash、規則、首碼+Hash,異常情況可人工干預。

  • Lua腳本:服務端批量處理及事務能力,有條件邏輯的可擴展腳本。使用它的好處有:減少網路開銷、原子操作、可復用。

  • Limit:可滑動時間視窗,如應用於Session,Memcached需每次傳Key和Value。

六、Demo 下載及更多資料

 


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

-Advertisement-
Play Games
更多相關文章
  • Rxjava1升級Rxjava2坑 共存問題 通常情況下,如果我們希望在一個模塊中既想使用rxjava1又想使用rxjava2,這個時候在運行的時候會出現一下報錯: ... APK META/ INF/rxjava.properies 解決辦法:要麼都用rxjava1要麼都用rxjava2 出現此報 ...
  • 對某一顏色,設置透明度 alpha 後,其他使用該顏色的地方 受到影響!!!!原因未知 ...
  • 1.如圖所示,要實現一個驗證碼的倒計時的效果 2.實現 圖中獲取驗證碼那塊是一個button按鈕 關鍵部分,聲明一個TimeCount,繼承自CountDownTimer ...
  • 1.cell的view和contentView的區別 1.1 addSubView UITableViewCell實例上添加子視圖,有兩種方式:[cell addSubview:view]或[cell.contentView addSubview:view],一般情況下,兩種方式沒有區別。但是在多選 ...
  • 在我們的頁面中如果存在有ListView,當我們進入這個activity時,頁面會定位到ListView的位置去,而不是activity的頭部,這是由於ListView會去預設獲取焦點所造成的。 解決方法:只需要在整個佈局的根佈局處加上: android:descendantFocusability ...
  • 在開始之前先上一張效果圖 相信大家都看到了“店鋪優惠”這一欄,在這裡假設這一欄就是單獨的一個cell,當無店鋪優惠的時候不可點擊在有店鋪優惠的時候會彈出優惠列表,選中並返回時會刷新數據,所以彈出視圖採用的是懶載入的方式,而且刷新頁面的方式採用的不是 tableView 的 reloadData 來刷 ...
  • Swift 2.0 中,引入了可用性的概念。對於函數,類,協議等,可以使用@available聲明這些類型的生命周期依賴於特定的平臺和操作系統版本。而#available用在判斷語句中(if, guard, while等),在不同的平臺上做不同的邏輯。 @available 用法 @availabl ...
  • Mysql修改已有數據的字元集 問題 在生產環境中跑了很久,發現MysqlClient連接的字元集是預設的latin1,我們一直以為都是utf8,造成這樣的誤解,是因為在內網環境中,我們是源碼編譯的Mysql,並指定了編譯選項字元集位utf8,這時Mysql的是預設字元接都是utf8. 而在外網,我 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...