.net core redis的全套操作

  • 2019 年 10 月 3 日
  • 筆記

Redis支持五種數據類型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。

Redis支持主從同步。數據可以從主服務器向任意數量的從服務器上同步,從服務器可以是關聯其他從服務器的主服務器。這使得Redis可執行單層樹複製。存盤可以有意無意的對數據進行寫操作。

目錄

一、在centos7上安裝redis

二、redis string類型

三、redis list 類型

四、redis hash類型

五、redis sortedset類型

六、redis Subscribe 與 Publish

七、redis數據遷移

 

準備條件

  1. 準備redis的安裝源

  2. 準備nuget包:StackExchange.Redis

實戰之路

一、在centos7上安裝redis

下載最新Remi的軟件源

yum install -y http://rpms.famillecollet.com/enterprise/remi-release-7.rpm  

安裝redis

yum --enablerepo=remi install redis  

啟動redis

systemctl start redis  

設置redis開機啟動

systemctl enable redis  

 

二、redis string類型

1、string 是 redis 最基本的類型,你可以理解成與 Memcached 一模一樣的類型,一個 key 對應一個 value。

string 類型是二進制安全的。意思是 redis 的 string 可以包含任何數據。比如jpg圖片或者序列化的對象。

string 類型是 Redis 最基本的數據類型,string 類型的值最大能存儲 512MB。 


以下是對String類型的所有操作方法。

原碼地址:https://github.com/hailang2ll/DMS/blob/master/src/DMS.Core/DMS.Redis/RedisManager.cs

 

2、在.netcore 中的調用。

var flag = redisManager.StringSet("dylan", "公眾號為:sharecore");v  ar value = redisManager.StringGet("dylan");Console.WriteLine($"獲取緩存值為:{value}");

 

三、redis list 類型

1、Redis 列表是簡單的字符串列表,按照插入順序排序。你可以添加一個元素到列表的頭部(左邊)或者尾部(右邊)。

 

個人認為list是非常好用的一個類型,我們可以把Redis的list當成消息隊列使用,比如向註冊用戶發送歡迎郵件的工作,可以在註冊的流程中把要發送郵件的郵箱放到list中,另一個程序從list中pop獲取郵件來發送。生產者、消費者模式。把生產過程和消費過程隔離。

 

 

 

List類型的所有操作方法。

#region List#region 同步方法/// <summary>          /// 移除指定ListId的內部List的值          /// </summary>          /// <param name="key"></param>          /// <param name="value"></param>          public void ListRemove<T>(string key, T value)          {              key = AddSysCustomKey(key);              Do(db => db.ListRemove(key, ConvertJson(value)));          }  ​          /// <summary>          /// 獲取指定key的List          /// </summary>          /// <param name="key"></param>          /// <returns></returns>          public List<T> ListRange<T>(string key)          {              key = AddSysCustomKey(key);              return Do(redis =>              {                  var values = redis.ListRange(key);                  return ConvetList<T>(values);              });          }  ​          /// <summary>          /// 入隊          /// </summary>          /// <param name="key"></param>          /// <param name="value"></param>          public void ListRightPush<T>(string key, T value)          {              key = AddSysCustomKey(key);              Do(db => db.ListRightPush(key, ConvertJson(value)));          }  ​          /// <summary>          /// 出隊          /// </summary>          /// <typeparam name="T"></typeparam>          /// <param name="key"></param>          /// <returns></returns>          public T ListRightPop<T>(string key)          {              key = AddSysCustomKey(key);              return Do(db =>              {                  var value = db.ListRightPop(key);                  return ConvertObj<T>(value);              });          }  ​          /// <summary>          /// 入棧          /// </summary>          /// <typeparam name="T"></typeparam>          /// <param name="key"></param>          /// <param name="value"></param>          public void ListLeftPush<T>(string key, T value)          {              key = AddSysCustomKey(key);              Do(db => db.ListLeftPush(key, ConvertJson(value)));          }  ​          /// <summary>          /// 出棧          /// </summary>          /// <typeparam name="T"></typeparam>          /// <param name="key"></param>          /// <returns></returns>          public T ListLeftPop<T>(string key)          {              key = AddSysCustomKey(key);              return Do(db =>              {                  var value = db.ListLeftPop(key);                  return ConvertObj<T>(value);              });          }  ​          /// <summary>          /// 獲取集合中的數量          /// </summary>          /// <param name="key"></param>          /// <returns></returns>          public long ListLength(string key)          {              key = AddSysCustomKey(key);              return Do(redis => redis.ListLength(key));          }  ​          #endregion 同步方法#region 異步方法          直接複製同步的方法,在方法外後面加上Async即可          #endregion 異步方法#endregion List

 

2、在.netcore 中的調用。

入隊:

