C# StackExchange.Redis 用法總結

原文: C# StackExchange.Redis 用法總結

安裝 StackExchange.Redis

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

StackExchange.Redis 是 C# 操做 Redis 數據庫的客戶端。數據庫

Newtonsoft.Json 用來序列化 Josn 字符串及反序列化拿到對象。json

引用及初始化

引用安全

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後過時。

存對象(對象須要序列化轉成字符串,再存進庫中)ide

取對象(反序列化)函數

複製代碼
//建立對
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 封裝

裏面是封裝及測試代碼

連接: https://pan.baidu.com/s/1rT9z567MVtfzQtnvdUxffw 密碼: 5k1b

環境:vs2013 + .NET framework 4.5


相關文章:Redis Windows版下載與安裝

              Redis 可視化工具 Redis Desktop Manager

              Redis 主從配置(Windows版)

相關文章
相關標籤/搜索