1. 程式人生 > >C# StackExchange.Redis 用法總結

C# StackExchange.Redis 用法總結

安裝 StackExchange.Redis

在 NuGet 中搜索 StackExchange.Redis 和 Newtonsoft.Json,直接點選按鈕安裝即可。

StackExchange.Redis 是 C# 操作 Redis 資料庫的客戶端。

Newtonsoft.Json 用來序列化 Josn 字串及反序列化拿到物件。

引用及初始化

引用

using StackExchange.Redis;
using Newtonsoft.Json;

初始化 redis

ConnectionMultiplexer _conn = RedisConnectionHelp.Instance;//
初始化 var database = _conn.GetDatabase(0);//指定連線的庫 0

String(字串)

String 是最常用的一種資料型別,普通的 key/value 儲存都可以歸為此類 。

一個 Key 對應一個 Value,string 型別是二進位制安全的。Redis 的 string 可以包含任何資料,比如 jpg 圖片(生成二進位制)或者序列化的物件。

database.StringSet("name", "");//設定StringSet(key, value)
string str = database.StringGet("name");//結果:蒼
database.StringSet("name_two
", str, TimeSpan.FromSeconds(10));//設定時間,10s後過期。

存物件(物件需要序列化轉成字串,再存進庫中)

取物件(反序列化)

//建立對
Demo demo = new Demo()
{
    Name = "",
    Age = 18,
    Height = 1.83
};
string demojson = JsonConvert.SerializeObject(demo);//序列化
database.StringSet("model", demojson);

string model = database.StringGet("
model"); demo = JsonConvert.DeserializeObject<Demo>(model);//反序列化

StringIncrement 增量、StringDecrement 減量(預設值同為1)

double increment = 0;
double decrement = 0;
for (int i = 0; i < 3; i++)
{
    increment = database.StringIncrement("StringIncrement", 2);//增量,每次+2
}
for (int i = 0; i < 3; i++)
{
    decrement = database.StringDecrement("StringIncrement");//減量,每次-1
}

List(列表)

Redis 列表是簡單的字串列表,按照插入順序排序。你可以新增一個元素到列表的頭部或者尾部。

一個列表最多可以包含 232 - 1 個元素 (4294967295, 每個列表超過 40 億個元素)。

for (int i = 0; i < 10; i++)
{
    database.ListRightPush("list", i);//從底部插入資料
}
for (int i = 10; i < 20; i++)
{
    database.ListLeftPush("list", i);//從頂部插入資料
}
var length = database.ListLength("list");//長度 20

var rightPop = database.ListRightPop("list");//從底部拿出資料var leftpop = database.ListLeftPop("list");//從頂部拿出資料var list = database.ListRange("list");

Hash(雜湊)

Redis hash 是一個 string 型別的 field 和 value 的對映表,hash 特別適合用於儲存物件。相對於將物件的每個欄位存成單個 string 型別。一個物件儲存在 hash 型別中會佔用更少的記憶體,並且可以更方便的存取整個物件。

Redis 中每個 hash 可以儲存 232 - 1 鍵值對(40多億)。

Hash 的儲存,給我的感覺類似於關係型資料庫。以下面的例子為例,儲存一個 user 物件(關係型資料庫裡的表名), cang、shan、yun (關係型資料庫裡的資料的主鍵、唯一值),json(欄位

string json = JsonConvert.SerializeObject(demo);//序列化
database.HashSet("user", "cang", json);
database.HashSet("user", "shan", json);
database.HashSet("user", "yun", json);

//獲取Model
string hashcang = database.HashGet("user", "cang"); demo = JsonConvert.DeserializeObject<Demo>(hashcang);//反序列化 //獲取List RedisValue[] values = database.HashValues("user");//獲取所有value IList<Demo> demolist = new List<Demo>(); foreach (var item in values) { Demo hashmodel = JsonConvert.DeserializeObject<Demo>(item); demolist.Add(hashmodel); }

釋出訂閱

Redis 釋出訂閱 (pub/sub) 是一種訊息通訊模式,可以用於訊息的傳輸,Redis 的釋出訂閱機制包括三個部分,釋出者,訂閱者和 Channel。適宜做線上聊天、訊息推送等。

釋出者和訂閱者都是 Redis 客戶端,Channel 則為 Redis 伺服器端,釋出者將訊息傳送到某個的頻道,訂閱了這個頻道的訂閱者就能接收到這條訊息,客戶端可以訂閱任意數量的頻道。

ISubscriber sub = _conn.GetSubscriber();

//訂閱 Channel1 頻道
sub.Subscribe("Channel1", new Action<RedisChannel, RedisValue>((channel, message) =>
{
    Console.WriteLine("Channel1" + " 訂閱收到訊息:" + message);
}));

for (int i = 0; i < 10; i++)
{
    sub.Publish("Channel1", "msg" + i);//向頻道 Channel1 傳送資訊
    if (i == 2)
    {
        sub.Unsubscribe("Channel1");//取消訂閱
    }
}

因為當 i == 2 的時候取消訂閱,所以收到的訂閱訊息只有3條。

事務

事物開啟後,會在呼叫 Execute 方法時把相應的命令操作封裝成一個請求傳送給 Redis 一起執行。

這裡通過 CreateTransaction 函式(multi)來建立一個事物,呼叫其 Execute 函式(exec)提交事物。

其中的 "Condition.StringEqual("name", name)" 就相當於 Redis 命令中的 watch name。

string name = database.StringGet("name");
string age = database.StringGet("age");
var tran = database.CreateTransaction();//建立事物
tran.AddCondition(Condition.StringEqual("name", name));//樂觀鎖
tran.StringSetAsync("name", "海");
tran.StringSetAsync("age", 25);
database.StringSet("name", "Cang");//此時更改 name 值,提交事物的時候會失敗。
bool committed = tran.Execute();//提交事物,true成功,false回滾。

因為提交事物的過程中,name 值被修改,所以造成了回滾,所有給 name 賦值海,age 賦值25都失敗了。

Batch 批量操作

batch 會把所需要執行的命令打包成一條請求發到 Redis,然後一起等待返回結果。減少網路開銷。

var batch = database.CreateBatch();

//批量寫
Task t1 = batch.StringSetAsync("name", "");
Task t2 = batch.StringSetAsync("age", 22);
batch.Execute();
Task.WaitAll(t1, t2);
Console.WriteLine("Age:" + database.StringGet("age"));
Console.WriteLine("Name:" + database.StringGet("name"));
            
//批量寫
for (int i = 0; i < 100000; i++)
{
    batch.StringSetAsync("age" + i, i);
}
batch.Execute();

//批量讀
List<Task<RedisValue>> valueList = new List<Task<RedisValue>>();
for (int i = 0; i < 10000; i++)
{
    Task<RedisValue> tres = batch.StringGetAsync("age" + i);
    valueList.Add(tres);
}
batch.Execute();
foreach (var redisValue in valueList)
{
string value = redisValue.Result;//取出對應的value值
}

Lock(分散式鎖)

由於 Redis 是單執行緒模型,命令操作原子性,所以利用這個特性可以很容易的實現分散式鎖。

RedisValue token = Environment.MachineName;
//lock_key表示的是redis資料庫中該鎖的名稱,不可重複。 
//token用來標識誰擁有該鎖並用來釋放鎖。
//TimeSpan表示該鎖的有效時間。10秒後自動釋放,避免死鎖。
if (database.LockTake("lock_key", token, TimeSpan.FromSeconds(10))) { try { //TODO:開始做你需要的事情 Thread.Sleep(5000); } finally { database.LockRelease("lock_key", token);//釋放鎖 } }

StackExchange.Redis 封裝

裡面是封裝及測試程式碼

環境:vs2013 + .NET framework 4.5

相關推薦

C# StackExchange.Redis 用法總結

安裝 StackExchange.Redis 在 NuGet 中搜索 StackExchange.Redis 和 Newtonsoft.Json,直接點選按鈕安裝即可。 StackExchange.Redis 是 C# 操作 Redis 資料庫的客戶端。 Newtonsoft.Json 用來序列化 Jo

c/c++中const用法總結

沒有 pan 分配 值類型 變量初始化 _id 多少 部分 參數 1、修飾常量時:   const int temp1; //temp1為常量,不可變   int const temp2; //temp2為常量,不可變 2、修飾指針時:   主要看const在*的前後,

C/C++:static用法總結

.sh pre 值類型 定義和使用 靜態 public out pan -1 前言:static是C/C++中一個很重要的關鍵字,最近閱讀了很多博客和資料,遂在此對自己的學習筆記進行簡單的總結並發表在這裏 一、C語言中的static ? 靜態全局變量:在全局變量之前加

C# StackExchange.Redis 簡單使用

span 關系型數據庫 try lis 利用 info 聊天 ron 訂閱者 安裝 StackExchange.Redis 在 NuGet 中搜索 StackExchange.Redis 和 Newtonsoft.Json,直接點擊按鈕安裝即可。 StackExchan

C++中STL用法總結【轉】

(轉自:https://blog.csdn.net/piaoxuezhong/article/details/54348787?utm_source=blogxgwz8) 1.1 什麼是STL? STL(Standard Template Library),即標準模板庫,是一個具有工業強度的

C/C++ assert()函式用法總結

轉自:https://www.cnblogs.com/lvchaoshun/p/7816288.html   assert巨集的原型定義在<assert.h>中,其作用是如果它的條件返回錯誤,則終止程式執行。 原型定義: #include <assert.

C++ vector常見用法總結

此文為個人學習備份,點選這裡訪問原文。 vector是一個動態的序列容器,相當於一個size可變的陣列。     相比於陣列,vector會消耗更多的記憶體以有效的動態增長。而相比於其他動態序列容器(deques, lists and forward_lists

C++中CONST用法總結

1、修飾常量時: ? 1 2 const int temp1; //temp1為常量,不可變 int const temp2; //temp2為常量,不可變 2、修飾指標時:   主要看const在*的前後,

c語言const用法總結

這裡講的是c中的const不是cpp中的 int const a 等價於 int const b char * const p 表示指標變數p中的地址不可被修改 const char *p  表示指標p指向的記憶體空間不可被修改 const chat * co

C++中STL用法總結

函式庫對資料型別的選擇對其可重用性起著至關重要的作用。舉例來說,一個求方根的函式,在使用浮點數作為其引數型別的情況下的可重用性肯定比使用整型作為它的引數類性要高。而C++通過模板的機制允許推遲對某些型別的選擇,直到真正想使用模板或者說對模板進行特化的時候,STL就利用了這一點提供了相當多的有用演算法。它是在一

【轉】C++中static用法總結

地址:https://www.cnblogs.com/qiaoconglovelife/p/5323086.html 1.用於區域性變數 C++中區域性變數有三種: (1)auto:此關鍵詞常常省略。auto type a 常常簡寫為type a。 如:int a=auto int

C++模板template用法總結

引言 模板(Template)指C++程式設計設計語言中採用型別作為引數的程式設計,支援通用程式設計。C++ 的標準庫提供許多有用的函式大多結合了模板的觀念,如STL以及IO Stream。 函式模板 在c++入門中,很多人會接觸swap(int&, int

c/c++中static用法總結

static的作用主要有兩種: 第一個作用是限定作用域;第二個作用是保持變數內容持久化; c語言中static的用法: 1、全域性靜態變數:   用法:在全域性變數前加上關鍵字static,全域性變數就定義成一個全域性靜態變數。 static int temp;   記憶體中的位置:靜態儲存區,在整個程式執行

C++ vector的用法總結

vector是可變長度的陣列,需要標頭檔案#include<vector> 1. 初始化 // 建構函式 vector<int> abc(10); //10個0 vector<int> def(10,1); //10個1 // 陣列地

c++中__declspec用法總結

“__declspec”是Microsoft c++中專用的關鍵字,它配合著一些屬性可以對標準C++進行擴充。這些屬性有:align、allocate、deprecated、 dllexport、dllimport、 naked、noinline、noreturn、nothr

功能比較全的StackExchange.Redis封裝幫助類(.Net/C#)

fault wke setting ret stack gin lex sortedset each Redis官網https://redis.io/ 以下內容未全部驗證,如有問題請指出 //static NewtonsoftSerializer serializer

C數據結構排序算法——直接插入排序法用法總結(轉http://blog.csdn.net/lg1259156776/)

所有 可能 app 必須 操作 itl 直接排序 works 技術分享 聲明:引用請註明出處http://blog.csdn.net/lg1259156776/ 排序相關的的基本概念 排序:將一組雜亂無章的數據按一定的規律順次排列起來。 數據表( data list)

C數據結構排序算法——希爾排序法用法總結(轉http://www.cnblogs.com/skywang12345/p/3597597.html)

spa 一半 pub nbsp 時間復雜度 每一個 ati 數組長度 插入排序算法 希爾排序介紹 希爾排序(Shell Sort)是插入排序的一種,它是針對直接插入排序算法的改進。該方法又稱縮小增量排序,因DL.Shell於1959年提出而得名。 希爾排序實質上是一種分組插

標準C++中的string類的用法總結

也有 www. empty capacity 技術 第一個 stream 一次 jpg 相信使用過MFC編程的朋友對CString這個類的印象應該非常深刻吧?的確,MFC中的CString類使用起來真的非常的方便好用。但是如果離開了MFC框架,還有沒有這樣使用起來非常方便

標準C++中的string類的用法總結(轉)

spa 大小 它的 world 包括 文本 語法 ner append() 轉自:http://www.cnblogs.com/xFreedom/archive/2011/05/16/2048037.html 相信使用過MFC編程的朋友對CString這個類的印象應該