redisManager.ListRightPush("dylan", "sharecore我是入隊的");//入隊
long len = redisManager.ListLength("dylan");
//隊列長度
string b = redisManager.ListRightPop<string>("dylan");
//出隊

出隊:

redisManager.ListLeftPush("dylan", "sharecore我是入棧的");//入棧
long len = redisManager.ListLength("dylan");
//隊列長度
string b = redisManager.ListLeftPop<string>("key123");
//出棧

 

四、redis hash類型

1、Redis hash 是一個鍵值(key=>value)對集合。

Redis hash 是一個 string 類型的 field 和 value 的映射表,hash 特別適合用於存儲對象。

 

以下是對Hash類型的所有操作方法。

#region Hash#region 同步方法/// <summary>          /// 判斷某個數據是否已經被緩存          /// </summary>          /// <param name="key"></param>          /// <param name="dataKey"></param>          /// <returns></returns>          public bool HashExists(string key, string dataKey)          {              key = AddSysCustomKey(key);              return Do(db => db.HashExists(key, dataKey));          }  ​          /// <summary>          /// 存儲數據到hash表          /// </summary>          /// <typeparam name="T"></typeparam>          /// <param name="key"></param>          /// <param name="dataKey"></param>          /// <param name="t"></param>          /// <returns></returns>          public bool HashSet<T>(string key, string dataKey, T t)          {              key = AddSysCustomKey(key);              return Do(db =>              {                  string json = ConvertJson(t);                  return db.HashSet(key, dataKey, json);              });          }  ​          /// <summary>          /// 移除hash中的某值          /// </summary>          /// <param name="key"></param>          /// <param name="dataKey"></param>          /// <returns></returns>          public bool HashDelete(string key, string dataKey)          {              key = AddSysCustomKey(key);              return Do(db => db.HashDelete(key, dataKey));          }  ​          /// <summary>          /// 移除hash中的多個值          /// </summary>          /// <param name="key"></param>          /// <param name="dataKeys"></param>          /// <returns></returns>          public long HashDelete(string key, List<RedisValue> dataKeys)          {              key = AddSysCustomKey(key);              //List<RedisValue> dataKeys1 = new List<RedisValue>() {"1","2"};              return Do(db => db.HashDelete(key, dataKeys.ToArray()));          }  ​          /// <summary>          /// 從hash表獲取數據          /// </summary>          /// <typeparam name="T"></typeparam>          /// <param name="key"></param>          /// <param name="dataKey"></param>          /// <returns></returns>          public T HashGet<T>(string key, string dataKey)          {              key = AddSysCustomKey(key);              return Do(db =>              {                  string value = db.HashGet(key, dataKey);                  return ConvertObj<T>(value);              });          }  ​          /// <summary>          /// 為數字增長val          /// </summary>          /// <param name="key"></param>          /// <param name="dataKey"></param>          /// <param name="val">可以為負</param>          /// <returns>增長後的值</returns>          public double HashIncrement(string key, string dataKey, double val = 1)          {              key = AddSysCustomKey(key);              return Do(db => db.HashIncrement(key, dataKey, val));          }  ​          /// <summary>          /// 為數字減少val          /// </summary>          /// <param name="key"></param>          /// <param name="dataKey"></param>          /// <param name="val">可以為負</param>          /// <returns>減少後的值</returns>          public double HashDecrement(string key, string dataKey, double val = 1)          {              key = AddSysCustomKey(key);              return Do(db => db.HashDecrement(key, dataKey, val));          }  ​          /// <summary>          /// 獲取hashkey所有Redis key          /// </summary>          /// <typeparam name="T"></typeparam>          /// <param name="key"></param>          /// <returns></returns>          public List<T> HashKeys<T>(string key)          {              key = AddSysCustomKey(key);              return Do(db =>              {                  RedisValue[] values = db.HashKeys(key);                  return ConvetList<T>(values);              });          }  ​          /// <summary>          ///          /// </summary>          /// <typeparam name="T"></typeparam>          /// <param name="key"></param>          /// <returns></returns>          public List<T> HashValues<T>(string key)          {              var result = new List<T>();              key = AddSysCustomKey(key);              return Do(db =>              {                  HashEntry[] arr = db.HashGetAll(key);                  foreach (var item in arr)                  {                      if (!item.Value.IsNullOrEmpty)                      {                          result.Add(JsonConvert.DeserializeObject<T>(item.Value));                      }                  }                  return result;              });          }  ​          #endregion 同步方法#region 異步方法          直接複製同步的方法,在方法外後面加上Async即可          #endregion 異步方法#endregion Hash

 

2、在.netcore 中的調用。

var data = new  {      name = "dylan",      code = "sharecore",  };  bool flag = redisManager.HashExists("dylan", "key1");  if (!flag)  {      redisManager.HashSet<object>("dylan", "key1", data);      redisManager.HashSet<object>("dylan", "key2", data);  }  var value = redisManager.HashValues<QueueValue>("dylan");

 

