.net core redis的全套操作

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)

 

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章