.Net使用Redis詳解之ServiceStack.Redis(七)
序言
本篇從.Net如何接入Reis開始,直至.Net對Redis的各種操作,為了方便學習與做為文件的檢視,我做一遍註釋展現,其中會對list的阻塞功能和事務的運用做二個案例,進行記錄學習。
Redis官方推薦的.NET驅動類庫為Service.Stack.Redis。然而網上對這個類庫的中文文件不是很全面與合理,這篇文章主要就對這個類庫做註釋展現。不足遺漏之處還望見諒,海涵。
.Net使用Redis是非常方便與快捷與簡單的,下面就讓我展示下吧。
這裡有必要說一下,如果你對Redis 中的基本物件資料型別還不瞭解,建議你看下我的前幾篇Redis文章,保證要到病除。
專案中安裝下載Service.Stack.Redis類庫
右擊專案->管理NuGet程式包->在聯機中輸入Reis就能出現這個類庫,然後新增引入就行啦。
.Net連結Redis資料庫,支援讀寫分離
1、配置檔案
public sealed class RedisConfig : ConfigurationSection { public static RedisConfig GetConfig() { RedisConfig section = GetConfig("RedisConfig"); returnsection; } public static RedisConfig GetConfig(string sectionName) { RedisConfig section = (RedisConfig)ConfigurationManager.GetSection(sectionName); if (section == null) throw new ConfigurationErrorsException("Section " + sectionName + "is not found."); return section; } /// <summary> /// 可寫的Redis連結地址 /// </summary> [ConfigurationProperty("WriteServerConStr", IsRequired = false)] public string WriteServerConStr { get { return (string)base["WriteServerConStr"]; } set { base["WriteServerConStr"] = value; } } /// <summary> /// 可讀的Redis連結地址 /// </summary> [ConfigurationProperty("ReadServerConStr", IsRequired = false)] public string ReadServerConStr { get { return (string)base["ReadServerConStr"]; } set { base["ReadServerConStr"] = value; } } /// <summary> /// 最大寫連結數 /// </summary> [ConfigurationProperty("MaxWritePoolSize", IsRequired = false, DefaultValue = 5)] public int MaxWritePoolSize { get { int _maxWritePoolSize = (int)base["MaxWritePoolSize"]; return _maxWritePoolSize > 0 ? _maxWritePoolSize : 5; } set { base["MaxWritePoolSize"] = value; } } /// <summary> /// 最大讀連結數 /// </summary> [ConfigurationProperty("MaxReadPoolSize", IsRequired = false, DefaultValue = 5)] public int MaxReadPoolSize { get { int _maxReadPoolSize = (int)base["MaxReadPoolSize"]; return _maxReadPoolSize > 0 ? _maxReadPoolSize : 5; } set { base["MaxReadPoolSize"] = value; } } /// <summary> /// 自動重啟 /// </summary> [ConfigurationProperty("AutoStart", IsRequired = false, DefaultValue = true)] public bool AutoStart { get { return (bool)base["AutoStart"]; } set { base["AutoStart"] = value; } } /// <summary> /// 本地快取到期時間,單位:秒 /// </summary> [ConfigurationProperty("LocalCacheTime", IsRequired = false, DefaultValue = 36000)] public int LocalCacheTime { get { return (int)base["LocalCacheTime"]; } set { base["LocalCacheTime"] = value; } } /// <summary> /// 是否記錄日誌,該設定僅用於排查redis執行時出現的問題,如redis工作正常,請關閉該項 /// </summary> [ConfigurationProperty("RecordeLog", IsRequired = false, DefaultValue = false)] public bool RecordeLog { get { return (bool)base["RecordeLog"]; } set { base["RecordeLog"] = value; } } }
2、配置Redis連結
public class RedisManager { /// <summary> /// redis配置檔案資訊 /// </summary> private static RedisConfig RedisConfig = RedisConfig.GetConfig(); private static PooledRedisClientManager prcm; /// <summary> /// 靜態構造方法,初始化連結池管理物件 /// </summary> static RedisManager() { CreateManager(); } /// <summary> /// 建立連結池管理物件 /// </summary> private static void CreateManager() { string[] WriteServerConStr = SplitString(RedisConfig.WriteServerConStr, ","); string[] ReadServerConStr = SplitString(RedisConfig.ReadServerConStr, ","); prcm = new PooledRedisClientManager(ReadServerConStr, WriteServerConStr, new RedisClientManagerConfig { MaxWritePoolSize = RedisConfig.MaxWritePoolSize, MaxReadPoolSize = RedisConfig.MaxReadPoolSize, AutoStart = RedisConfig.AutoStart, }); } private static string[] SplitString(string strSource, string split) { return strSource.Split(split.ToArray()); } /// <summary> /// 客戶端快取操作物件 /// </summary> public static IRedisClient GetClient() { if (prcm == null) CreateManager(); return prcm.GetClient(); } }
3、IRedisClient為操作Redis的介面,是.Net操作Redis的主要類庫,這裡我們把它接入
/// <summary> /// RedisBase類,是redis操作的基類,繼承自IDisposable介面,主要用於釋放記憶體 /// </summary> public abstract class RedisBase : IDisposable { public static IRedisClient Core { get; private set; } private bool _disposed = false; static RedisBase() { Core = RedisManager.GetClient(); } protected virtual void Dispose(bool disposing) { if (!this._disposed) { if (disposing) { Core.Dispose(); Core = null; } } this._disposed = true; } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } /// <summary> /// 儲存資料DB檔案到硬碟 /// </summary> public void Save() { Core.Save(); } /// <summary> /// 非同步儲存資料DB檔案到硬碟 /// </summary> public void SaveAsync() { Core.SaveAsync(); } }
.Net操作Redis資料型別String
public class DoRedisString : DoRedisBase { #region 賦值 /// <summary> /// 設定key的value /// </summary> public bool Set(string key, string value) { return RedisBase.Core.Set<string>(key, value); } /// <summary> /// 設定key的value並設定過期時間 /// </summary> public bool Set(string key, string value, DateTime dt) { return RedisBase.Core.Set<string>(key, value, dt); } /// <summary> /// 設定key的value並設定過期時間 /// </summary> public bool Set(string key, string value, TimeSpan sp) { return RedisBase.Core.Set<string>(key, value, sp); } /// <summary> /// 設定多個key/value /// </summary> public void Set(Dictionary<string, string> dic) { RedisBase.Core.SetAll(dic); } #endregion #region 追加 /// <summary> /// 在原有key的value值之後追加value /// </summary> public long Append(string key, string value) { return RedisBase.Core.AppendToValue(key, value); } #endregion #region 獲取值 /// <summary> /// 獲取key的value值 /// </summary> public string Get(string key) { return RedisBase.Core.GetValue(key); } /// <summary> /// 獲取多個key的value值 /// </summary> public List<string> Get(List<string> keys) { return RedisBase.Core.GetValues(keys); } /// <summary> /// 獲取多個key的value值 /// </summary> public List<T> Get<T>(List<string> keys) { return RedisBase.Core.GetValues<T>(keys); } #endregion #region 獲取舊值賦上新值 /// <summary> /// 獲取舊值賦上新值 /// </summary> public string GetAndSetValue(string key, string value) { return RedisBase.Core.GetAndSetValue(key, value); } #endregion #region 輔助方法 /// <summary> /// 獲取值的長度 /// </summary> public long GetCount(string key) { return RedisBase.Core.GetStringCount(key); } /// <summary> /// 自增1,返回自增後的值 /// </summary> public long Incr(string key) { return RedisBase.Core.IncrementValue(key); } /// <summary> /// 自增count,返回自增後的值 /// </summary> public double IncrBy(string key, double count) { return RedisBase.Core.IncrementValueBy(key, count); } /// <summary> /// 自減1,返回自減後的值 /// </summary> public long Decr(string key) {相關推薦
.Net使用Redis詳解之ServiceStack.Redis(七)
序言 本篇從.Net如何接入Reis開始,直至.Net對Redis的各種操作,為了方便學習與做為文件的檢視,我做一遍註釋展現,其中會對list的阻塞功能和事務的運用做二個案例,進行記錄學習
【Android 動畫】動畫詳解之屬性動畫(三)
大家好,在前兩篇中,我們介紹了Android的補間動畫和插值器,這一篇,我們來說下屬性動畫。 【Android 動畫】動畫詳解之補間動畫(一) 【Android 動畫】動畫詳解之插值器(二) 前言 通過前兩篇,我們已經熟悉了對View進行移動、縮放、旋轉和
iOS SDK詳解之視訊播放(AVPlayer)附Demo
前言 最近在研究視訊播放,所以研究了下這個類,學習的過程中寫了個簡單的Demo,這裡寫出來分析給想要的人呢。實現了 透明的導航欄 螢幕垂直的時候小螢幕/水平大螢幕之前的切換,支援螢幕旋轉觸發,按鍵觸發 重播 播放/暫停 顯示播放進度 隱藏控制圖示,
【Redis詳解基礎篇二(命令)】
這裡寫自定義目錄標題前言操作 前言 操作 寫鍵值對 set key value 獲取鍵值對 get key 切換資料庫 select 15 //預設是有16個數據庫 直接到指定的
【Redis詳解基礎篇三(持久化)】
前言 什麼是持久化 因為redis是存放在記憶體中的,所以我們的資料很可能會丟失。所以得讓他持久化的保留起來就肯定需要硬碟,也就是放到裝置上進行儲存 使用場景 如果你想用redis暫時性的存放一些資料,只是存放之後設定一個超時的時間,那麼你可以不需要redi
Unity開發詳解之新建工程(1/6)
最近學習unity做了一個簡單的FPS遊戲,下面分幾篇講述下使用到的功能。 新建工程 在開啟unity會讓你選擇一個工程開啟,進入程式後,如果我們想建立一個新工程通過 File -->New Project 建立,新開啟的介面經常會出現白板情況,不顯示建立對話方塊
Android開發例項詳解之IMF(輸入法)(Android SDK Sample—SoftKeyboard)
本博前面的文章介紹了開發環境的搭建和模擬器的常用操作。本次,將以Android Sample中經典的SoftKeyboard專案為例,詳細解析Android上一個小型專案的開發過程和注意事項。 從SDK 1.5版本以後,Android就開放它的IMF(
Java的位運算符詳解實例——與(&)、非(~)、或(|)、異或(^)(僅作記錄)
out 位運算符 異或運算 pri stat 運算 data 操作 amp 位運算符主要針對二進制,它包括了:“與”、“非”、“或”、“異或”。從表面上看似乎有點像邏輯運算符,但邏輯運算符是針對兩個關系運算符來進行邏輯運算,而位運算符主要針對兩個二進制數的位進行邏輯運算。下
JavaSE 學習筆記之多態(七)
會有 轉換 容易 per 不同 如何 person 特點 一句話 多 態:函數本身就具備多態性,某一種事物有不同的具體的體現。 體現:父類引用或者接口的引用指向了自己的子類對象。//Animal a = new Cat(); 多態的好處:提高了程序的擴展性。 多態的弊端
【計算機網絡】詳解網絡層(二)ARP和RARP
博文 拆分 detail 動態 再次 tcp 將在 ont 關於 ARP ARP(Address Resolution Protocol,地址解析協議)是將IP地址解析為以太網MAC地址(物理地址)的協議。在局域網中,當主機或其他網絡設備有數據要發送給另一個主機或設備時,它
【CronExpression表達式詳解和案例】(轉載)
強烈 簡單的 exce 初始 每分鐘 第三周 normal orm 以及 原文地址:https://www.cnblogs.com/pipi-changing/p/5697481.html 找了下Cron的資料,這篇作者寫的比較清晰,轉載記錄一下,方便後面使用的時候在g
三:python 對象類型詳解一:數字(上)
結果 dom 運行 精度 升級 方法 函數 般的 代碼 一:python 的數字類型: a)整數和浮點數 b)復數 c)固定精度的十進制數 d)有理分數 e)集合 f)布爾類型 g)無窮的整數精度 h)各種數字內置函數和模塊 二:各種數字類型的詳解 1,數字常量:pyt
pt-query-digest詳解慢查詢日誌(轉)
ttr tool 並發數 目的 dig 文件中 格式 general ember 一、簡介 pt-query-digest是用於分析mysql慢查詢的一個工具,它可以分析binlog、General log、slowlog,也可以通過SHOWPROCESSLIST或者通過t
詳解C#泛型(一)
安全 情況 重用 模板 信息 普通 cast 綁定 封閉式 一、C#中的泛型引入了類型參數的概念,類似於C++中的模板,類型參數可以使類型或方法中的一個或多個類型的指定推遲到實例化或調用時,使用泛型可以更大程度的重用代碼、保護類型安全性並提高性能;可以創建自定義的泛型類
機器學習之主題模型(七)
摘要: 主題模型是對文字隱含主題進行建模的方法。它克服了傳統資訊檢索中文件相似度計算方法的缺點,並且能夠在海量網際網路資料中自動尋找出文字間的語義主題。主題模型在自然語言和基於文字的搜尋上都起到非常大的作用。 引言: 兩篇文件是否相關往往不只決定於字面上的詞語重複,還取決於文字背後的語義關聯。對
例項詳解js閉包(一)閉包基本概念及其作用推導
在學習前端的過程中,不可避免的要學習到js閉包這個知識點,很多朋友感到對閉包很難理解,也不清楚它有什麼用。本文就詳細介紹一下閉包,並通過幾個小例子來說明下閉包的用處。 一、閉包的概念 閉包的英文單詞是Closure,我先給閉包可
Spring Boot Actuator詳解與深入應用(一):Actuator 1.x
《Spring Boot Actuator詳解與深入應用》預計包括三篇,第一篇重點講Spring Boot Actuator 1.x的應用與定製端點;第二篇將會對比Spring Boot Actuator 2.x 與1.x的區別,以及應用和定製2.x的端點;第三篇將會介紹Actuator metric指
Spring Boot Actuator詳解與深入應用(二):Actuator 2.x
《Spring Boot Actuator詳解與深入應用》預計包括三篇,第一篇重點講Spring Boot Actuator 1.x的應用與定製端點;第二篇將會對比Spring Boot Actuator 2.x 與1.x的區別,以及應用和定製2.x的端點;第三篇將會介紹Actuator metric指
淘淘商城系列(二)—— SSM框架整合之表現層(七)
前面我們把服務層的dao層和service層框架整合好了,現在來整合表現層。 建立springmvc.xml檔案 開啟我們的taotao-manager-web表現層工程: 在resources目錄下面新建一個spring資料夾 之後再spring資料夾下面,建立sp
詳解C#泛型(三) 詳解C#泛型(一) 詳解C#泛型(二)
一、前面兩篇文章分別介紹了定義泛型型別、泛型委託、泛型介面以及宣告泛型方法: 詳解C#泛型(一) 詳解C#泛型(二) 首先回顧下如何構建泛型類: public class MyClass<T> { public void MyFunc() {