五、redis sorted類型

1、Redis  zset 和 set 一樣也是string類型元素的集合,且不允許重複的成員。

不同的是每個元素都會關聯一個double類型的分數。redis正是通過分數來為集合中的成員進行從小到大的排序。

zset的成員是唯一的,但分數(score)卻可以重複。

 

以下是對SortedSet類型的所有操作方法。

原碼地址:https://github.com/hailang2ll/DMS/blob/master/src/DMS.Core/DMS.Redis/RedisManager.cs

 

2、在.netcore中的調用

var data = new  {      name = "dylan",      code = "sharecore",  };  redisManager.SortedSetAdd("dylan", data, 1.0);//添加  redisManager.SortedSetRemove("dylan",data);//刪除  redisManager.SortedSetRangeByRank<QueueValue>("dylan");//獲取全部  redisManager.SortedSetLength("dylan");//獲取數量

 

六、redis Subscribe 與 Publish

1、Redis 發佈訂閱(pub/sub)是一種消息通信模式:發送者(pub)發送消息,訂閱者(sub)接收消息。
Redis 客戶端可以訂閱任意數量的通道。

 

以下是對Subscribe 與 Publish類型的所有操作方法。

#region 發佈訂閱/// <summary>          /// Redis發佈訂閱  訂閱          /// </summary>          /// <param name="subChannel"></param>          /// <param name="handler"></param>          public void Subscribe(string subChannel, Action<RedisChannel, RedisValue> handler = null)          {              ISubscriber sub = _conn.GetSubscriber();              sub.Subscribe(subChannel, (channel, message) =>              {                  if (handler == null)                  {                      Console.WriteLine(subChannel + " 訂閱收到消息:" + message);                  }                  else                  {                      handler(channel, message);                  }              });          }  ​          /// <summary>          /// Redis發佈訂閱  發佈          /// </summary>          /// <typeparam name="T"></typeparam>          /// <param name="channel"></param>          /// <param name="msg"></param>          /// <returns></returns>          public long Publish<T>(string channel, T msg)          {              ISubscriber sub = _conn.GetSubscriber();              return sub.Publish(channel, ConvertJson(msg));          }  ​          /// <summary>          /// Redis發佈訂閱  取消訂閱          /// </summary>          /// <param name="channel"></param>          public void Unsubscribe(string channel)          {              ISubscriber sub = _conn.GetSubscriber();              sub.Unsubscribe(channel);          }  ​          /// <summary>          /// Redis發佈訂閱  取消全部訂閱          /// </summary>          public void UnsubscribeAll()          {              ISubscriber sub = _conn.GetSubscriber();              sub.UnsubscribeAll();          }  ​          #endregion 發佈訂閱

 

2、在.netcore中的調用

訂閱:

redisManager.Subscribe("dylan", (channel, value) =>  {      Console.WriteLine(channel.ToString() + ":" + value.ToString());  });

發佈:

var data = new  {      name= "dylan",      code = "sharecore"  };  redisManager.Publish("dylan", data);

 

註:如果在是控制台要一直在運行中。

六、redis 數據遷移

1.默認redis數據存放在/var/lib/redis

 

1.保存redis最新數據

[root@localhost ~]# redis-cli127.0.0.1:6379 > save 127.0.0.1:6379 > quit #退出

3.將dump.rdb傳入到新服務器目錄/var/lib/redis,重命名為dump.rdb.back

接着進入目錄,運行ll命令查看該目錄下有一個dump.rdb文件,該文件就是redis數據備份文件:

[root@localhost ~]# cd /var/lib/redis[root@localhost redis]# ll

將dump.rdb文件保存,傳到新服務器/var/lib/redis目錄,重命名為dump.rdb.back。(可以使用FTP)

 

新服務器

連新服務器,進入到redis數據備份存放的目錄:

[root@localhost ~]# cd /var/lib/redis[root@localhost redis]# ll

可以看到此時目錄下有一個dump.rdb.back文件,先進入redis命令行模式,關閉redis:

[root@localhost ~]# redis-cli127.0.0.1:6379 > shutdown #關閉127.0.0.1:6379 > quit #退出

接着把dump.rdb.back 複製為dump.rdb:

[root@localhost redis]# cp dump.rdb.back dump.rdb

3、重啟新服務器redis服務,完成

[root@localhost redis]# systemctl restart redis

 

總結

Memcached只能當緩存服務器用,也是最合適的;Redis不僅可以做緩存服務器(性能沒有Memcached好),還可以存儲業務複雜數據。

 

公眾號:架構師實戰營(sharecore)

QQ:.NET Core 技術交流(18362376)

 

歡迎在文章下方留言與我討論,感謝您的閱讀