在ASP.NET MVC中使用Redis


一.Redis基本認知

1.含義: REmote DIctionary Server(Redis) | 是一個key-value存儲系統 
2.特性: 
2.1 持久化:可以將內存中的數據保存在磁盤中,重啟的時候可以再次加載進行使用; 
2.2 支持豐富的數據類型,如:Strings, Lists, Hashes, Sets 及 Ordered Sets ; 
2.3 多個操作支持事務,任意單個操作都是原子性的,即要么成功執行要么失敗完全不執行; 
2.4 豐富的特性:支持發布/訂閱 , 通知 ,Key過期等 
3.常用命令 
3.1 Redis是一種基於客戶端-服務端模型以及請求/響應協議的TCP服務,使用中Redis分為服務端(redis-server)和客戶端(redis-cli); 
客戶端是一個管理控制台,服務端負責redis的具體實現以及處理客戶端的命令並提供服務;服務端啟動時需要配置IP和端口。 
$redis-cli 連接本地Redis服務; 
$ redis-cli -h host -p port -a password 連接遠程Redis服務

3.2 可通過 CONFIG 命令查看或設置配置項: 
CONFIG GET CONFIG_SETTING_NAME 
CONFIG SET CONFIG_SETTING_NAME NEW_CONFIG_VALUE

3.3 Redis支持五種數據類型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。 
String(字符串):基本的類型,是二進制安全的,可以包含任何數據 
SET name “csdn” 
GET name 
Hash(哈希):key->多個filed->多個value。是一個鍵值(key=>value)對集合,是一個string類型的field和value的映射表。 
HMSET myhash field1 “Hello” field2 “World” 
HGET myhash field1 
List(列表):簡單的字符串列表,按照插入順序排序,可以添加一個元素到列表的頭部(左邊 l)或者尾部(右邊 r)。 
lpush csdn “Hello” 
rpush csdn “World” 
lrange csdn 0 2 
Set(集合):string類型的無序集合,不允許重復的成員,通過哈希表實現的,所以添加,刪除,查找的復雜度都是O(1)。 
sadd csdn redis 
smembers csdn 
zset(sorted set:有序集合):是string類型元素的集合,但每個member都會關聯一個double類型的score。redis正是通過分數來為集合中的成員進行從小到大的排序。 
zadd csdn 1 redis 
ZRANGE csdn 0 10 WITHSCORES

HyperLogLog結構:是用來做基數統計的算法,見菜鳥教程HyperLogLog

3.4 Redis的發布/訂閱 
發布訂閱(pub/sub)是一種消息通信模式:發送者(pub)發送消息,訂閱者(sub)接收消息。 
Redis 客戶端可以訂閱任意數量的頻道。 
使用命令:SUBSCRIBE redisChat 訂閱頻道(channel),頻道由Redis服務端進行維護,其余客戶端通過命令:PUBLISH redisChat “Message” 來向redisChat頻道 發布消息。

3.5 事務 
Redis 事務可以一次執行多個命令, 並且帶有以下三個特征: 
a. 批量操作在發送 EXEC 命令前被放入隊列緩存。 
b.收到 EXEC 命令后進入事務執行,事務中任意命令執行失敗,其余的命令依然被執行。也就是Redis的命令執行是原子性的,但 Redis 沒有在事務上增加任何維持原子性的機制。 
c.在事務執行過程,其他客戶端提交的命令請求不會插入到事務執行命令序列中。

一個事務從開始到執行會經歷以下三個階段: 
開始事務。 
命令入隊。 
執行事務。

以命令MULTI開始一個事務,以命令EXEC觸發一個事務。

3.6 Redis 數據備份策略的選擇:完整備份(RDB)和增量備份(AOF) 
轉發自Redis持久化存儲(AOF與RDB兩種模式)

二.在ASP.NET MVC中使用Redis

1.首先把Demo貼出來吧,有積分請移步CSDN下載,然后補充下載是百度雲下載

Demo可以正常運行,但仍有許多不完善的地方,以后想起來再回來修改修改,截圖如下: 
這里寫圖片描述

2.在.NET體系里,可以使用兩個外部的DLL來模擬Redis-client,對Redis-server進行操作:一個是ServiceStack.Redis,另外一個是StackExchange.Redis。這兩個包都可以在Nuget中搜索到。 
Demo中使用的是StackExchange.Redis。它的參考文檔點這兒

示例代碼如下:

private void test1() { //step-1: 設置Redis鏈接 ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost"); //ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("server1:6379,server2:6379"); string config = redis.Configuration; //step-2: Accessing a redis database 連接到Redis數據庫 IDatabase db = redis.GetDatabase(); //step-3: 通過db使用Redis API (http://redis.io/commands) db.StringSet("mykey", "myvalue",new TimeSpan(0,10,0),When.Always,CommandFlags.None); string value = string.Empty; if (db.KeyExists("mykey")) { value = db.StringGet("mykey"); } } private void test2() { //step-1: 設置Redis鏈接 ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost"); //step-2: 創建連接到特定服務的 PUB/SUB 連接 ISubscriber sub = redis.GetSubscriber(); //step-3: 訂閱頻道,並處於監聽狀態,接受消息並處理 string result = string.Empty; sub.Subscribe("messages", (channel, message) =>{ result = string.Format("Channel:{0} ; Message:{1} .", channel.ToString(), message); }); } private void test3() { //step-1: 設置Redis鏈接 ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost"); //step-2: 創建連接到特定服務的 PUB/SUB 連接 ISubscriber sub = redis.GetSubscriber(); //step-3: 在另一個進程或是機器上,發布消息 sub.Publish("messages", "hello"); }

詳情可以看Demo里面的RedisHelper。

三.Redis更新策略探究

1.單台服務器下如何保持與數據庫的數據一致 
2.多台服務器下如何使用分布式緩存

哈哈 這一部分還沒怎么實際操作過,所以留待以后有了實操經驗了再來更新。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM