亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C#?StackExchange.Redis?用法匯總

 更新時間:2021年12月01日 11:12:02   作者:蒼  
StackExchange.Redis?是?C#?操作?Redis?數(shù)據(jù)庫的客戶端,本文通過圖文并茂的形式給大家介紹C#?StackExchange.Redis?用法匯總,感興趣的朋友一起看看吧

安裝StackExchange.Redis

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

StackExchange.Redis 是 C# 操作 Redis 數(shù)據(jù)庫的客戶端。

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

引用及初始化

引用

using StackExchange.Redis;
using Newtonsoft.Json;

初始化 redis

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

String(字符串)

String 是最常用的一種數(shù)據(jù)類型,普通的 key/value 存儲都可以歸為此類。

一個 Key 對應(yīng)一個 Value,string 類型是二進制安全的。Redis 的 string 可以包含任何數(shù)據(jù),比如 jpg 圖片(生成二進制)或者序列化的對象。

database.StringSet("name", "蒼");//設(shè)置StringSet(key, value)
string str = database.StringGet("name");//結(jié)果:蒼
database.StringSet("name_two", str, TimeSpan.FromSeconds(10));//設(shè)置時間,10s后過期。

存對象(對象需要序列化轉(zhuǎn)成字符串,再存進庫中)

取對象(反序列化)

//創(chuàng)建對象
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 減量(默認(rèn)值同為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);//從底部插入數(shù)據(jù)
}
for (int i = 10; i < 20; i++)
{
    database.ListLeftPush("list", i);//從頂部插入數(shù)據(jù)
}
var length = database.ListLength("list");//長度 20

var rightPop = database.ListRightPop("list");//從底部拿出數(shù)據(jù)var leftpop = database.ListLeftPop("list");//從頂部拿出數(shù)據(jù)var list = database.ListRange("list");

Hash(哈希)

Redis hash 是一個 string 類型的 field 和 value 的映射表,hash 特別適合用于存儲對象。相對于將對象的每個字段存成單個 string類型。一個對象存儲在 hash 類型中會占用更少的內(nèi)存,并且可以更方便的存取整個對象。

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

Hash 的存儲,給我的感覺類似于關(guān)系型數(shù)據(jù)庫。以下面的例子為例,存儲一個 user 對象(關(guān)系型數(shù)據(jù)庫里的表名), cang、shan、yun (關(guān)系型數(shù)據(jù)庫里的數(shù)據(jù)的主鍵、唯一值),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);
}

發(fā)布訂閱

Redis 發(fā)布訂閱 (pub/sub) 是一種消息通信模式,可以用于消息的傳輸,Redis 的發(fā)布訂閱機制包括三個部分,發(fā)布者,訂閱者和 Channel。適宜做在線聊天、消息推送等。

發(fā)布者和訂閱者都是 Redis 客戶端,Channel 則為 Redis 服務(wù)器端,發(fā)布者將消息發(fā)送到某個的頻道,訂閱了這個頻道的訂閱者就能接收到這條消息,客戶端可以訂閱任意數(shù)量的頻道。

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 發(fā)送信息
    if (i == 2)
    {
        sub.Unsubscribe("Channel1");//取消訂閱
    }
}

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

事務(wù)

事物開啟后,會在調(diào)用 Execute 方法時把相應(yīng)的命令操作封裝成一個請求發(fā)送給 Redis 一起執(zhí)行。

這里通過 CreateTransaction 函數(shù)(multi)來創(chuàng)建一個事物,調(diào)用其 Execute 函數(shù)(exec)提交事物。

其中的 "Condition.StringEqual("name", name)" 就相當(dāng)于 Redis 命令中的 watch name。

string name = database.StringGet("name");
string age = database.StringGet("age");
var tran = database.CreateTransaction();//創(chuàng)建事物
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 會把所需要執(zhí)行的命令打包成一條請求發(fā)到 Redis,然后一起等待返回結(jié)果。減少網(wǎng)絡(luò)開銷。

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;//取出對應(yīng)的value值
}

Lock(分布式鎖)

由于 Redis 是單線程模型,命令操作原子性,所以利用這個特性可以很容易的實現(xiàn)分布式鎖。

RedisValue token = Environment.MachineName;
//lock_key表示的是redis數(shù)據(jù)庫中該鎖的名稱,不可重復(fù)。 //token用來標(biāo)識誰擁有該鎖并用來釋放鎖。//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/17Yh2L_57SJfOvo8Vxj504w 提取碼: tcw3

環(huán)境:vs2013 +.NET framework 4.5

相關(guān)文章:

Redis Windows版下載與安裝

Redis 可視化工具 Redis Desktop Manager

Redis 主從配置(Windows版)

到此這篇關(guān)于C# StackExchange.Redis 用法總結(jié)的文章就介紹到這了,更多相關(guān)C# StackExchange.Redis 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C# dataset存放多張表的實例

    C# dataset存放多張表的實例

    這篇文章主要介紹了C# dataset存放多張表的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • C# WPF中實現(xiàn)圖表生成的五種方式

    C# WPF中實現(xiàn)圖表生成的五種方式

    在現(xiàn)代應(yīng)用程序中,數(shù)據(jù)可視化是一個重要的功能,它可以幫助用戶更直觀地理解數(shù)據(jù),在C# WPF中,有多種方式可以生成圖表,以下是五種常見的方法,每種方法都有其獨特的優(yōu)勢和局限,感興趣的小伙伴跟著小編一起來看看吧
    2024-09-09
  • C#繪制鼠標(biāo)指針的示例代碼

    C#繪制鼠標(biāo)指針的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用C#實現(xiàn)將鼠標(biāo)的指針樣式給繪制成圖片,顯示或者保存下來,文中的示例代碼講解詳細(xì),需要的可以參考一下
    2024-01-01
  • SMTP客戶端未通過身份驗證等多種錯誤解決方案分享

    SMTP客戶端未通過身份驗證等多種錯誤解決方案分享

    這篇文章主要介紹了SMTP服務(wù)器要求安全連接或客戶端未通過身份驗證的多種解決方案,感興趣的小伙伴們可以參考一下
    2016-05-05
  • C#正則表達式獲取下拉菜單(select)的相關(guān)屬性值

    C#正則表達式獲取下拉菜單(select)的相關(guān)屬性值

    這篇文章主要介紹了C#正則表達式獲取下拉菜單(select)的相關(guān)屬性值,比如可以獲得name屬性的值、value值、指定值,需要的朋友可以參考下
    2014-07-07
  • C# WinForm窗口最小化到系統(tǒng)托盤

    C# WinForm窗口最小化到系統(tǒng)托盤

    C#編寫最小化時隱藏為任務(wù)欄圖標(biāo)的 Window appllication.
    2008-11-11
  • C#類中方法的執(zhí)行順序是什么

    C#類中方法的執(zhí)行順序是什么

    有些中級開發(fā)小伙伴還是搞不太明白在繼承父類以及不同場景實例化的情況下,父類和子類的各種方法的執(zhí)行順序到底是什么,本文就來介紹一下
    2021-05-05
  • C# Winform實現(xiàn)自定義分頁控件

    C# Winform實現(xiàn)自定義分頁控件

    一些第三方的分頁控件要么就是界面不夠美觀大方,要么就是使用起來感覺很麻煩,所以本文就為大家介紹一下如何利用Winform自定義分頁控件,需要的可以參考一下
    2023-07-07
  • C# 根據(jù)字符串生成二維碼的實例代碼

    C# 根據(jù)字符串生成二維碼的實例代碼

    這篇文章主要介紹了C# 根據(jù)字符串生成二維碼的實例,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • 3種方法實現(xiàn)WindowsForm切換窗口

    3種方法實現(xiàn)WindowsForm切換窗口

    這篇文章主要介紹了3種方法實現(xiàn)WindowsForm切換窗口,文中講解非常詳細(xì),示例代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07

最新評論