一.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.多台服務器下如何使用分布式緩存
哈哈 這一部分還沒怎么實際操作過,所以留待以后有了實操經驗了再來更新。